【问题标题】:Counter Not Testing As Expected? [VHDL]计数器未按预期进行测试? [VHDL]
【发布时间】:2014-03-13 01:40:55
【问题描述】:

我正在尝试用 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 counter vhdl waveform


    【解决方案1】:

    知道这是怎么回事吗?

    您的波形与您的测试台激励不匹配。

    在您的波形中显示的信号计数有三个分配(在测试台级别)。对“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 Std 1076-2008 的 VHDL 版本的计数值。对于 -2008 兼容的模拟,您应该只使用 count。请注意,上面显示的模拟将在早期版本的 VHDL 上运行。

    您同样可以将 count_result 设为变量。

    而且我相信您已经知道,根据信号数组的大小,这是一个 5 位计数器,而不是 32 位计数器。转换为后者相对容易。

    【讨论】:

    • 我的意思是二进制数为 32 - 哎呀。不过非常感谢!您的帖子非常有帮助且内容丰富,我学到了很多可以应用于未来的测试! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多