【问题标题】:5 bit D Flip Flop Counter in VHDL Results in undefined resultsVHDL 中的 5 位 D 触发器计数器导致未定义的结果
【发布时间】:2021-09-07 00:18:23
【问题描述】:

我正在尝试使用(上升沿)D 触发器创建this 5 bit up counter,并使用 VHDL 启用复位和 CK,但无论我做什么,返回值始终是未定义的。我可以验证触发器是否完美运行。检查下面的代码:

DFF.vhd

library IEEE;
use IEEE.std_logic_1164.all;

entity DFFis
    port(
        D:  in std_logic; -- Data input
        C:  in std_logic; -- Clock input
        CE:     in std_logic; -- Clock enable
        CLR:    in std_logic; -- Asynchronous reset
        Q:  out std_logic -- Data output
    );
end DFF;


architecture arch of DFF is
    signal q_i: std_logic;
begin
    process(C, CE, CLR)
    begin
        if (CLR='1') then
            Q<='0';
        elsif (rising_edge(C)) and (CE ='1') then
            Q<=D;
        end if;
    end process;
end arch;

counter.vhd

library IEEE;
use IEEE.std_logic_1164.all;

entity counter is
    port (
        C:  in std_logic; 
        CLR:    in std_logic;
        bits: out std_logic_vector(4 downto 0)
    );
end counter;

architecture arch of counter is
    component DFF
        port(
            D:  in std_logic; -- Data input
            C:  in std_logic; -- Clock input
            CE:     in std_logic; -- Clock enable
            CLR:    in std_logic; -- Asynchronouse reset
            Q:  out std_logic -- Data output
        );
    end component;
    signal q: std_logic_vector(4 downto 0); 
    signal nq: std_logic_vector(4 downto 0);
    
begin
    
    bits<=q;
    
    q(0) <= '1';
    nq <= not q;
    
    DFF0: DFF port map (
        D=>nq(0),
        C=>C,
        CE=>'1',
        CLR=>CLR,
        Q=>q(0)
    );
    DFF1: DFF port map (
        D=>nq(1),
        C=>nq(0),
        CE=>'1',
        CLR=>CLR,
        Q=>q(1)
    );
    DFF2: DFF port map (
        D=>nq(2),
        C=>nq(1),
        CE=>'1',
        CLR=>CLR,
        Q=>q(2)
    );
    DFF3: DFF port map (
        D=>nq(3),
        C=>nq(2),
        CE=>'1',
        CLR=>CLR,
        Q=>q(3)
    );
    DFF4: DFF port map (
        D=>nq(4),
        C=>nq(3),
        CE=>'1',
        CLR=>CLR,
        Q=>q(4)
    );
end arch;

出于测试目的,counter_TB.vhd

library IEEE;
use IEEE.std_logic_1164.all;

entity counter_TB is
end counter_TB;

architecture arch of counter_TB is
    component counter
        port(
            C:  in std_logic; 
            CLR:    in std_logic;
            bits: out std_logic_vector(4 downto 0)
        );
    end component;
    signal C: std_logic:='0';
    signal CLR: std_logic:='0';
    signal bits: std_logic_vector(4 downto 0);
begin
    test: counter port map (C=>C, CLR=>CLR, bits=>bits);
    
    process
    begin
        C<='1'; CLR<='0'; 
        wait for 1 us;
        C<='0'; CLR<='0'; 
        wait for 1 us;
        C<='1'; CLR<='0'; 
        wait for 1 us;
    end process;
end arch;

在运行测试台时,我在循环中得到以下结果(我知道它为什么会循环,这不是问题):

Result

我尝试将信号 q 初始化为“00000”和“00001”,但结果是一样的。

【问题讨论】:

    标签: vhdl xilinx


    【解决方案1】:

    此处显示的代码中有三个可观察到的错误。

    首先,DFF 实体声明在 DFF 和 is 之间缺少一个分隔符(空格)。

    其次,在计数器的架构中,信号 q(0) 有两个驱动程序。应该删除对 q(0) 的并发分配。

    第三,测试台没有为 DFF 中的清除提供 CLR = '1' 条件。倒置的“U”就是“U”。

        process
        begin
            C<='1'; -- CLR<='1';
            if now < 1 us then 
                CLR <= '1';
            end if;
            wait for 1 us;
            C<='0'; CLR<='0'; 
            wait for 1 us;
            -- C<='1'; CLR<='0';
            -- wait for 1 us;
        end process;
    

    这会导致:

    (作为在测试台中提供重置的一种方法,此示例更改并不包含所有内容。)

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多