[英]Counter Not Testing As Expected? [VHDL]
我正在尝试在VHDL中创建一个32位计数器。 下面是我的代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY counter32 IS
PORT (en, clk, clr: IN STD_LOGIC;
count: OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END counter32;
ARCHITECTURE rtl OF counter32 IS
SIGNAL count_result: STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
counter32: PROCESS(clk, clr)
BEGIN
count <= "00000"; --Initialize counter to all zeroes
IF (clr = '0') THEN
count_result <= "00000";
ELSIF (clk = '1' and clk'EVENT) THEN
IF (en = '1') THEN
count <= STD_LOGIC_VECTOR(unsigned(count_result) + 1);
count <= STD_LOGIC_VECTOR(count_result);
ELSIF (count_result = "11111") THEN
count_result <= "00000";
END IF;
END IF;
END PROCESS counter32;
END rtl;
我的测试台代码在这里:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter32_tb is
end counter32_tb;
architecture io of counter32_tb is
component counter32 is
port(en,clk,clr:in std_logic; count:out std_logic_vector(4 downto 0));
end component;
for all: counter32 use entity work.counter32(rtl);
signal en,clk,clr:std_logic;
signal count:std_logic_vector(4 downto 0);
begin
count <= "00000";
g0: counter32 port map(en,clk,clr,count);
p0: process
begin
en <= '1';
clk <= '0';
clr <= '1';
wait for 10ns;
en <= '1';
clk <= '1';
clr <= '1';
wait for 10ns;
en <= '1';
clk <= '0';
clr <= '1';
wait for 10ns;
en <= '1';
clk <= '1';
clr <= '1';
wait for 10ns;
en <= '1';
clk <= '0';
clr <= '1';
wait for 10ns;
en <= '1';
clk <= '1';
clr <= '0';
end process;
end io;
但是,每当我进行测试时,加1都会在测试中提供'U'STD_LOGIC值和红色条,如您在此处看到的:
知道是怎么回事吗? 我真的很困惑!
您的波形与您的测试台激励不匹配。
信号计数共有三项分配,它们似乎显示在波形中(在测试台水平上)。 初始分配为“ 00000”,以及两个条件分配。 来回跳动是由对clk的过程敏感引起的,使用第一个赋值语句在时钟的下一个沿跳回“ 00000”。
在流程声明中,最后一项分配是生效的分配。 您将其写入“ 00000”,然后根据时钟的上升沿有条件地将其更改为count_result。 请注意,您实际上也没有以count_result + 1加载count,下一个分配提供了count_result的当前值。 在我们讨论主题时,也不需要将类型转换为std_logic_vector,count_result已经是std_logic_vector。
时钟沿处未知的(红色)“闪烁”是因为您实际上尚未清除count_result。 clr上唯一的事件是从“ U”到“ 1”,并且不会清除。
vhdl设计代码无法用作计数器。
这个:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter32 is
port (
en, clk, clr: in std_logic;
count: out std_logic_vector(4 downto 0)
);
end counter32;
architecture rtl of counter32 is
signal count_result: std_logic_vector(4 downto 0);
begin
counter: process(clk, clr)
begin
if clr = '0' then
count_result <= (others => '0');
elsif clk = '1' and clk'event and en = '1' then
count_result <= std_logic_vector(unsigned(count_result) + 1);
end if;
end process;
count <= count_result;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
entity counter32_tb is
end entity;
architecture foo of counter32_tb is
signal en: std_logic:= '0';
signal clr: std_logic:= '1';
signal clk: std_logic:= '0';
signal count: std_logic_vector (4 downto 0);
begin
DUT: entity work.counter32
port map (
en => en,
clk => clk,
clr => clr,
count => count
);
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
if Now > 720 ns then
wait;
end if;
end process;
STIMULUS:
process
begin
clr <= '0';
en <= '1';
wait for 20 ns;
clr <= '1';
wait for 20 ns;
wait for 20 ns;
wait for 20 ns;
wait for 20 ns;
wait for 20 ns;
en <= '0';
wait for 20 ns;
en <= '1';
wait;
end process;
end architecture;
给出以下内容:
计数算术中不需要结束符的原因是由于无符号“ +”运算符的工作方式,在程序包主体中为numeric_std调用了unsigned_add。 最终计数是您需要担心的标量增量。
具有count(模式输出) 和 count_result的目的在于,允许在IEEE Std 1076-2008之前的VHDL版本内部读取计数值。 对于符合-2008的模拟,您应该只使用count。 请注意,上面显示的模拟将在VHDL的早期版本上运行。
您也可以将count_result设置为变量。
而且我相信您知道根据信号阵列的大小,这是一个5位计数器而不是32位计数器。 转换为后者相对容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.