VHDL测试台代码不适用于寄存器

VHDL测试台代码不适用于寄存器,vhdl,fpga,xilinx,Vhdl,Fpga,Xilinx,我想模拟寄存器逻辑,但测试台不工作,当影响输入信号Si、ECi、Ri、Ci时,在Xlinix中运行模拟时,所有信号输入固定为000000000 1,输出固定为zz0,我不知道为什么 这是寄存器的vhdl代码 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; use IEEE.numeric_std.all; entity Regis

我想模拟寄存器逻辑,但测试台不工作,当影响输入信号Si、ECi、Ri、Ci时,在Xlinix中运行模拟时,所有信号输入固定为000000000 1,输出固定为zz0,我不知道为什么

这是寄存器的vhdl代码

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

entity Registre is
    Generic ( N: positive :=10);
    Port ( R : in  STD_LOGIC_VECTOR (N downto 1);
           EC : in  STD_LOGIC_VECTOR (N downto 1); 
           C : in  STD_LOGIC_VECTOR (N downto 1);
           S : in  STD_LOGIC_VECTOR (N downto 1);
           Vss : in  STD_LOGIC_VECTOR (N downto 1);
           Vdd : in STD_LOGIC_VECTOR (N downto 1);
           DA : out  STD_LOGIC_VECTOR (N downto 1));
end Registre;

architecture Behavioral of Registre is

    component SA_REG 
        Port ( EC : in  STD_LOGIC;
               C : in  STD_LOGIC;
               R : in  STD_LOGIC;
               S : in  STD_LOGIC;
               Q : out  STD_LOGIC;
               Vss : in  STD_LOGIC;
               Vdd : in  STD_LOGIC);
    end component;

    Component SA_REGDR
        Port ( R : in  STD_LOGIC;
               C : in  STD_LOGIC;
               EC : in  STD_LOGIC;
               Q : out  STD_LOGIC;
               Vss: in STD_LOGIC;
               Vdd: in STD_LOGIC
           );
    end component;

begin

    DR : SA_REGDR port map ( R=> R(10) ,EC=> EC(10), C=> C(10), Vss=> Vss(10), Vdd=> Vdd(10), Q=> DA(10) );

    Mgen : for i in 1 to N-1 generate
        M : SA_REG port map (R=>R(i), EC=> EC(i), C=> C(i),S=> S(i), Vss=> Vss(i), Vdd=> Vdd(i), Q=> DA(i) ); 
    end generate;

end Behavioral;
试验台:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;

entity Registre_tb is
end Registre_tb;

architecture Behavioral of Registre_tb is
    component Registre
        generic( N : integer :=10);
        Port ( R : in  STD_LOGIC_VECTOR (10 downto 1);
               EC : in  STD_LOGIC_VECTOR (10 downto 1);
               C : in  STD_LOGIC_VECTOR (10 downto 1);
               S : in  STD_LOGIC_VECTOR (10 downto 1);
               Vss : in  STD_LOGIC_VECTOR (10 downto 1);
               Vdd : in STD_LOGIC_VECTOR (10 downto 1);
               DA : out  STD_LOGIC_VECTOR (10 downto 1));
    end component;

    signal  Ri  : STD_LOGIC_VECTOR (10 downto 1):= (others => '0');
    signal  Ci  : STD_LOGIC_VECTOR (10 downto 1):= (others => '0');
    signal  ECi : STD_LOGIC_VECTOR (10 downto 1):= (others => '0');
    signal  Si  : STD_LOGIC_VECTOR (10 downto 1):= (others => '0');
    signal  Vssi: STD_LOGIC_VECTOR (10 downto 1):= (others => '0');
    signal  Vddi: STD_LOGIC_VECTOR (10 downto 1):= (others => '1');
    signal  DAi : STD_LOGIC_VECTOR (10 downto 1);

    signal clk : std_logic := '0';
begin
    -- instanciate 
    component_in_test : Registre port map( --instantiation of the Registre component
        R => Ri,
        C => Ci,
        EC => ECi,
        S => Si,
        Vss => Vssi,
        Vdd => Vddi,
        DA => DAi
    );

    -- stimulis 
    clk <= not clk after 1ns; --creates 100MHz clock inside testbench

    Ri_gen : process(clk) is   --process which will check Ri with every possible value
    begin
        if clk'Event and clk = '1' then
            Ri <= Ri + 1;
        end if;
    end process;

    Ci_gen : process(clk) is   --process which will check Ci with every possible value
    begin
        if clk'Event and clk = '1' then
            Ci <= Ci + 1;
        end if;
    end process;

    ECi_gen : process(clk) is   --process which will check ECi with every possible value
    begin
        if clk'Event and clk = '1' then
            ECi <= ECi + 1;
        end if;
    end process;

    Si_gen : process(clk) is   --process which will check Si with every possible value
    begin
        if clk'Event and clk = '1' then
            Si <= Si + 1;
        end if;
    end process;

end Behavioral;
模拟
调试=将问题降至最低。关于VHDL,您可以将所有内容实例化为实体,如

U1: entity MY_IMPLEMENTATION port map ()
以消除到处声明组件的需要。您可以公开它们的实现,而不是声明SA_REG和SA_REGDR组件

您的SA_REGDR停留在第10位,而N用于SA_REG实例化是可变的。你正在为不一致性奠定基础

输出DAi由SA_REG和SA_REGDR确定,其实现保密。因此,我们不能肯定地回答这个问题。然而,“z”值意味着其中一个输入是。当您增加输入时,输入的低有效位将切换0->1,其驱动程序将启用,以便最低有效输出位切换高阻抗=>具体值。没有足够的信息来解释为什么在中得到0而不是1或其他任何东西


。只有DAi必须是标准逻辑。

请参阅VHDL常见问题解答中关于最长静态前缀的讨论,网址为:

因此,您需要将实例重新编写为:

Mgen  : for i in 1 to N generate  
  If_N : if i = N generate
    DR : SA_REGDR port map ( R=> R(10) ,EC=> EC(10), C=> C(10), Vss=> Vss(10), Vdd=> Vdd(10), Q=> DA(10) ); 
  end generate ; 

  if_OTHERS : if i /= N generate
    M : SA_REG port map (R=>R(i), EC=> EC(i), C=> C(i),S=> S(i), Vss=> Vss(i), Vdd=> Vdd(i), Q=> DA(i) ); 
  end generate ; 
end generate;

非常感谢,它现在可以工作了,通过修改实例,并将信号'Si to 1 signal Si:STD_LOGIC_VECTOR 10向下修正为1:=others=>'1';',但是错误总是出现在输出10 DA10,它固定在ZI,而不是得到它。除第10位外,所有其他位都映射到SA_REG,并且保持不变。发生了什么变化?位1已按预期切换“z”=>“0”。发生了什么变化?不,映射到组件SA_REGDR的位10被切换到“Z”,而不是位1Wait,位10已经是“Z”,它如何切换到它已经是的状态?在您的设计中,所有位最初都是“z”。在第一个时钟之后,位1输入变为1,输出为“0”。这是有争议的。我们为什么要在这里寻找缺陷?为什么我要告诉任何关于第1位转换为“z”的事情?这与第10位和“将其切换到状态“z”有什么关系?我现在明白了,非常感谢,我检查了功能,这是逻辑,我还有其他问题,有什么解释当信号Si固定到其他=>'0'时,所有输出都切换到“z”,除了输出0,?非常感谢您的澄清,我将把实施od sa_REG和sa_rREGDR