Hvordan vet om klokken er toggling?

S

suquid29

Guest
Hei,
Jeg utforme en modul som måler frekvensen av ukjent klokke.Jeg har gjort det ganske enkelt ved å telle kantene på et visst tidsrom vinduet (med riktig synkronisering selvfølgelig).

Men før det, må jeg se om veksling sin ...Hvordan kan jeg gjøre det?
Jeg skjønt av OR mellom clk og IKKE (clk), men er ikke en god idé fordi det er en liten periode (t_pd av NTO) som de begge er lav ...

Noen gode ideer?

Takk!

 
suquid29 skrev:

Hei,

Jeg utforme en modul som måler frekvensen av ukjent klokke.
Jeg har gjort det ganske enkelt ved å telle kantene på et visst tidsrom vinduet (med riktig synkronisering selvfølgelig).Men før det, må jeg se om veksling sin ...
Hvordan kan jeg gjøre det?

Jeg skjønt av OR mellom clk og IKKE (clk), men er ikke en god idé fordi det er en liten periode (t_pd av NTO) som de begge er lav ...Noen gode ideer?Takk!
 
Black Jack wrote:as enable signal for counter like
du kan bruke edge_det
som aktiverer signal for telleren somCode:

cnt_ena <= edge_det OG time_base;
 
suquid29 skrev:Black Jack wrote:as enable signal for counter like
du kan bruke edge_det
som aktiverer signal for telleren somCode:

cnt_ena <= edge_det OG time_base;
 
Antar det er en klokke i ur modul og hvis u nød å kontrollere om et innkommende signal veksling eller ikke, bruk en posedge eller negedge detektor krets for å finne det ut.Dens mulig å bruke det som et mulig å starte telleren å vurdere hyppigheten av innkommende signal.

 
Det er en del av prosjektet mitt.Jeg har redigert det for deg.Det vil være nyttig.
THX

kode og testbench:

library IEEE;
bruk ieee.std_logic_unsigned.all;
bruk ieee.std_logic_1164.all;

enhet uart_rx_tb er
end uart_rx_tb;

arkitektur TB_ARCHITECTURE av uart_rx_tb er
- Komponent erklæring av de testede enheten
komponent uart_rx
port (
RST: in std_logic;
clk_in: in std_logic;
serial_in: in std_logic;
RDY: out std_logic;
CLR: in std_logic;
Parallel_out: out std_logic_vector (7 downto 0));
end component;

- Stimulus signalene - signaler tilordnet til innspill og Inout portene testet enhet
signal RST: std_logic;
signal clk_in: std_logic: = '0 ';
signal serial_in: std_logic;
signal CLR: std_logic;
- Målt signalene - signaler tilordnet til produksjon portene testet enhet
signal RDY: std_logic;
signal Parallel_out: std_logic_vector (7 downto 0);

begynne
Uut: uart_rx
port map (
RST => RST,
clk_in => clk_in,
serial_in => serial_in,
RDY => RDY,
CLR => CLR,
Parallel_out => Parallel_out
);

clk_in <= ikke clk_in etter 670 ps;
RST <= '1 ', '0' etter 12 ns;
serial_in <'0 = '1 ',' etter 40 ns, '1 'etter 100 ns, '0' etter 120 ns;
CLR <= '0 ';

end TB_ARCHITECTURE;

konfigurasjon TESTBENCH_FOR_uart_rx av uart_rx_tb er
for TB_ARCHITECTURE
for Uut: uart_rx
bruk enhet work.uart_rx (behav1);
slutt for;
slutt for;
end TESTBENCH_FOR_uart_rx;LIBRARY IEEE;
BRUK IEEE.STD_LOGIC_1164.ALL;
BRUK IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY UART_RX IS
PORT (
RST: IN STD_LOGIC;
CLK_IN: IN STD_LOGIC;
SERIAL_IN: IN STD_LOGIC;
RDY: OUT STD_LOGIC;
CLR: IN STD_LOGIC;
PARALLEL_OUT: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END UART_RX;

ARKITEKTUR BEHAV1 AV UART_RX IS
SIGNAL COUNTER1: STD_LOGIC_VECTOR (3 DOWNTO 0);

SIGNAL DET_CLK, DET_CLK_INT: STD_LOGIC;
BEGINPROCESS (RST, CLK_IN)
BEGIN
IF RST = '1 'THEN
COUNTER1 <= "1111" etter 1. NS;
RDY <= '0 ';
ELSIF CLK_IN = '1 'AND CLK_IN'EVENT SÅ
IF DET_CLK_INT = '1 'THEN
COUNTER1 <= "0000" etter 1. NS;
RDY <= '1 ';
ELSE
IF COUNTER1 = "1111" SÅ
RDY <= '0 ';
ELSE
COUNTER1 <= COUNTER1 1 etter 1. NS;
RDY <= '1 ';
END IF;
END IF;
END IF;
END PROCESS;

INPUTCLK2: PROCESS (RST, DET_CLK, SERIAL_IN)
BEGIN
IF RST = '1 'OR DET_CLK = '1' THEN
DET_CLK_INT <= '0 ';
ELSIF SERIAL_IN = '0 'AND SERIAL_IN'EVENT SÅ
DET_CLK_INT <= '1 ';
END IF;
END PROCESS;

OUTPUTCLK2: PROCESS (RST, CLK_IN)
BEGIN
IF RST = '1 'THEN
DET_CLK <= '0 ';
ELSIF CLK_IN = '1 'AND CLK_IN'EVENT SÅ
DET_CLK <= DET_CLK_INT;
END IF;
END PROCESS;

END BEHAV1;
Beklager, men du må logge inn for å vise dette vedlegget

 
Zerox100 skrev:

Det er en del av prosjektet mitt.
Jeg har redigert det for deg.
Det vil være nyttig.

THXkode og testbench:library IEEE;

bruk ieee.std_logic_unsigned.all;

bruk ieee.std_logic_1164.all;enhet uart_rx_tb er

end uart_rx_tb;arkitektur TB_ARCHITECTURE av uart_rx_tb er

- Komponent erklæring av de testede enheten

komponent uart_rx

port (

RST: in std_logic;

clk_in: in std_logic;

serial_in: in std_logic;

RDY: out std_logic;

CLR: in std_logic;

Parallel_out: out std_logic_vector (7 downto 0));

end component;- Stimulus signalene - signaler tilordnet til innspill og Inout portene testet enhet

signal RST: std_logic;

signal clk_in: std_logic: = '0 ';

signal serial_in: std_logic;

signal CLR: std_logic;

- Målt signalene - signaler tilordnet til produksjon portene testet enhet

signal RDY: std_logic;

signal Parallel_out: std_logic_vector (7 downto 0);begynne

Uut: uart_rx

port map (

RST => RST,

clk_in => clk_in,

serial_in => serial_in,

RDY => RDY,

CLR => CLR,

Parallel_out => Parallel_out

);clk_in <= ikke clk_in etter 670 ps;

RST <= '1 ', '0' etter 12 ns;

serial_in <'0 = '1 ',' etter 40 ns, '1 'etter 100 ns, '0' etter 120 ns;

CLR <= '0 ';end TB_ARCHITECTURE;konfigurasjon TESTBENCH_FOR_uart_rx av uart_rx_tb er

for TB_ARCHITECTURE

for Uut: uart_rx

bruk enhet work.uart_rx (behav1);

slutt for;

slutt for;

end TESTBENCH_FOR_uart_rx;LIBRARY IEEE;

BRUK IEEE.STD_LOGIC_1164.ALL;

BRUK IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY UART_RX IS

PORT (

RST: IN STD_LOGIC;

CLK_IN: IN STD_LOGIC;

SERIAL_IN: IN STD_LOGIC;

RDY: OUT STD_LOGIC;

CLR: IN STD_LOGIC;

PARALLEL_OUT: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)

);

END UART_RX;ARKITEKTUR BEHAV1 AV UART_RX IS

SIGNAL COUNTER1: STD_LOGIC_VECTOR (3 DOWNTO 0);SIGNAL DET_CLK, DET_CLK_INT: STD_LOGIC;

BEGINPROCESS (RST, CLK_IN)

BEGIN

IF RST = '1 'THEN

COUNTER1 <= "1111" etter 1. NS;

RDY <= '0 ';

ELSIF CLK_IN = '1 'AND CLK_IN'EVENT SÅ

IF DET_CLK_INT = '1 'THEN

COUNTER1 <= "0000" etter 1. NS;

RDY <= '1 ';

ELSE

IF COUNTER1 = "1111" SÅ

RDY <= '0 ';

ELSE

COUNTER1 <= COUNTER1 1 etter 1. NS;

RDY <= '1 ';

END IF;

END IF;

END IF;

END PROCESS;INPUTCLK2: PROCESS (RST, DET_CLK, SERIAL_IN)

BEGIN

IF RST = '1 'OR DET_CLK = '1' THEN

DET_CLK_INT <= '0 ';

ELSIF SERIAL_IN = '0 'AND SERIAL_IN'EVENT SÅ

DET_CLK_INT <= '1 ';

END IF;

END PROCESS;OUTPUTCLK2: PROCESS (RST, CLK_IN)

BEGIN

IF RST = '1 'THEN

DET_CLK <= '0 ';

ELSIF CLK_IN = '1 'AND CLK_IN'EVENT SÅ

DET_CLK <= DET_CLK_INT;

END IF;

END PROCESS;END BEHAV1;
 
Det er fullt synthesizable med noen simulering problemer.Synthesis verktøy ignorerer timing og forsinkelse begrenser.
Kompilere den.It's great!

 
du kan bare gjenkjenne stigende kant og fallende kanten av et gitt signal ved å registrere den og deretter sammenligne den med en syklus forsinket versjon:

hvis rising_edge (clk) then
sig_1 <= sig;
if (sig = '1 'and sig_1 = '0') then
--- Stigende kanten av sig
end if;

if (sig = '0 'og sig_1 = '1') then
--- Fallende kant av sig
end if;

end if;

Det er det!

 

Welcome to EDABoard.com

Sponsor

Back
Top