Escolar Documentos
Profissional Documentos
Cultura Documentos
--* Company:
FTDI
*
--* Date:
23 Nov 2004
*
--* Author:
Iain Maciver
*
--*
*
--* Module Name: freq_cnt_ctl
*
--*
*
--* Description: Calculates the frequency of an unknown input signal using
*
--*
Morph-IC clk as a reference
*
--******************************************************************************
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY freq_cnt_ctl IS
PORT (
clk50
: in std_logic;
Signal_A : in std_logic;
-- Entre 1
Signal_B : in std_logic;
-- Entre 2
rst
FT245Din
nRXF
nTXE
FT245Dout
FT245DEn
nRD
WR
);
END freq_cnt_ctl;
:
:
:
:
in
in
in
in
:
:
:
:
out
out
out
out
std_logic;
std_logic_vector(7
std_logic;
-std_logic;
--
: std_logic;
: std_logic;
signal low
: std_logic;
BEGIN
low <= '0';
--------------------------------------------------------------------------------- Resync incoming signals to 50MHz clk
-------------------------------------------------------------------------------r_TXE : process (clk50, rst)
begin
if (rst = '1') then
TXE <= '0';
RXF <= '0';
elsif (clk50'event and clk50 = '1') then
TXE <= not nTXE;
RXF <= not nRXF;
end if;
end process r_TXE;
--------------------------------------------------------------------------------- Store Command when read from FT Chip
-------------------------------------------------------------------------------r_Cmd : process (clk50, rst)
begin
if (rst = '1') then
CmdReg <= "00000000";
-- Detection de front
-- les deux signaux A
----------------------
clock
cnt_en
sclr
aclr
q
);
i_window
clock
cnt_en
sclr
aclr
q
);
=>
=>
=>
=>
=>
clk50,
timeout_enable,
rst_window,
rst,
timeout_cnt
-----------------------------------------------------------------
-------------------
Compteur des
------------------
if(freq_cnt_Signal_A/=freq_cnt_Signal_A_old)
if(posedge_Signal_A='1') then
then
--------------------
-- Si front sur A
------------------
--fenetre_enable <='1';
elsif(fenetre_out='1') then
------------------
-- Si fenetre fini
rst_fenetre_cnt <='1';
------------------
-----fenetre_enable <='0';
elsif(cnt_coincidence/=cnt_coincidence_old) then
--------cnt_coincidence_enable <='0';
compt -rst_fenetre_cnt <='1';
--------fenetre_enable <='0';
else
cnt_coincidence_enable <= cnt_coincidence_enable;
rst_fenetre_cnt <='0';
fenetre_enable <= fenetre_enable;
------------------- Si coincidence
------------------
end if;
cnt_coincidence_old <= cnt_coincidence;
freq_cnt_Signal_A_old <= freq_cnt_Signal_A;
--
end if;
-- 10 ms
when "001" =>
if (timeout_cnt = "00000001111010000100011111") then
timeout <= '1';
else
timeout <= '0';
end if;
if (window_cnt = "00000001111010000100011111") then
end_window <= '1';
else
end_window <= '0';
end if;
-- 1 ms
when others =>
if (timeout_cnt = "00000000001100001101001111") then
timeout <= '1';
else
timeout <= '0';
end if;
if (window_cnt = "00000000001100001101001111") then
end_window <= '1';
else
end_window <= '0';
end if;
-end case;
end process p_end_window;
--------------------------------------------------------------------------------- State Machine Controller
-------------------------------------------------------------------------------sm_freq_cnt : process (clk50, rst)
begin
if (rst = '1') then
ctl_state
<= IDLE;
<= '0';
rst_window
<= '0';
then
<= Rx1;
<= '1';
<= IDLE;
<= '0';
cnt_enable_A
cnt_enable_B
timeout_enable <= '0';
remainder_en <= '0';
rst_window
<= '0';
rst_freq_cnt <= '0';
FT_En
<= '0';
WR_int
<= '0';
LdCmdReg
<= '0';
Tx_Status
<= "00";
<= '0';
<= '0';
ctl_state
<= IDLE;
cnt_enable_A <= '0';
cnt_enable_B <= '0';
timeout_enable <= '0';
end if;
rst_window <= '0';
remainder_en <= '0';
rst_freq_cnt <= '0';
FT_En
<= '0';
RD_int
<= '0';
WR_int
<= '0';
LdCmdReg
<= '0';
Tx_Status
<= "00";
-- wait until measurement window has completed
when COUNT =>
if (end_window = '1') then
ctl_state
<= Tx1;
cnt_enable_A <= '0';
cnt_enable_B <= '0';
remainder_en <= '0';
FT_En
<= '1';
else
ctl_state
<= COUNT;
cnt_enable_A <= cnt_enable_A or posedge_Signal
_A or timeout;
cnt_enable_B <= cnt_enable_B or posedge_Signal
_B or timeout;
remainder_en <= '0';
FT_En
<= '0';
end if;
timeout_enable <= '1';
rst_window
<= '0';
rst_freq_cnt <= '0';
RD_int
<= '0';
WR_int
<= '0';
LdCmdReg
<= '0';
Tx_Status
<= "00";
-- Transfer Frequency count to Tx Buffer in four bytes
when Tx1 =>
if (TXE = '1') then
ctl_state
<= Tx2;
WR_int
<= '1';
else
ctl_state
<= Tx1;
WR_int
<= '0';
end if;
cnt_enable_A <= '0';
cnt_enable_B <= '0';
timeout_enable <= '0';
remainder_en <= '0';
rst_window
<= '0';
rst_freq_cnt <= '0';
FT_En
<= '1';
RD_int
<= '0';
LdCmdReg
<= '0';
Tx_Status
<= Tx_Status;
-when Tx2 =>
ctl_state
<= Tx3;
cnt_enable_A <= '0';
timeout_enable
remainder_en
rst_window
rst_freq_cnt
FT_En
RD_int
WR_int
LdCmdReg
Tx_Status
-when Tx3 =>
ctl_state
<= Tx4;
cnt_enable_A <= '0';
cnt_enable_B <= '0';
timeout_enable <= '0';
remainder_en <= '0';
rst_window
<= '0';
rst_freq_cnt <= '0';
FT_En
<= '1';
RD_int
<= '0';
WR_int
<= '1';
LdCmdReg
<= '0';
Tx_Status
<= Tx_Status;
-- Return to Idle when last byte has been transferred
when Tx4 =>
if (TXE = '1') then
ctl_state
<= Tx4;
rst_window
<= '0';
rst_freq_cnt <= '0';
Tx_Status
<= Tx_Status;
elsif (Tx_Status = "11") then
ctl_state
<= IDLE;
rst_window
<= '1';
rst_freq_cnt <= '1';
Tx_Status
<= Tx_Status;
else
ctl_state
<= Tx1;
rst_window
<= '0';
rst_freq_cnt <= '0';
case Tx_Status is
when "10" => Tx_Status <= "11";
when "01" => Tx_Status <= "10";
when "00" => Tx_Status <= "01";
when others => Tx_Status <= "00";
end case;
end if;
cnt_enable_A <= '0';
cnt_enable_B <= '0';
timeout_enable <= '0';
remainder_en <= '0';
FT_En
<= '1';
RD_int
<= '0';
WR_int
<= '0';
LdCmdReg
<= '0';
-when others =>
ctl_state
<= IDLE;
cnt_enable_A <= '0';
cnt_enable_B <= '0';
---
------- Env
-- l'e
------