我想将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;
答案 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));