vhdl代码不符合预期

时间:2014-10-23 13:35:04

标签: vhdl

我想将num作为8位输入,然后在每个时钟上升沿移位,并在输出“res”上输出。代码如下所示。但是在模拟时它没有给出预期的结果。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity shiftreg is
    port (
    num : in std_logic_vector (7 downto 0);
    clk : in std_logic; 
    res : out std_logic_vector (7 downto 0)
    );
end entity;

architecture behav of shiftreg is 
    signal temp_num : std_logic_vector (7 downto 0):= "00000000"; 
begin
    process(num) 
    begin
        if(num' event) then
            temp_num <= num;
            res<=temp_num; 
        end if;
    end process;

    process(clk) 
    begin
        if(rising_edge(clk)) then
            temp_num <= shr(temp_num,"01");
            res<=temp_num;
        end if;
    end process;
end behav;

1 个答案:

答案 0 :(得分:1)

输出res和信号temp_num都来自两个 进程,因此模拟器将做分辨率,这很可能导致 部分或全部位的X值。

一般来说,信号和输出是应该驱动的设计模块 只有一个过程,因为这也是综合工具所期望的。对于 测试台,然后可能有多个驱动程序。

因此,如果意图是应反映num输入的任何更改 立即到res输出,以及clk的任何后续上升边缘应该 导致右移,那么这两个过程可以组合在一起 处理并分配给res,如:

process (num, clk) is
begin
  if (num'event) then
    temp_num <= num;
  elsif (rising_edge(clk)) then
    temp_num <= shr(temp_num, "01");
  end if;
end process;
res <= temp_num;

这将在模拟中起作用,但'event在合成中不起作用 通常没有可以感知'event等值变化的硬件,所以 结构不能通过综合映射到硬件。

因此,对于可综合设计,您可以考虑添加load输入:

load : in  std_logic;

并使用此方法加载内部temp_num,其过程如下:

process (clk) is
begin
  if (rising_edge(clk)) then
    if load = '1' then
      temp_num <= num;
    else
      temp_num <= shr(temp_num, "01");
    end if;
  end if;
end process;
res <= temp_num;

最后,您应该考虑删除use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;,因为这两个包不是标准的 VHDL包,尽管位于IEEE库中。只需删除这两个 行,然后使用shift_right中的std_logic_unsigned函数 像:

temp_num <= std_logic_vector(shift_right(unsigned(temp_num), 1));