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