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