📄 qdr_lc_top.vhd
字号:
FD_REFDATA_ST2 : FD port map ( Q => FD2_Reference_Data(i3), D => FD1_Reference_Data(i3), C => GCLK90);
end generate;
g4: for i4 in 0 to 71 generate
FD_REFDATA_ST3 : FD port map ( Q => FD3_Reference_Data(i4), D => FD2_Reference_Data(i4), C => GCLK90);
end generate;
--*****************************************************************************************
-- Instantiate QDR-II Memory Interface clocking module
--*****************************************************************************************
QDR_interface_clocks : qdr2_clocks
port map ( USER_CLK => CLK200,
USER_CLK_N => CLK200N,
RESET => USER_RESET,
CLK_BUF => CLK_BUF,
GCLK0 => GCLK0,
GCLK90 => GCLK90,
GCLK180 => GCLK180,
GCLK270 => GCLK270,
CLKDIV2 => CLK_DIV2,
LOCKED_DCM => DCM_LOCKED );
--*****************************************************************************************
-- Instantiate QDR-II Memory Interface
--*****************************************************************************************
QDR_Interface_B : qdr2_burst_4_body
port map ( USER_DWL => Cout_WDataL,
USER_DWH => Cout_WDataH,
USER_Q => DataR,
USER_A_READ => AddrR,
USER_A_WRITE => AddrW,
CLK_BUF => CLK_BUF,
CLK0E => GCLK0,
CLK90E => GCLK90,
CLK180E => GCLK180,
CLK270E => GCLK270,
LOCKED_DCM_PRI => DCM_LOCKED,
USER_R_n => R_n,
USER_W_n => W_n,
USER_BW_n => "00000000",
USER_RESET => DCM_LOCKED_n,
USER_DATA_VALID => UserDataValid,
QDR_Q => mem_Q_val,
QDR_D => mem_D_val,
QDR_SA => mem_SA_val,
QDR_R_n => mem_R_n,
QDR_W_n => mem_W_n,
QDR_BW_n => mem_BW_n,
QDR_K0 => mem_K0,
QDR_K0_n => mem_K0_n,
QDR_K1 => mem_K1,
QDR_K1_n => mem_K1_n,
QDR_C0 => mem_C0,
QDR_C0_n => mem_C0_n,
QDR_C1 => mem_C1,
QDR_C1_n => mem_C1_n,
QDR_CQ0 => mem_CQ0,
QDR_CQ0_n => mem_CQ0_n,
QDR_CQ1 => mem_CQ1,
QDR_CQ1_n => mem_CQ1_n,
QDR_R_n_ext => mem_R_n_ext,
QDR_R_n_int => mem_R_n_int,
TEST_RESET_0 => Reset_CLK0
);
--*****************************************************************************************
-- Reset module, specific to ML365
--*****************************************************************************************
ML365_RESET : QDR2_RESET port map ( ML365_RESET => Reset,
USER_RESET => USER_RESET);
--*****************************************************************************************
-- Generate data using a counter, out of CLK0
--*****************************************************************************************
WordGene_H0 : counter_4
port map( counter => Counter_outH ,
inclock => GCLK0,
reset => ResetCount);
Concat_Write_High : concat2to36Data
port map ( inclock => GCLK0,
Sortie => Cout_WDataH,
counter => Counter_outH);
WordGene_L0 : counter_4
port map ( counter => Counter_outL,
inclock => GCLK0,
reset => ResetCount);
Concat_Write_Low : concat2to36Data
port map ( inclock => GCLK0,
Sortie => Cout_WDataL,
counter => Counter_outL);
--*****************************************************************************************
-- Generate addresses using a conter, from address 0, out of CLK0/2 and ~CLK0/2
--*****************************************************************************************
AddrGeneR : counter_262144
port map ( COut2 => AddrR,
inc => GCLK0_2_n,
reset => ResetCount );
AddrGeneW : counter_262144
port map ( COut2 => AddrW,
inc => GCLK0_2,
reset => ResetCount );
--*****************************************************************************************
-- Delay at power up to leave time for the QDR II SRAM to lock its DLL
--*****************************************************************************************
StartTest :delay
port map( Si_In => DCM_LOCKED,
Si_Out => ThisIsAGo,
Clock => GCLK0,
Reset => Reset_CLK0);
--*****************************************************************************************
-- Generation of the reference data to compare written adn read data
--*****************************************************************************************
Data_Check_Gene : counter_4
port map ( counter => To_concatenate,
inclock => GCLK90,
reset => FD_UserDataValid_n);
Concatenate_Test : concat2to36Data
port map (inclock => GCLK90,
Sortie => Reference_Data,
counter => To_concatenate);
INST_OBUF_Result_D0 : OBUF_LVDCI_25 port map(O => Result_Reg , I => Result_BUF);
process (GCLK0)
begin
if GCLK0'event and GCLK0 = '1' then
if Reset_CLK0 ='1' then
GCLK0_2 <= '0' ;
else
GCLK0_2 <= (not GCLK0_2);
end if;
end if;
end process;
--*****************************************************************************************
-- Comparator of read data
--*****************************************************************************************
process (GCLK0)
begin
if GCLK0'event and GCLK0 = '1' then
if Reset_CLK0 ='1' then
Result <= '0';
else
if FD_UserDataValid = '1' and (FD_Data_R(143 downto 108) = Reference_Data(71 downto 36)) and (FD_Data_R(107 downto 72) = Reference_Data(35 downto 0)) and (FD_Data_R(71 downto 36) = Reference_Data(71 downto 36)) and (FD_Data_R(35 downto 0) = Reference_Data(35 downto 0)) then
Result <= '1';
else
Result <= '0';
end if;
end if;
end if;
end process;
process (GCLK0)
begin
if GCLK0'event and GCLK0 = '1' then
Result_BUF <= Result;
Reference_Data_BUF <= Reference_Data(0);
end if;
end process;
--*****************************************************************************************
-- Synchronous state machine
--*****************************************************************************************
state_machine : process(DCM_LOCKED , ThisIsAGo,CurrentState,AddrW,AddrR,W_n,R_n,Status_Ctrl_Operation)
begin
NextState <= Start ;
case CurrentState is
when Start =>
if DCM_LOCKED = '1' then
NextState <= GetReady;
else
NextState <= Start;
end if;
when GetReady =>
if ThisIsAGo = '1' then
if Status_Ctrl_Operation = '1' then
NextState <= ReadCycle;
else
NextState <= WriteCycle;
end if;
else
NextState <= GetReady;
end if;
when WriteCycle =>
if (AddrW = "000000000000011111" and R_n = '1' ) then
NextState <= Start;
else
NextState <= WriteCycle;
end if;
when ReadCycle =>
if AddrR = "000000000000011110" and W_n = '1' then
NextState <= Start;
else
NextState <= ReadCycle;
end if;
end case;
end process;
process (GCLK0)
begin
if GCLK0'event and GCLK0 = '1' then
if Reset_CLK0 = '1' then
CurrentState <= Start;
else
CurrentState <= NextState;
end if;
end if;
end process;
output_logic : process (CurrentState,Status_Ctrl_Operation_buf)
begin
case CurrentState is
when Start=>
ResetCount <= '1';
R_n <= '1';
W_n <= '1';
Status_Ctrl_Operation <= Status_Ctrl_Operation_buf;
when GetReady =>
ResetCount <= '1';
R_n <= '1';
W_n <= '1';
Status_Ctrl_Operation <= Status_Ctrl_Operation_buf;
when WriteCycle =>
ResetCount <= '0';
R_n <= '1';
W_n <= '0';
Status_Ctrl_Operation <= '1';
when ReadCycle =>
ResetCount <= '0';
R_n <= '0';
W_n <= '1';
Status_Ctrl_Operation <= '0';
when others =>
ResetCount <= '1';
R_n <= '1';
W_n <= '0';
Status_Ctrl_Operation <= '0';
end case;
end process;
process (GCLK0)
begin
if GCLK0'event and GCLK0 = '1' then
if Reset_CLK0 ='1' then
Status_Ctrl_Operation_buf <= '0';
else
Status_Ctrl_Operation_buf <= Status_Ctrl_Operation;
end if;
end if;
end process;
end arc_QDR_LC_TOP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -