2017-05-18 12 views
1

私はISEのLFSRを実装するためにVhdlコード&のテストベンチコードを書いています。 ISE上のこのパスからLFSRコードを取得します。 言語テンプレート - VHDL - 合成構築 - コーディング例--- カウンター--- LFSRVHDL-LFSRを実装

私の問題は、Simulinkの(ISIM)であるが、私はいつもout_lfsrのための 'U' 記号で直面しています。 あなたは私を助けてくれますか?

VHDLコード:

library IEEE; 
     use IEEE.std_logic_1164.all; 
use IEEE.numeric_std.all; 
use IEEE.std_logic_unsigned.all; 



entity lfsr is 

port(rst,clk,clk_en:in std_logic; 
out_lfsr: inout std_logic_vector(31 downto 0); 
init_value:in std_logic_vector(31 downto 0) 
); 

end lfsr; 

architecture Behavioral of lfsr is 


begin 

process(clk) 
begin 
    if (clk'event and clk ='1') then 
     if (rst = '1') then 
     out_lfsr <= init_value; 
     elsif clk_en='1' then 
     out_lfsr(31 downto 1) <= out_lfsr(30 downto 0) ; 
     out_lfsr(0) <= not(out_lfsr(31) XOR out_lfsr(21) XOR out_lfsr(0)); 
     end if; 
    end if; 
end process; 


end Behavioral; 

テストベンチ:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 



ENTITY tb_lfsr IS 
END tb_lfsr; 

ARCHITECTURE behavior OF tb_lfsr IS 

    -- Component Declaration for the Unit Under Test (UUT) 

    COMPONENT lfsr 
    PORT(
     rst : IN std_logic; 
     clk : IN std_logic; 
     clk_en : IN std_logic; 
     out_lfsr : INOUT std_logic_vector(31 downto 0); 
     init_value : IN std_logic_vector(31 downto 0) 
     ); 
    END COMPONENT; 


    --Inputs 
    signal rst : std_logic := '0'; 
    signal clk : std_logic := '0'; 
    signal clk_en : std_logic := '1'; 
    signal init_value : std_logic_vector(31 downto 0) := (others => '1'); 

    --Outputs 
    signal out_lfsr : std_logic_vector(31 downto 0):=(others => '0'); 

    -- Clock period definitions 
    constant clk_period : time := 10 ns; 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 
    uut: lfsr PORT MAP (
      rst => rst, 
      clk => clk, 
      clk_en => clk_en, 
      out_lfsr => out_lfsr, 
      init_value => init_value 
     ); 

    -- Clock process definitions 
    clk_process :process 
    begin 
     clk <= '0'; 
     wait for clk_period/2; 
     clk <= '1'; 
     wait for clk_period/2; 
    end process; 



END; 

答えて

0

あなたはそれを動作させるために、他の中で、このブロックをリセットする必要があります。リセット時、入力値が出力にロードされます。

reset_p: process begin 
    rst <= '1'; 
    wait for 10 * clk_period; 
    rst <= '0'; 
    wait; 
end process; 

は、私はまた、それは常に合成のために適切ではないとして、INOUT使用していますが、out_lfsr値を格納した内部信号を、使用しない方が良いことだと思います。

entity lfsr is 

port(
    rst,clk,clk_en:in std_logic; 
    out_lfsr: out std_logic_vector(31 downto 0); 
    init_value: in std_logic_vector(31 downto 0) 
); 

end lfsr; 

architecture Behavioral of lfsr is 

signal s_out_lfsr : std_logic_vector(31 downto 0); 
begin 

process(clk) 
begin 
    if (clk'event and clk ='1') then 
     if (rst = '1') then 
     s_out_lfsr <= init_value; 
     elsif clk_en='1' then 
     s_out_lfsr(31 downto 1) <= s_out_lfsr(30 downto 0) ; 
     s_out_lfsr(0) <= not(s_out_lfsr(31) XOR s_out_lfsr(21) XOR s_out_lfsr(0)); 
     end if; 
    end if; 
end process; 

out_lfsr <= s_out_lfsr; 

end Behavioral; 

あなたのコードがコード例のとおりです。

+0

ありがとう、それは動作します!:-) –