【发布时间】:2017-07-10 06:15:34
【问题描述】:
我编写了一个简单的 vhdl 代码,用于在某些条件下通过某些控制信号启用/禁用输出端口。问题是输出信号是 U 或 X,而代码看起来很好。
主要实体如下图所示。第一个进程对rst 敏感,当它为1 时将禁用oe。第二个进程对clk 敏感,并在时钟转换时启用oe。输出值也设置为5。
entity test2 is
port( clk: in std_logic;
rst: in std_logic;
num: out integer range 0 to 7;
oe: out std_logic );
end;
architecture behav of test2 is
begin
process( rst )
begin
if rst = '1' then
oe <= '0';
end if;
end process;
process( clk )
begin
if (clk'event and clk = '1') then
num <= 5;
oe <= '1';
end if;
end process;
end;
现在考虑测试台文件。可以看出,在主进程中,我将连接到rst的r设置为1再设置为0。
entity test2_tb is
end;
architecture behav of test2_tb is
component test2 port( clk: in std_logic;
rst: in std_logic;
num: out integer range 0 to 7;
oe: out std_logic );
end component;
signal c: std_logic := '0';
signal r: std_logic;
signal n: integer range 0 to 7 := 2;
signal o: std_logic;
begin
u1: test2 port map( c, r, n, o );
process( c )
begin
c <= not c after 2ns;
end process;
process
begin
r <= '1';
wait for 4 ns;
r <= '0';
wait for 8 ns;
end process;
end;
虽然r 为1,但连接到oe 的o 设置为U。为什么?而且,在时钟的上升沿,o 的值变成了 X。为什么?请看下面的波浪
【问题讨论】:
-
您之前发布了一个类似的问题,但您删除了该问题证明了同样的问题 - 两个进程驱动一个信号
we。每个具有信号分配的进程都有一个用于该信号的驱动程序。精心设计的网络中的各种驱动程序被分解为一个有效值,该值仅通过分配、强制释放或驱动程序断开来修改。在未解析类型的信号上拥有多个驱动程序是错误的。两个答案都推荐解决方案,从单个进程驱动信号。 Renaud Pacalet 展示了一个符合综合条件的表格。 -
"...虽然代码看起来不错。",这就是你的问题:它没有。在网上找到的许多示例中都描述了您想要创建她的内容。在论坛、教程、Xilinx/IntalAltera 用户指南等上。通过进行一些研究,您可能已经找到了自己的答案。
标签: vhdl