柜台未按预期进行测试? [VHDL]

时间:2014-03-13 01:40:56

标签: testing counter vhdl waveform

我正在尝试在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值和一个红条,如下所示:

Testing Output

知道问题是什么吗?我真的很困惑!

1 个答案:

答案 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;

给出这个:

counter32 running

计数算术中没有必要结束的原因是由于无符号“+”运算符的工作原理,在包体中调用了numeric_std的unsigned_add。在标量增量中你需要担心结束计数。

计数(模式输出) count_result背后的目的是允许在IEEE标准1076-2008之前的VHDL版本内部读取计数值。对于符合-2008标准的模拟,您应该只使用计数。请注意,上面显示的模拟将在早期版本的VHDL上运行。

您也可以将count_result变为变量。

我相信你知道基于信号阵列大小这是一个5位计数器而不是32位计数器。转换为后者相对容易。