Как да се чете \ напишете данни чрез асинхронни CLK?

X

xtcx

Guest
Здравейте приятели!, имам един въпрос, по който ми кодек изпраща и получава данни на 2MHz sclk (кодекс вътрешни) clk.It действа като капитана и оттам sclk (в) 2MHz не е контролирани от външни средства.Аз ще обясня в стъпки.
1) Четох \ напишете @ 2MHz sclk кодекс (кодекс CLK, магистър) по същото време на SDI & ОУР
2) кодек, пише 32-битови данни, за да Tx_buffer и прочита 32-бита данни, за да Rx_buffer (в FPGA)
3) След четене 32-бита (1 рама) в 16us, кодека отива на празен ход до 64us.
4) Това празен време е да съответства на времето за вземане на проби, което е 16kHz (64us).
5) кодека прочитания \ пише данни @ 2MHz само или тя няма да работи
6) да се чете: В 17us, след кодек спирки за написването \ четене, аз започвам четене от Tx_buffer (успоредно със сериен) @ 1Mbps използване FPGA CLK @ 1MHz.Така че най-накрая мога да попълня ми работа на 48us.Remaining 16us е свободен
7) напишете: В 17us, след кодек спирки за написването \ четене, писане започна да RX_buffer (сериен за паралелно) @ 1Mbps използване FPGA CLK (в) 1MHz.Пак го завършим в рамките 48us.
8) Както 1MHz чете \ пишете на Tx_buffer и Rx_buffer случва от 17us да 48us (32-бита @ 1MHz).
9) Тази рутина е завинаги.
Въпросът тук е, че тъй като часовник кодека's 2MHz не е точна в сравнение с CLK FPGA, FPGA смени часовника по-бързо от кодек CLK.В резултат на това аз намеря липсващите данни някъде ... Ако аз просто замени FPGA 1MHz от кодека's (2MHz \ 2 = 1MHz) 1MHz CLK, тогава аз съм в състояние да си взема правилното аудио изход ... Какво couldbe точната причина ?.... Това ли е проблемът на асинхронни операция ?.... не е часовниците synczing правилно ?.... Ако всяка операция се извършва с помощта кодек Sclk, а след това да намеря никакви проблеми.
Дали някой има изправени пред този въпрос?или има някаква идея, свързани с това? ... Дали използвате FIFO може да реши този ?..... Благодаря

 
Най-вероятно това се дължи на въпроса часовник за синхронизация между sclk и часовник FPGA.

да публикувате част от кода си тук, така че да можем да анализираме данните опирам преминаване разл часовника домейн.
или U може да ми пишете на ycherjier (на) yahoo.com, така че мога да гледам в детайли и discuess тук.

там е прост начин, при които с 2 ФР да направи синхронизация на данни с 2 разл часовник.

 
Тук ми е пълна код ... Можете спокойно да пропуснете декларации, съответстващи на ДЪРЖАВНА = s0.Si9nce това са само кодека стъпки инициализация
Само отчети от държавата <= S1 последователност са необходими ... Моите обяснения в края на този кодекс ...IEEE библиотека;
употреба ieee.std_logic_1164.all;
IEEE.STD_LOGIC_ARITH.ALL употреба;
IEEE.STD_LOGIC_UNSIGNED.ALL употреба;-------------------- ENTITY ДЕКЛАРАЦИЯ -------------------------
лице е SDR_PSK
PORT (
CLK: В std_logic;
sclk: в std_logic;
SW2: В std_logic;
sdofs: в std_logic;
ОУР: в std_logic;
RST: Няма std_logic;
SE: Inout std_logic;
SDI: Няма std_logic;
sdifs: Няма std_logic;
---------
LED: OUT STD_LOGIC_VECTOR (15 DOWNTO 0): = X "0000";
- Clk_sdata_op: OUT std_logic;
- Clk_data_op: OUT std_logic;
- ----------
TxB: OUT std_logic;
- RXB: OUT std_logic;
INT_OP: std_logic OUT;
TEST_OP: OUT std_logic
- Sdofs_op: OUT std_logic
);
края SDR_PSK;
ДЕКЛАРАЦИЯ НА СИГНАЛИ ------------------------ ------------------------ --------------
архитектура поведението на SDR_PSK е
----------- CODEC -------------
ТИП главното е (S0, S1);
СИГНАЛ състояние: основни;

ТИП INTERRUPTS1 Е (няма, SYNC_ON, SYNC_OFF);
СИГНАЛ прекъсва: INTERRUPTS1: = None;
- Сигнал прекъсва: Integer: = 0;
СИГНАЛ SIG: Integer от 0 до 188: = 1;
СИГНАЛ sig1, T: INTEGER от 0 до 150: = 0; - трябва да започва с 0
Rx_buff1 сигнал, Rx_buff2: std_logic_vector (15 downto 0): = "0000000000000000";
Tx_buff1 сигнал, Tx_buff2: STD_LOGIC_VECTOR (15 downto 0): = "0000000000000000";
TX1 сигнал, TX2, Tx: STD_LOGIC_VECTOR (31 DOWNTO 0);
RX1 сигнал, Rx2, Rx: STD_LOGIC_VECTOR (31 DOWNTO 0): = X "00000000";
сигнал enab: std_logic: = '0 ';
постоянен CA1: std_logic_vector (15 downto 0): = X "8901";
постоянен CA2: std_logic_vector (15 downto 0): = X "8101";
постоянен CA3: std_logic_vector (15 downto 0): = X "8a7b";
-------- MARKER ----------
---- СИГНАЛ MARKER1: STD_LOGIC_VECTOR (31 DOWNTO 0): = "01111110011111100111111001111110";
СИГНАЛ MARKER1: STD_LOGIC_VECTOR (15 DOWNTO 0): = "0111111001111110";
СИГНАЛ DATA_Tx, DATA_Rx: std_logic;
СИГНАЛ TEST_REG: STD_LOGIC_VECTOR (31 DOWNTO 0): = X "AAAAAAAA";
---- СИГНАЛ BUFFER_Tx: STD_LOGIC_VECTOR (47 DOWNTO 0);
СИГНАЛ BUFFER_MARKER, сляпо: STD_LOGIC_VECTOR (15 DOWNTO 0);
СИГНАЛ FLAG_RAMSWAP: std_logic: = '0 ';
СИГНАЛ BUFFER_Tx, BUFFER_Rx: STD_LOGIC_VECTOR (31 DOWNTO 0);
--
-------------- ----------- КОДИРАНЕ
СИГНАЛ CLK_RECOV_PRE: std_logic;
СИГНАЛ Mnchr_Rx, Mnchr_Tx, MONOSHOT_inv: std_logic;
СИГНАЛ Mnchr_Rx_inv, Mnchr_Rx_delay: std_logic;
СИГНАЛ CLK_RECOV, CLK_RECOV_inv: std_logic;
СИГНАЛ A, B, C, D, E, F, G, H, X: std_logic;
СИГНАЛ A1, B1, C1, D1, E1, F1: std_logic;
СИГНАЛ MONOSHOT: std_logic;
СИГНАЛ M, N, O, M1, N1: Integer: = 0;
СИГНАЛ clk_data, clk_sdata: std_logic;--
----------------------- Предварително ASSIGNEMENTS ------------------------- ---------------------------
BEGIN
----- Кодиране и MARKER ---
- TxB <= DATA_Tx;
- RXB <= DATA_Rx;
- clk_sdata_op <= clk_sdata;
- clk_data_op <= clk_data;
DATA_Rx <= DATA_Tx;
-------------------------------------------------- -------------------------------------------------- --------------------
- 1.CODECINTERFACEMODULE
-------------------------------------------------- -------------------------------------------------- -------------------
процес (CLK, sclk, държавни, SW2, sdofs, SE, enab)
VARIABLE I, i1: Integer: = 0;
VARIABLE J: Integer: = 0;
VARIABLE Temp, temp2: std_logic: = '0 ';

започвам
-------------------------------------------------- -------------------------------------------------- ------------
IF (SW2 = '0 '), тогава
SIG <= 0;
държавни <= s0;
sig1 <= 0;
IF (enab = '0 '), тогава
SE <= '0 ';
RST <= '0 ';
enab <= '1 ';
ELSIF (enab = '1 '), тогава
SE <= '1 ';
RST <= '1 ';
enab <= '1 ';
крайна сметка, ако;
ELSIF rising_edge (sclk), тогава
enab <= '0 '; - Оставете линия да премине следващия път
-----------------------------------------------
- КОНТРОЛ ДУМА КОНФИГУРАЦИЯ
-----------------------------------------------
-----------------------------------------------
- Контрол Дума 1
-----------------------------------------------
случай държавата е
когато s0 =>
SIG <= SIG 1;
случай е SIG

когато 1 => sdifs <= '1 ';
когато 2 => sdifs <= '0 ';
SDI <= CA1 (15);
, когато 3 => SDI <= CA1 (14);
когато 4 => SDI <= CA1 (13);
когато 5 => SDI <= CA1 (12);
когато 6 => SDI <= CA1 (11);
когато 7 => SDI <= CA1 (10);
, когато 8 => SDI <= CA1 (9);
когато 9 => SDI <= CA1 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

;
, когато 10 => SDI <= CA1 (7);
, когато 11 => SDI <= CA1 (6);
, когато 12 => SDI <= CA1 (5);
, когато 13 => SDI <= CA1 (4);
, когато 14 => SDI <= CA1 (3);
, когато 15 => SDI <= CA1 (2);
, когато 16 => SDI <= CA1 (1);
, когато 17 => SDI <= CA1 (0);

--------------------------------------------
- Контрол Дума 2
--------------------------------------------
, когато 18 => sdifs <= '1 ';
когато 19 => sdifs <= '0 ';
SDI <= CA2 (15);
, когато 20 => SDI <= CA2 (14);
, когато 21 => SDI <= CA2 (13);
, когато 22 => SDI <= CA2 (12);
, когато 23 => SDI <= CA2 (11);
, когато 24 => SDI <= CA2 (10);
, когато 25 => SDI <= CA2 (9);
, когато 26 => SDI <= CA2 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

;
, когато 27 => SDI <= CA2 (7);
, когато 28 => SDI <= CA2 (6);
, когато 29 => SDI <= CA2 (5);
, когато 30 => SDI <= CA2 (4);
, когато 31 => SDI <= CA2 (3);
, когато 32 => SDI <= CA2 (2);
, когато 33 => SDI <= CA2 (1);
, когато 34 => SDI <= CA2 (0);

----------------------------------------------
- Контрол Дума 3
-----------------------------------------------
, когато 35 => sdifs <= '1 '; - КОНТРОЛ НА СПИСЪК С
, когато 36 => sdifs <= '0 ';
SDI <= CA3 (15);
, когато 37 => SDI <= CA3 (14);
, когато 38 => SDI <= CA3 (13);
, когато 39 => SDI <= CA3 (12);
, когато 40 => SDI <= CA3 (11);
, когато 41 => SDI <= CA3 (10);
когато 42 => SDI <= CA3 (9);
, когато 43 => SDI <= CA3 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

;
, когато 44 => SDI <= CA3 (7);
, когато 45 => SDI <= CA3 (6);
, когато 46 => SDI <= CA3 (5);
, когато 47 => SDI <= CA3 (4);
, когато 48 => SDI <= CA3 (3);
, когато 49 => SDI <= CA3 (2);
когато 50 => SDI <= CA3 (1);
, когато 51 => SDI <= CA3 (0);
държавни <= S1;
sig1 <= 0;
, когато другите =>
края случай;
------- CODEC инициализация ПРОЦЕС завършва --------------------------------------- -----
-------------------------------------------------
- Data Buffer В & OUT (Това е завинаги линии)
-------------------------------------------------
КОГАТО S1 =>
sdifs <= sdofs;
sig1 <= sig1 1;
случай е sig1
КОГАТО 0 =>

IF (sdofs = '1 '), тогава
sig1 <= 1;
ELSIF (sdofs = '0 '), тогава
sig1 <= 0;
Крайна сметка, ако;

КОГАТО 1 => SDI <= Tx_buff1 (15);
Rx_buff1 (15) <= ОУР;
Прекъсване <= SYNC_ON;
КОГАТО 2 => SDI <= Tx_buff1 (14);
Rx_buff1 (14) <= ОУР;
КОГАТО 3 => SDI <= Tx_buff1 (13);
Rx_buff1 (13) <= ОУР;
КОГАТО 4 => SDI <= Tx_buff1 (12);
Rx_buff1 (12) <= ОУР;
КОГАТО 5 => SDI <= Tx_buff1 (11);
Rx_buff1 (11) <= ОУР;
КОГАТО 6 => SDI <= Tx_buff1 (10);
Rx_buff1 (10) <= ОУР;
КОГАТО 7 => SDI <= Tx_buff1 (9);
Rx_buff1 (9) <= ОУР;
КОГАТО 8 => SDI <= Tx_buff1 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

;
Rx_buff1 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

<= ОУР;
КОГАТО 9 => SDI <= Tx_buff1 (7);
Rx_buff1 (7) <= ОУР;
ПРИ 10 => SDI <= Tx_buff1 (6);
Rx_buff1 (6) <= ОУР;
, Когато 11 => SDI <= Tx_buff1 (5);
Rx_buff1 (5) <= ОУР;
, Когато 12 => SDI <= Tx_buff1 (4);
Rx_buff1 (4) <= ОУР;
ПРИ 13 => SDI <= Tx_buff1 (3);
Rx_buff1 (3) <= ОУР;
Когато член 14 => SDI <= Tx_buff1 (2);
Rx_buff1 (2) <= ОУР;
ПРИ 15 => SDI <= Tx_buff1 (1);
Rx_buff1 (1) <= ОУР;
ПРИ 16 => SDI <= Tx_buff1 (0);
Rx_buff1 (0) <= ОУР;

ПРИ 17 => SDI <= Tx_buff2 (15);
Rx_buff2 (15) <= ОУР;
ПРИ 18 => SDI <= Tx_buff2 (14);
Rx_buff2 (14) <= ОУР;
Когато 19 => SDI <= Tx_buff2 (13);
Rx_buff2 (13) <= ОУР;
ПРИ 20 => SDI <= Tx_buff2 (12);
Rx_buff2 (12) <= ОУР;
ПРИ 21 => SDI <= Tx_buff2 (11);
Rx_buff2 (11) <= ОУР;
ПРИ 22 => SDI <= Tx_buff2 (10);
Rx_buff2 (10) <= ОУР;
ПРИ 23 => SDI <= Tx_buff2 (9);
Rx_buff2 (9) <= ОУР;
ПРИ 24 => SDI <= Tx_buff2 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

;
Rx_buff2 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />

<= ОУР;
ПРИ 25 => SDI <= Tx_buff2 (7);
Rx_buff2 (7) <= ОУР;
Когато 26 => SDI <= Tx_buff2 (6);
Rx_buff2 (6) <= ОУР;
ПРИ 27 => SDI <= Tx_buff2 (5);
Rx_buff2 (5) <= ОУР;
ПРИ 28 => SDI <= Tx_buff2 (4);
Rx_buff2 (4) <= ОУР;
ПРИ 29 => SDI <= Tx_buff2 (3);
Rx_buff2 (3) <= ОУР;
ПРИ 30 => SDI <= Tx_buff2 (2);
Rx_buff2 (2) <= ОУР;
ПРИ 31 => SDI <= Tx_buff2 (1);
Rx_buff2 (1) <= ОУР;
ПРИ 32 => SDI <= Tx_buff2 (0);
Rx_buff2 (0) <= ОУР;

ПРИ 33 =>
Tx_buff1 <= Rx (31 DOWNTO 16);
Tx_buff2 <= Rx (15 DOWNTO 0);
TX (31 DOWNTO 16) <= Rx_buff1;
TX (15 DOWNTO 0) <= Rx_buff2;
доведе <= Tx_buff1;
КОГАТО 100 => Прекъсване <= SYNC_OFF;
КОГАТО 126 => sig1 <= 0;
Когато другите => NULL;
КРАЙ случай;
, когато другите =>
края случай;
крайна сметка, ако;
КРАЙ процес;

-------------------------------------------------- -------------------------------------------------- -------------------------
-------- 2.MARKERANDBITSTUFFING
-------------------------------------------------- -------------------------------------------------- -------------------------
Процес (clk_sdata, clk_data, CLK, sclk) ИП
VARIABLE I, i1: Integer: = 0;
VARIABLE Temp, temp2: std_logic: = '0 ';
VARIABLE FLAG_LOOP: std_logic: = '1 ';
BEGIN
---------------------------------
---- CODEC CLOCK GENERATOR @ 1MHz
---------------------------------

АКО RISING_EDGE (CLK), тогава
i1: = i1 1;
IF (i1 = 40), тогава
temp2: = НЕ (temp2);
clk_data <= temp2;
i1: = 0;
Крайна сметка, ако;
Крайна сметка, ако;
---------------------------------
СЛУЧАЙ СЕ прекъсне
КОГАТО SYNC_ON =>
C: АКО RISING_EDGE (clk_data), тогава

- АКО (прекъсва = SYNC_ON), тогава
INT_OP <= '1 ';
M1 <= M1 1;
n1 <= n1 1;
IF (M1> = 0 и M1 <= 30), тогава
Data_Tx <= TX (M1); - convertuing буферния данни за пореден
Rx <= Data_Rx (M1);
ELSIF (m1 = 31), тогава
Data_Tx <= TX (M1); - convertuing буферния данни за пореден
Rx <= Data_Rx (M1);
Крайна сметка, ако;
- ELSIF (прекъсва = SYNC_OFF), тогава
КОГАТО SYNC_OFF =>
M1 <= 0;
INT_OP <= '0 ';
Когато другите => NULL;
КРАЙ случай;
Крайна сметка, ако;
- Крайна сметка, ако;
КРАЙ процес;
Край поведението;
-------------------------------------------------- -------------------------------------------------- -----
Докато линия Codec НА ДЪРЖАВНАТА = S1 е завинаги линия, която събира данни от ОУР (както пише на данни за SDI) и го съхранява временно в Rx_buff1 & Rx_buffer2 (LCH & Rxh), Tx_buff1 & Tx_buff2 resp.Totally 32 бита.В броя от 33 (sig1) Аз ще премине този Temp Rx_buff1 буфер & 2 до Tx Tx_buff1 и & 2 до Rx.Така Rx и Tx са 32-битови буфер всеки, който притежава кодек данни. (Тх се чете данни от кодек, докато Rx е данните да бъдат написани на кодека). Всички операции, които са направили до сега са само става под SCLK CODEC's.ВСИЧКИ CODEC чете \ напишете операции са били кодирани в "rising_edge (sclk)", където SCLK се генерира от самия кодек asynchronouly в 2MHz.Така че всички операции по изпълнение на 2MHz.Сега мога да чета \ напишете данни от Tx и Rx респективно с помощта на 1MHz CLK да 1Mbps данни rate.That е, че трябва да конвертирате 2Mbps данни на постоянна скорост 1Mbps .... За 1MHz го генерирани от моя 80MHz капитана FPGA CLK суровина, която е в процес на "Маркер и битови пълнеж". Сега тук идва проблема ... Данните, които четем от 1MHz CLK FPGA не е в синхрон или точно същото с sclk.Проверих го чрез разделяне 1MHz от SCLK (кодекс CLK) и кръстосана проверка и в сравнение с моя FPGA, генерирани 1MHz CLK.И двамата не са едно и също на всички .. Изглежда като кодек CLK не е 1MHz но някои 999.1MHz .. В резултат на това, мога да видя моята FPGA 1MHz CLK изместване по-бързо от Sclk (в) 1MHz в CRO ясно ... Тук Терминът "прекъсване" е да генерира флаг exaclty по времето, когато кодек чете \ напишете започва ... Така че мястото ми данни в същото време, за да се избегне inorder данни липсват .. оглед на надзора тук е, че трябва бързо да ми място данни в рамките на прекъсвания = SYNC_ON ..... Е, ако имате някакви съмнения, свързани, просто питам .... Благодаря за вашите интереси !.....

 
Вие трябва да използвате двойна FIFO часовник!

 
Здравейте, съжалявам .. Аз не съм запознат с VHDL но мисля, че може приблизително познайте какво кода правя.

аз имам изготви схема блок, който discrib вашата система.Надявам се, че не го разбирайте погрешно.

да, аз имам съмнение, които споменавате, това "След като прочетете 32-бита (1 рама) в 16us, кодека отива на празен ход до 64us."

Това означава първоначално, първият часовник 32 sclk ще прехвърляне на валидни данни от кодека да FPGA след това след първите 32 часа на кодека ще отидат в покой за 64us там
FPGA ще събира данни след първите 32 sclk часовник и да го смени изложени на 1MHz.

Така че въпросът ми е какво е условието, когато кодек получите в празен?Видя ли sclk все още trasmiting?
Моето предположение е, че не трябва да trasmiting всеки сигнал и винаги да останат високи или ниски, за около 64us.

от друга страна, какво ще кажеш за страната 1MHz, можете WAN сигнал непрекъснато trasmiting или може да се спре за известен период и след препредаване на данни е готов?

от моя гледна точка, на sclk от кодеци ще спре за 64us който е достатъчно дълъг, за да предава данни, посочени в 1MHz.

аз имам прикачите документ и може да се търси фигура 3 и фигура 4.
http://www.edaboard.com/viewtopic.php?p=429921 # 429921

Надявам се, че помага ....
Съжалявам, но трябва вход, за да видите този прикачен файл

 
За съжаление за края на моя отговор ... Първо аз ви благодаря за вашите интереси!
cherjier написа:

Така че въпросът ми е какво е условието, когато кодек получите в празен?
Видя ли sclk все още trasmiting ?....
 
Цитат:

Е, моят въпрос тук е, че капитанът е кодек, който, в смисъл на данните и CLK timming не се контролира в FPGA ... Как може да прочете информация от друг домейн CLK, освен ако не синхронизиране? ...
 
Благодаря за кода cherjier! Кодът не е важно, но идеята е .... Така че няма проблем, ако това не е в VHDL, всичко това означава, е вашият ум помага! ... Въпреки това, аз само отчасти може да се разбере, че код тъй като ние сме дизайнери, ние не се нуждаем от много code.What ние ще трябва е концепцията ... имам малко съмнение относно CDC (часовник пресичане на домейн) ... В тази схема, за sclk се подава в 1-во Г-FF, а след това FPGA CLK за 2-ри Г-FF.What е ползата от това? .. да ви моля, обяснете ми това, че CDC използва схема малко?. В средното време, аз също съм проверка на предишните връзки. . Ако аз намеря ще хранят тук по-скоро, .. Благодаря за вашите интереси ....

 
Zerox100 всъщност това, което каза е вярно и, U може да приложи 2 часовник Async FIFO за синхронизиране на данни, но и за вашия случай, че една каскада от 2 ФР ще бъде наред.

аз имам изготвя ви форма на сигнала относно ползата от използването на веригата CDC.<img src="http://images.elektroda.net/5_1207032669_thumb.jpg" border="0" alt="How to read\write data using asynchronous clk?" title="Как да се чете \ напишете данни чрез асинхронни CLK?"/> ключовите моменти е на второ FF, където вторият ФР ще регистрират Въпрос от първия FF, когато Въпрос от първия ФР се променя, докато вторият е за вземане на проби на ФР Q, това ще нанесе metastability който показа на вълната на сигнала, по-горе .това условие, ще настъпи whrn нарастващия фронт на sclk и часовник FPGA са твърде близо.

използване на трето ФР ще пусна сигнал успешно преминаване на часовника домейн.

Освен това, в някои случаи, дизайнер използва за синхронизация схема за контрол на сигнала или договаряне на сигнала само.

Например, ако за контрол на сигнала е импулс влак в постоянен период от време и това трябва сигнал към преминаване към други часовник домейн, ако тя не кръст успешно, ще видите, че някои от пулса липсва и пулса на влака не са в постоянен период.

 
Благодаря човек! ... Ще видя asyn FIFO за сега ...

 

Welcome to EDABoard.com

Sponsor

Back
Top