我正在尝试在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值和一个红条,如下所示:
知道问题是什么吗?我真的很困惑!
答案 0 :(得分:0)
您的波形与您的测试台刺激不符。
信号计数有三个分配,显示在波形中(在测试台级别)。初始分配给“00000”,以及两个条件分配。来回弹跳是由clk的过程敏感引起的,使用第一个赋值语句在时钟的下一个边沿反弹回“00000”。
在流程语句中,最后一个赋值是生效的赋值。您将其写入“00000”并根据时钟的上升沿有条件地将其更改为count_result。请注意,您实际上并没有使用count_result + 1加载计数,下一个赋值提供了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_result背后的目的是允许在IEEE标准1076-2008之前的VHDL版本内部读取计数值。对于符合-2008标准的模拟,您应该只使用计数。请注意,上面显示的模拟将在早期版本的VHDL上运行。
您也可以将count_result变为变量。
我相信你知道基于信号阵列大小这是一个5位计数器而不是32位计数器。转换为后者相对容易。