Vhdl 试验台误差

Vhdl 试验台误差,vhdl,fpga,xilinx,Vhdl,Fpga,Xilinx,我是vhdl的初学者。我试图写一个VHDL代码来描述交通灯的行为。它有3个信号输出:黄色(0)、绿色(1)和红色(2)。最初,灯是黄色的。它将在10秒钟后变为绿色。40纳秒后绿色变为红色,60纳秒后红色变为黄色。状态机没有任何外部输入,是一个由10ns时钟同步的自由运行机器(总时间段=10ns)。红绿灯有一个外部重置控制信号,用于将灯重置为黄色。我需要向测试台显示2次重置情况和无符号十进制格式的自由运行输出信号 vhdl代码在强制时钟和删除testbench中rst_进程的代码时运行良好,但te

我是vhdl的初学者。我试图写一个VHDL代码来描述交通灯的行为。它有3个信号输出:黄色(0)、绿色(1)和红色(2)。最初,灯是黄色的。它将在10秒钟后变为绿色。40纳秒后绿色变为红色,60纳秒后红色变为黄色。状态机没有任何外部输入,是一个由10ns时钟同步的自由运行机器(总时间段=10ns)。红绿灯有一个外部重置控制信号,用于将灯重置为黄色。我需要向测试台显示2次重置情况和无符号十进制格式的自由运行输出信号

vhdl代码在强制时钟和删除testbench中rst_进程的代码时运行良好,但testbench的rst_进程未按预期工作(在模拟中未定义)

这是主要的vhdl代码

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

entity traf is
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           Green : out  STD_LOGIC;
           Red : out  STD_LOGIC;
           Yellow : out  STD_LOGIC);
end traf;

architecture Behavioral of traf is

signal count:integer range 0 to 10 := 0;
signal state:integer range 0 to 2 := 0;
begin
    process(clk, rst)
    begin
        if(rst = '1') then
            state <= 0;
            Red <= '0';
            Green <= '0';
            Yellow <= '1';
            count <= 0;
        elsif clk'event and clk='1' then
        case state is
        when 0 =>  --Yellow Light
        if(count=1) then
            count <= 0;
            state <= 1;
        else
            count <= (count + 1);
            Red <= '0';
            Green <= '0';
            Yellow <= '1';
        end if;

        when 1 =>  --Green Light
        if(count=4) then
            count <= 0;
            state <= 2;
        else
            count <= count + 1;
            Red <= '0';
            Green <= '1';
            Yellow <= '0';
        end if;

        when 2 =>  --Red Light
        if(count=6) then
            count <= 0;
            state <= 0;
        else
            count <= count + 1;
            Red <= '1';
            Green <= '0';
            Yellow <= '0';
        end if;

        when others =>
            state <= 0;
            count <= 0;
        end case;
        end if;
    end process;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体traf是
端口(时钟:在标准逻辑中;
rst:标准逻辑中;
绿色:输出标准逻辑;
红色:输出标准逻辑;
黄色:输出标准(U逻辑);
结束交通;
traf的体系结构是
信号计数:整数范围0到10:=0;
信号状态:整数范围0到2:=0;
开始
过程(时钟、rst)
开始
如果(rst='1'),则

说明DUT实例化应使用
而不是
分开赋值,即
clk=>clk,
明白了…现在新未注释的rst\u进程代码出现问题,您必须定义问题所在当我为rst\u进程添加代码时,它不起作用,即在simulationok中显示“未定义”.问题现在已解决。谢谢@user1155120和@trarryèjeff。您的DUT实例化应该用
而不是
分开赋值,即
clk=>clk,
明白了…现在新未注释的rst\u进程代码出现问题,您必须定义问题所在当我为rst\u进程添加代码时,它不起作用,即在simulationok中显示“未定义”.问题现在已解决。谢谢@user1155120和@travely_jeff
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

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

architecture Behavioral of tb is
signal clk,rst,Green,Red,Yellow:std_logic;
constant clk_period : time:=10 ns;
component traf is
     Port (  
              clk : in  STD_LOGIC;
              rst : in  STD_LOGIC;
              Green : out  STD_LOGIC;
              Red : out  STD_LOGIC;
              Yellow : out  STD_LOGIC
           );
 end component;
begin
DUT:traf PORT MAP
(
    clk=>clk,
    rst=>rst,
    Green=>Green,
    Red=>Red,
    Yellow=>Yellow
);

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

rst_process:process
begin
    rst <= '0';
    wait for clk_period * 15;

    rst <= '1';
    wait for clk_period;

    rst <= '0';
    wait for clk_period * 50;

    rst <= '1';
    wait for clk_period*2;

    rst <= '0';
    wait;
end proocess;

end Behavioral;