VHDL状态机测试台-在板上工作,但在模拟上不工作

VHDL状态机测试台-在板上工作,但在模拟上不工作,vhdl,simulation,test-bench,Vhdl,Simulation,Test Bench,我的VHDL实现在板上工作,它检测序列01110,并将为2个时钟计数升起一个标志。它还检测重叠序列,其中011011110将两次升起标志 我已经用板上的逻辑分析器检查了我的实现,并且对它的工作相当有信心。我以0111的重复序列以10 kHz的频率馈电,在电路板上,它有一个100 MHz的时钟,我用一个预分频器将其缩放到10 kHz 我的问题是,当尝试使用模拟重新创建类似场景时,我没有得到预期的任何输出 来自逻辑分析仪的图像来自电路板 来自测试台的图像 试验台代码 library IEEE; u

我的VHDL实现在板上工作,它检测序列01110,并将为2个时钟计数升起一个标志。它还检测重叠序列,其中011011110将两次升起标志

我已经用板上的逻辑分析器检查了我的实现,并且对它的工作相当有信心。我以0111的重复序列以10 kHz的频率馈电,在电路板上,它有一个100 MHz的时钟,我用一个预分频器将其缩放到10 kHz

我的问题是,当尝试使用模拟重新创建类似场景时,我没有得到预期的任何输出

来自逻辑分析仪的图像来自电路板

来自测试台的图像

试验台代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test_FSM_prac4 is
--  Port ( );
end test_FSM_prac4;

architecture Behavioral of test_FSM_prac4 is

component FSM_prac4 is 
    port ( 
       inputSignal : in STD_LOGIC;
       pushButton : in  STD_LOGIC;
       clk100mhz : in STD_LOGIC;
       logic_analyzer : out STD_LOGIC_VECTOR (7 downto 0);
       LEDs: out STD_LOGIC
); end component;

signal inputSignal : std_logic := '0';
signal pushButton: std_logic := '0';
signal clk100mhz: std_logic := '0';
signal logic_analyzer: std_logic_vector(7 downto 0);
signal LEDs : std_logic;

begin

uut : FSM_prac4 port map(
    inputSignal => inputSignal,
    pushButton => pushButton,
    clk100mhz => clk100mhz,
    logic_analyzer => logic_analyzer,
    LEDs => LEDs
    );

--generate clock 100mhz
clock_tic: process begin
    loop
    clk100mhz <= '0';
    wait for 5ns;
    clk100mhz <= '1';
    wait for 5ns;
    end loop;
end process;

input_changes: process begin
    loop
    inputSignal <= '0';
    wait for 100us;
    inputSignal <= '1';
    wait for 100us;
    inputSignal <= '1';
    wait for 100us;
    inputSignal <= '1';
    wait for 100us;
    end loop;
end process;   

end Behavioral;
试验台代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity test_scaler_clk is
--  Port ( );
end test_scaler_clk;

architecture Behavioral of test_scaler_clk is

    component scaler_clk Port ( 
            pushButton : in std_logic;
            indicator : out std_logic;
           --input clock
           clk100mhz : in STD_LOGIC;
           clk10khz: out STD_LOGIC
           );end component;

    signal clk100mhz: std_logic := '0';
    signal clk10khz : std_logic;
    signal pushButton: std_logic;
    signal indicator :  std_logic;

begin

uut: scaler_clk port map(
    pushButton => pushButton,
    indicator => indicator,
    clk100mhz => clk100mhz,
    clk10khz => clk10khz
    );    

    pushButton <= '0';
    clock_tic: process begin
        loop
        clk100mhz <= '0';
        wait for 5ns;
        clk100mhz <= '1';
        wait for 5ns;
        end loop;
    end process;


end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体测试\u scaler\u clk是
--港口();
结束测试(定标器)(时钟);;
test_scaler_clk的架构是
组件缩放器时钟端口(
按钮:在标准逻辑中;
指示灯:输出标准逻辑;
--输入时钟
clk100mhz:标准_逻辑中;
clk10khz:输出标准_逻辑
);端部元件;
信号clk100mhz:std_逻辑:='0';
信号clk10khz:标准_逻辑;
信号按钮:标准逻辑;
信号指示器:标准逻辑;
开始
uut:scaler_clk端口映射(
按钮=>按钮,
指标=>指标,
clk100mhz=>clk100mhz,
clk10khz=>clk10khz
);    

按钮您可以(应该)在代码中改进几点。正如Brian已经解释的,在
scaler\u clk
行为架构中,您应该具备:

if(masterReset = '1') then
而不是:

if(masterReset <= '1') then
process (clk100mhz,masterReset) begin
    if(masterReset = '1') then
        clockScalers <= "0000000000000";
        newClock <= '0';
        indicator <= '1';
    elsif (clk100mhz'event and clk100mhz = '1')then
        indicator <= '0';
        clockScalers <= clockScalers + 1;
        if(clockScalers > prescaler) then
            newClock <= not newClock;
            clockScalers <= (others => '0');
        end if;
    end if;
end process;
process(clk10khz)
begin
    if rising_edge(clk10khz) then
        register <= register_input;
    end if;
end process;
  • 使用实体实例化而不是组件:

    uut: entity work.scaler_clk(Behavioral) port map...
    
  • 现在,让我们看一下代码中可以改进的其他方面:

  • 您使用的是非标准软件包,这些软件包通常甚至不兼容:
    IEEE.STD\u LOGIC\u ARITH
    IEEE.STD\u LOGIC\u UNSIGNED
    。因为它们不是标准的,所以它们甚至不应该在标准
    IEEE
    库中。您应该改用IEEE.NUMERIC\u STD
  • ,并且只使用该选项。它声明
    有符号
    无符号
    类型(与
    STD\u LOGIC\u VECTOR
    声明相同),并重载它们上的算术运算符

  • 您的测试台通过以下方式生成100MHz时钟:

    clock_tic: process begin
        loop
        clk100mhz <= '0';
        wait for 5ns;
        clk100mhz <= '1';
        wait for 5ns;
        end loop;
    end process;
    
    这保证了
    inputSignal
    在时钟上升沿之后发生变化。您可以用更优雅的方式重写它(并且可能更易于维护):

    使用:

    10KHz信号:标准逻辑;
    ...
    过程(clk100mhz,主复位)开始
    如果masterReset='1'),则
    
    时钟标度器明显不同:对数an以相同的速率显示时钟和刺激,而在TB中它们的速率不同。现在我们不知道你的组件的内部结构,所以我们无法进一步追踪这种差异。是的,在电路板上我有一个100mhz的输入时钟,我将它缩小到10khz的输出,然后反映在逻辑分析仪上(1),我正在为我的fsmI使用10khz时钟,我试图通过生成100mhz时钟在测试台上模拟相同的事情。它应该在TB上的逻辑分析仪(1)上显示10khz时钟,但不显示。我想知道这是因为我的synthex还是我遗漏了一些东西还有,我输入序列在电路板上是10khz,我也在尝试模拟,然后你必须开始调试模拟。首先将10kHz时钟与其他波形一起显示。
    clock_tic: process begin
        loop
        clk100mhz <= '0';
        wait for 5ns;
        clk100mhz <= '1';
        wait for 5ns;
        end loop;
    end process;
    
    clock_tic: process
    begin
        clk100mhz <= '0';
        wait for 5ns;
        clk100mhz <= '1';
        wait for 5ns;
    end process clock_tic;
    
    input_changes: process
    begin
        inputSignal <= '0';
        for i in 1 to 10000 loop
            wait until rising_edge(clk100mhz);
        end loop;
        inputSignal <= '1';
        for i in 1 to 10000 loop
            wait until rising_edge(clk100mhz);
        end loop;
        inputSignal <= '1';
        for i in 1 to 10000 loop
            wait until rising_edge(clk100mhz);
        end loop;
        inputSignal <= '1';
        for i in 1 to 10000 loop
            wait until rising_edge(clk100mhz);
        end loop;
    end process input_changes;
    
    input_changes: process
        constant values: std_logic_vector(0 to 3) := "0111";
    begin
        for i in values'range loop
            inputSignal <= values(i);
            for i in 1 to 10000 loop
                wait until rising_edge(clk100mhz);
            end loop;
        end loop;
    end process input_changes;
    
    process (clk100mhz,masterReset) begin
        if(masterReset = '1') then
            clockScalers <= "0000000000000";
            newClock <= '0';
            indicator <= '1';
        elsif (clk100mhz'event and clk100mhz = '1')then
            indicator <= '0';
            clockScalers <= clockScalers + 1;
            if(clockScalers > prescaler) then
                newClock <= not newClock;
                clockScalers <= (others => '0');
            end if;
        end if;
    end process;
    
    signal tick10khz: std_ulogic;
    ...
    process(clk100mhz, masterReset) begin
        if masterReset = '1') then
            clockScalers <= "0000000000000";    
            tick10khz <= '0';
        elsif rising_edge(clk100mhz) then
            clockScalers <= clockScalers + 1;
            tick10khz <= '0'
            if(clockScalers > prescaler) then
                tick10khz <= '1';
                clockScalers <= (others => '0');
            end if;
        end if;
    end process;
    
    process(clk10khz)
    begin
        if rising_edge(clk10khz) then
            register <= register_input;
        end if;
    end process;
    
    process(clk100mhz)
    begin
        if rising_edge(clk100mhz) then
            if tick10khz = '1' then
                register <= register_input;
            end if;
        end if;
    end process;