⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qdr_lc_top.vhd

📁 XILINX memory interface generator. XILINX的外部存储器接口。
💻 VHD
📖 第 1 页 / 共 2 页
字号:
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 + -