Jak czytać \ zapisywać dane za pomocą asynchronicznego CLK?

X

xtcx

Guest
hi friends!, mam problem, gdzie mój kodeka wysyła i odbiera dane w 2MHz sclk (kod wewnętrzny) clk.It działa jako master, a tym samym sclk (at) 2MHz nie jest kontrolowane za pomocą urządzeń zewnętrznych.Wytłumaczę w krokach.
1) czytam \ zapisu kodek @ 2MHz sclk (kod CLK, master) w tym samym czasie na SDI i SDO
2) codec pisze 32-bitowego do Tx_buffer i otrzymuje 32-bitów danych Rx_buffer (w FPGA)
3) Po przeczytaniu 32-bitów (1 klatka) w 16us, kodek idzie do bezczynności do 64us.
4) czas bezczynności jest aby dopasować czas pobierania próbek, która jest 16KHz (64us).
5) kodek brzmi \ zapisuje dane @ 2MHz tylko czy to nie będzie działać
6) Odczyt: Na 17us, po kodeka piśmie przestaje \ czytania, zaczynam czytanie od Tx_buffer (równolegle do szeregowy) @ 1Mb / s przy użyciu CLK FPGA @ 1MHz.Więc w końcu pełne moje działania na 48us.Remaining 16us jest wolna
7) NAPISZ: Na 17us, po kodeka piśmie przestaje \ czytania, zaczynam piśmie RX_buffer (numer równoległego) @ 1Mb / s przy użyciu CLK FPGA (at) 1MHz.Znowu skończyć w 48us.
8) zarówno 1MHz odczytu \ zapisu Tx_buffer i Rx_buffer dzieje z 17us do 48us (32-bit @ 1MHz).
9) Funkcja ta jest zawsze.
Chodzi tu jest, że od kodeka zegar 2MHz nie jest dokładne w porównaniu do CLK FPGA FPGA zegara przesuwa się szybciej niż kodek CLK.W wyniku mogę znaleźć brakujące dane gdzieś ... Jeśli po prostu wymienić FPGA 1MHz przez kodeka (2MHz \ 2 = 1MHz) 1MHz CLK, to jestem w stanie dostać mój prawidłowe wyjście audio ... Co couldbe dokładną przyczynę ?.... Czy ten problem asynchronicznej operacji ?.... Ain't zegary synczing właściwie ?.... Jeśli każda operacja jest wykonywana przy użyciu kodeka Sclk, a następnie znaleźć żadnych problemów.
Czy ktoś ma wobec tego problemu?lub jakichkolwiek związanych z tym pomysłem? ... Czy używanie FIFO może rozwiązać ten ?..... Dzięki

 
najprawdopodobniej było spowodowane problem synchronizacji zegara pomiędzy sclk i zegar FPGA.

można po części kodu tutaj, abyśmy mogli analizować abut danych przejściach diff domeny zegara.
lub u can email me at ycherjier (at) yahoo.com tak, że może wyglądać w szczegółach i discuess tutaj.

Istnieje prosty sposób, gdzie przy użyciu 2 FF do synchronizacji danych z 2 diff zegara.

 
Oto mój kompletny kod ... można bezpiecznie pominąć wypowiedzi odpowiada STAN = s0.Si9nce to tylko kodek kroki inicjalizacji
Tylko oświadczenia STATE <= S1 kolejności potrzebne są ... moje wyjaśnienia na końcu tego kodu ...library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;-------------------- ENTITY DEKLARACJA -------------------------
SDR_PSK podmiotu
PORT (
CLK: in std_logic;
sclk: in std_logic;
SW2: in std_logic;
sdofs: in std_logic;
SDO: in std_logic;
rst: in std_logic;
SE: std_logic Inout;
SDI: out std_logic;
std_logic sdifs: out;
---------
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: out std_logic;
TEST_OP: out std_logic
- Sdofs_op: out std_logic
);
SDR_PSK końca;
------------------------ SYGNAŁY DEKLARACJA ------------------------ --------------
architecture Behavioral of SDR_PSK jest
----------- CODEC -------------
TYP Main (S0, S1);
SIGNAL kraju: main;

INTERRUPTS1 typ (brak, SYNC_ON, SYNC_OFF);
SIGNAL Interrupt: INTERRUPTS1: = NIE;
- SIGNAL Interrupt: INTEGER: = 0;
SIGNAL sig: INTEGER przedziału od 0 do 188: = 1;
SIGNAL sig1, t: INTEGER przedziału od 0 do 150: = 0; - musi zaczynać się od 0
Rx_buff1 sygnału Rx_buff2: std_logic_vector (15 downto 0): = "0000000000000000";
Tx_buff1 sygnału Tx_buff2: std_logic_vector (15 downto 0): = "0000000000000000";
TX1 sygnału Tx2, Tx: std_logic_vector (31 downto 0);
RX1 sygnału, RX2, Rx: std_logic_vector (31 downto 0): = x "00000000";
enab sygnał: STD_LOGIC: = '0 ';
Stała CA1: std_logic_vector (15 downto 0): = x "8901";
Stała CA2: std_logic_vector (15 downto 0): = x "8101";
Stała CA3: std_logic_vector (15 downto 0): = x "8a7b";
-------- MARKER ----------
---- SIGNAL MARKER1: std_logic_vector (31 downto 0): = "01111110011111100111111001111110";
SIGNAL MARKER1: std_logic_vector (15 downto 0): = "0111111001111110";
SIGNAL DATA_Tx, DATA_Rx: std_logic;
SIGNAL TEST_REG: std_logic_vector (31 downto 0): = x "AAAAAAAA";
---- SIGNAL BUFFER_Tx: std_logic_vector (47 downto 0);
SIGNAL BUFFER_MARKER, obojętne: std_logic_vector (15 downto 0);
SIGNAL FLAG_RAMSWAP: std_logic: = '0 ';
SIGNAL BUFFER_Tx, BUFFER_Rx: std_logic_vector (31 downto 0);
--
-------------- KODOWANIE -----------
SIGNAL CLK_RECOV_PRE: std_logic;
SIGNAL Mnchr_Rx, Mnchr_Tx, MONOSHOT_inv: std_logic;
SIGNAL Mnchr_Rx_inv, Mnchr_Rx_delay: std_logic;
SIGNAL CLK_RECOV, CLK_RECOV_inv: std_logic;
SIGNAL A, B, C, D, E, F, G, H, X: std_logic;
SIGNAL A1, B1, C1, D1, E1, F1: std_logic;
SIGNAL MONOSHOT: std_logic;
SIGNAL M, N, O, M1, N1: INTEGER: = 0;
Clk_data SIGNAL, clk_sdata: std_logic;--
----------------------- Predefiniowane ASSIGNEMENTS ------------------------- ---------------------------
BEGIN
----- KODOWANIA I MARKER ---
- TXB <= DATA_Tx;
- RXB <= DATA_Rx;
- clk_sdata_op <= clk_sdata;
- clk_data_op <= clk_data;
DATA_Rx <= DATA_Tx;
-------------------------------------------------- -------------------------------------------------- --------------------
- 1.CODECINTERFACEMODULE
-------------------------------------------------- -------------------------------------------------- -------------------
process (CLK, sclk, stan, SW2, sdofs, se, enab)
Zmienna i, i1: INTEGER: = 0;
ZMIENNA: Integer: = 0;
ZMIENNA temp, temp2: std_logic: = '0 ';

zacząć
-------------------------------------------------- -------------------------------------------------- ------------
IF (SW2 = '0 ') THEN
sig <= 0;
stan <= s0;
sig1 <= 0;
IF (enab = '0 ') THEN
se <= '0 ';
rst <= '0 ';
enab <= '1 ';
Elsif (enab = '1 ') THEN
se <= '1 ';
rst <= '1 ';
enab <= '1 ';
end if;
ELSIF rising_edge (sclk), a następnie
enab <= '0 '; - Zgoda na pętli przekazać następnym razem
-----------------------------------------------
- Kontrolę konfiguracji WORD
-----------------------------------------------
-----------------------------------------------
- Słowo kontrolne 1
-----------------------------------------------
stan sprawy
kiedy s0 =>
sig <= sig 1;
sig sprawy

Gdy 1 => sdifs <= '1 ';
przy 2 => sdifs <= '0 ';
SDI <= CA1 (15);
przy 3 => SDI <= CA1 (14);
przy 4 => SDI <= CA1 (13);
przy 5 => SDI <= CA1 (12);
przy 6 => SDI <= CA1 (11);
kiedy 7 => SDI <= CA1 (10);
po 8 => SDI <= CA1 (9);
po 9 => SDI <= CA1 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

;
przy 10 => SDI <= CA1 (7);
kiedy 11 => SDI <= CA1 (6);
przy 12 => SDI <= CA1 (5);
przy 13 => SDI <= CA1 (4);
kiedy 14 => SDI <= CA1 (3);
przy 15 => SDI <= CA1 (2);
przy 16 => SDI <= CA1 (1);
przy 17 => SDI <= CA1 (0);

--------------------------------------------
- Słowo kontrolne 2
--------------------------------------------
przy 18 => sdifs <= '1 ';
kiedy 19 => sdifs <= '0 ';
SDI <= CA2 (15);
kiedy 20 => SDI <= CA2 (14);
przy 21 => SDI <= CA2 (13);
kiedy to 22 => SDI <= CA2 (12);
przy 23 => SDI <= CA2 (11);
przy 24 => SDI <= CA2 (10);
przy 25 => SDI <= CA2 (9);
przy 26 => SDI <= CA2 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

;
przy 27 => SDI <= CA2 (7);
przy 28 => SDI <= CA2 (6);
przy 29 => SDI <= CA2 (5);
przy 30 => SDI <= CA2 (4);
przy 31 => SDI <= CA2 (3);
przy 32 => SDI <= CA2 (2);
przy 33 => SDI <= CA2 (1);
przy 34 => SDI <= CA2 (0);

----------------------------------------------
- Control Word 3
-----------------------------------------------
przy 35 => sdifs <= '1 '; - sterowanie rejestrem C
przy 36 => sdifs <= '0 ';
SDI <= CA3 (15);
przy 37 => SDI <= CA3 (14);
przy 38 => SDI <= CA3 (13);
przy 39 => SDI <= CA3 (12);
przy 40 => SDI <= CA3 (11);
przy 41 => SDI <= CA3 (10);
kiedy to 42 => SDI <= CA3 (9);
przy 43 => SDI <= Ca3 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

;
przy 44 => SDI <= CA3 (7);
przy 45 => SDI <= CA3 (6);
przy 46 => SDI <= CA3 (5);
kiedy to 47 => SDI <= CA3 (4);
przy 48 => SDI <= CA3 (3);
przy 49 => SDI <= CA3 (2);
przy 50 => SDI <= CA3 (1);
przy 51 => SDI <= CA3 (0);
stan <= s1;
sig1 <= 0;
kiedy inni =>
end;
------- CODEC Proces inicjalizacji COMPLETES --------------------------------------- -----
-------------------------------------------------
- Bufor danych In & Out (jest to zawsze pętla)
-------------------------------------------------
WHEN s1 =>
sdifs <= sdofs;
sig1 <= sig1 1;
przypadku sig1 jest
KIEDY 0 =>

IF (sdofs = '1 ') THEN
sig1 <= 1;
Elsif (sdofs = '0 ') THEN
sig1 <= 0;
END IF;

Gdy 1 => SDI <= Tx_buff1 (15);
Rx_buff1 (15) <= SDO;
Przerwanie <= SYNC_ON;
KIEDY 2 => SDI <= Tx_buff1 (14);
Rx_buff1 (14) <= SDO;
KIEDY 3 => SDI <= Tx_buff1 (13);
Rx_buff1 (13) <= SDO;
KIEDY 4 => SDI <= Tx_buff1 (12);
Rx_buff1 (12) <= SDO;
KIEDY 5 => SDI <= Tx_buff1 (11);
Rx_buff1 (11) <= SDO;
KIEDY 6 => SDI <= Tx_buff1 (10);
Rx_buff1 (10) <= SDO;
KIEDY 7 => SDI <= Tx_buff1 (9);
Rx_buff1 (9) <= SDO;
KIEDY 8 => SDI <= Tx_buff1 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

;
Rx_buff1 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

<= SDO;
KIEDY 9 => SDI <= Tx_buff1 (7);
Rx_buff1 (7) <= SDO;
Gdy 10 => SDI <= Tx_buff1 (6);
Rx_buff1 (6) <= SDO;
Kiedy 11 => SDI <= Tx_buff1 (5);
Rx_buff1 (5) <= SDO;
KIEDY 12 => SDI <= Tx_buff1 (4);
Rx_buff1 (4) <= SDO;
KIEDY 13 => SDI <= Tx_buff1 (3);
Rx_buff1 (3) <= SDO;
Kiedy 14 => SDI <= Tx_buff1 (2);
Rx_buff1 (2) <= SDO;
KIEDY 15 => SDI <= Tx_buff1 (1);
Rx_buff1 (1) <= SDO;
When 16 => SDI <= Tx_buff1 (0);
Rx_buff1 (0) <= SDO;

KIEDY 17 => SDI <= Tx_buff2 (15);
Rx_buff2 (15) <= SDO;
KIEDY 18 => SDI <= Tx_buff2 (14);
Rx_buff2 (14) <= SDO;
Kiedy 19 => SDI <= Tx_buff2 (13);
Rx_buff2 (13) <= SDO;
Kiedy 20 => SDI <= Tx_buff2 (12);
Rx_buff2 (12) <= SDO;
KIEDY 21 => SDI <= Tx_buff2 (11);
Rx_buff2 (11) <= SDO;
Kiedy to 22 => SDI <= Tx_buff2 (10);
Rx_buff2 (10) <= SDO;
KIEDY 23 => SDI <= Tx_buff2 (9);
Rx_buff2 (9) <= SDO;
KIEDY 24 => SDI <= Tx_buff2 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

;
Rx_buff2 (

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chłodny" border="0" />

<= SDO;
KIEDY 25 => SDI <= Tx_buff2 (7);
Rx_buff2 (7) <= SDO;
KIEDY 26 => SDI <= Tx_buff2 (6);
Rx_buff2 (6) <= SDO;
KIEDY 27 => SDI <= Tx_buff2 (5);
Rx_buff2 (5) <= SDO;
KIEDY 28 => SDI <= Tx_buff2 (4);
Rx_buff2 (4) <= SDO;
W wieku 29 => SDI <= Tx_buff2 (3);
Rx_buff2 (3) <= SDO;
Przy 30 => SDI <= Tx_buff2 (2);
Rx_buff2 (2) <= SDO;
KIEDY 31 => SDI <= Tx_buff2 (1);
Rx_buff2 (1) <= SDO;
KIEDY 32 => SDI <= Tx_buff2 (0);
Rx_buff2 (0) <= SDO;

KIEDY 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;
LED <= Tx_buff1;
GDY 100 => przerwać <= SYNC_OFF;
GDY 126 => sig1 <= 0;
Gdy inni => NULL;
End;
kiedy inni =>
end;
end if;
End process;

-------------------------------------------------- -------------------------------------------------- -------------------------
-------- 2.MARKERANDBITSTUFFING
-------------------------------------------------- -------------------------------------------------- -------------------------
PROCES (clk_sdata, clk_data, CLK, sclk) IS
Zmienna i, i1: INTEGER: = 0;
ZMIENNA temp, temp2: std_logic: = '0 ';
ZMIENNA FLAG_LOOP: std_logic: = '1 ';
BEGIN
---------------------------------
---- CODEC Clock Generator @ 1MHz
---------------------------------

JEŚLI RISING_EDGE (CLK) then
i1: = i1 1;
IF (i1 = 40) then
temp2: = NOT (temp2);
clk_data <= temp2;
i1: = 0;
END IF;
END IF;
---------------------------------
Przerwanie CASE
KIEDY SYNC_ON =>
C: JEŚLI RISING_EDGE (clk_data) THEN

- IF (interrupt = SYNC_ON) THEN
INT_OP <= '1 ';
m1 <= m1 1;
n1 <= n1 1;
IF (M1> = 0 AND m1 <= 30) then
Data_Tx <= Tx (M1) - convertuing Bufor danych szeregowych
Rx <= Data_Rx (M1);
Elsif (m1 = 31) then
Data_Tx <= Tx (M1) - convertuing Bufor danych szeregowych
Rx <= Data_Rx (M1);
END IF;
- Elsif (Interrupt = SYNC_OFF) THEN
KIEDY SYNC_OFF =>
m1 <= 0;
INT_OP <= '0 ';
Gdy inni => NULL;
End;
END IF;
- END IF;
End process;
End Behavioral;
-------------------------------------------------- -------------------------------------------------- -----
Podczas pętli Kodery STAN = S1 jest zawsze pętli, która zbiera dane z SDO (jak również zapisuje dane do SDI) i zapisuje ją tymczasowo w Rx_buff1 & Rx_buffer2 (LCH & Rxh) Tx_buff1 & Tx_buff2 resp.Totally 32 bitów.Na liczbę 33 (sig1) będę przekazywać te temp Rx_buff1 bufora i 2 do Tx i Tx_buff1 i 2 do Rx.Więc Rx i Tx jest 32-bitowy bufor każdego, który posiada kodek danych. (Tx jest odczytać dane z kodekiem że Rx jest danych do zapisania codec). Wszelkie działania, które zostały wykonane do tej pory tylko w ramach systemu SCLK kodeka.ALL CODEC odczytu \ zapisu zostały zakodowane w "rising_edge (sclk)", gdzie SCLK jest generowany przez kodek się asynchronouly na 2MHz.Tak więc wszystkie czynności wykonać w 2MHz.Teraz muszę czytać \ zapisywać dane z Tx i Rx resp. przy 1MHz CLK dostać 1Mbps rate.That dane są potrzebne do konwersji danych do 2Mbps stałą prędkością 1Mbps .... Dla 1MHz wygenerowany ją z mojego 80MHz kapitan FPGA CLK wejście, które jest pod "Marker i farszu Bit". teraz tu jest problem ... danych, które możemy odczytać z 1MHz CLK FPGA nie jest w fazie lub identyczne z sclk.Sprawdziłem go poprzez podzielenie 1MHz z SCLK (kod CLK) oraz sprawdzony i w porównaniu z moim FPGA generowane 1MHz CLK.Obie nie są takie same w każdym .. Wygląda jak kodek CLK nie 1MHz ale niektóre 999.1MHz .. W rezultacie, widzę mojej FPGA 1MHz CLK zmieniających się szybciej niż Sclk (at) 1MHz w CRO wyraźnie ... Here Termin "przerywa" jest generowanie exaclty flag w czasie kodeka przeczytaj \ pisać zaczyna ... So I miejsce moich danych w tym samym czasie, aby uniknąć inorder danych brakuje .. nadzorowane widzenia jest to, że muszę szybko moje miejsce danych w Interrupt = SYNC_ON ..... Cóż, jeśli masz jakiekolwiek wątpliwości związane, wystarczy zapytać .... Thanks for your interesów !.....

 
Hi, sorry .. Nie znam się VHDL, ale myślę, że można w przybliżeniu odgadnąć kod do.

mam narysować schemat blokowy, że discrib systemu.hope I didn't get it wrong.

będzie, mam wątpliwości, należy wspomnieć o tym "Po przeczytaniu 32-bitów (1 klatka) w 16us, kodek idzie do bezczynności do 64us.

to znaczy, że początkowo, pierwszy zegar 32 sclk będzie przekazywanie ważnych danych z kodeka FPGA to po pierwsze 32 zegar kodeka pójdzie w stanie bezczynności do 64us tam
FPGA będzie zbierać dane od pierwszego zegara 32 sclk i przeniesienie go na 1MHz.

więc moje pytanie brzmi: co jest warunkiem gdy kodeka się w bezczynności?did you see sclk nadal trasmiting?
Domyślam się, że nie powinno trasmiting żadnego sygnału i zawsze pozostanie wysoka lub niska około 64us.

po drugiej stronie, co 1MHz stronie, trzeba WAN sygnał ciągły trasmiting lub można zatrzymać się na pewien okres, a po retransmisji danych jest gotowa?

z mojego punktu widzenia, sclk z kodekiem zatrzyma dla 64us, który jest wystarczająco długo, do przekazywania danych na krokiem 1MHz.

Mam dołączyć dokument i może spojrzeć na rys. 3 i rys. 4.
http://www.edaboard.com/viewtopic.php?p=429921 # 429921

hope it helps ....
Przepraszamy, ale musisz się zalogować, aby wyświetlić ten załącznik

 
Przepraszam za moją odpowiedź późno ... Po pierwsze dziękuję za twój interes!
cherjier napisał:

więc moje pytanie brzmi: co jest warunkiem gdy kodeka się w bezczynności?
did you see sclk nadal trasmiting ?....
 
Cytat:

Cóż, mój problem jest to, że kodek jest panem, który w tym sensie, danych i timming CLK nie można kontrolować w FPGA ... Jak można odczytać danych z innej domeny CLK chyba nieaktualne? ...
 
Dziękujemy za cherjier kodu! Kod nie jest ważne, ale koncepcja jest .... więc nie ma problemu jeśli nie jest ona w VHDL, Oznacza to your mind pomoc! ... Jednak mogłem tylko częściowo zrozumieć, że kod, Ponieważ nie jesteśmy projektantów, nie musimy dużo code.What zrobimy potrzeba jest koncepcja ... Mam wątpliwości dotyczące CDC (domeny zegar skrzyżowania) ... W tym diagramie sclk te wprowadzane są do dnia 1 D-RF, a następnie FPGA CLK to 2nd D-FF.What ma korzyści z tego? .. czy mógłby pan wyjaśnić mi CDC przy tym schemat trochę?. W tym czasie jestem też sprawdzania poprzednich linków. . Jeżeli mogę znaleźć żadnych będę tutaj dość szybko, .. Thanks for your interesów ....

 
rzeczywiście to, co powiedział, było prawdą Zerox100 również, może stosować u 2 zegar kolejka async do synchronizacji danych, ale w Twoim przypadku to myślę kaskady 2 FF powinno być OK.

mam zwrócić się fali w zakresie korzyści z obwodu CDC.<img src="http://images.elektroda.net/5_1207032669_thumb.jpg" border="0" alt="How to read\write data using asynchronous clk?" title="Jak czytać \ zapisywać dane za pomocą asynchronicznego CLK?"/> Kluczowymi punktami znajduje się na drugim FF, gdzie drugi FF rejestruje Q pierwszy FF, gdy Q pierwszy FF się zmienia, a drugi FF jest do pobierania próbek P, spowoduje to metastabilności, które pokazane na fali powyżej .tego warunku nastąpi whrn Wzrastające zbocze sclk i zegar FPGA są zbyt blisko.

przy trzecim FF pozwoli sygnałów pomyślnie przejść domeny zegara.

Poza tym, w niektórych przypadkach, projektant z obwodu synchronizacji sygnału sterującego lub sygnałów uzgadniania tylko.

Na przykład, jeśli sygnał sterujący jest pociąg impuls w stałym terminie, przy czym potrzeba sygnał do przejścia na inne domeny zegar, gdyby nie krzyż pomyślnie, widać, że niektóre z impulsu brakuje, a pociąg impulsów nie są w stałych odstępach.

 

Welcome to EDABoard.com

Sponsor

Back
Top