环形计数器测试波形的未定义输出

时间:2011-10-28 15:35:11

标签: counter vhdl flip-flop

我使用D Flip Flop建模了4位环形计数器。

D触发器位于单独的文件中,包含在我的工作区中。 D触发器正常工作(提供正确的输出波形)。

这是响铃计数器的代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ring4counter is
    port (
        clk: std_logic;
        output: out std_logic_vector(3 downto 0));
end ring4counter;

architecture ring4counter_arch of ring4counter is
    component dff
    port (
        clk: std_logic;
        d: in std_logic;
        q: out std_logic;
        qbar: out std_logic);
    end component;

    signal temp:std_logic_vector(3 downto 0):=(others=>'0');
begin
    r1: dff port map(clk, temp(3), temp(0));
    r2: dff port map(clk, temp(0), temp(1));
    r3: dff port map(clk, temp(1), temp(2));
    r4: dff port map(clk, temp(2), temp(3));
    output <= temp;
end ring4counter_arch;

以下是Ring计数器的测试平台代码:

library ieee;
use ieee.std_logic_1164.all;

entity ring4_tb is end ring4_tb ;

architecture arch of ring4_tb is
    component tbc is
    port (
        clk: std_logic;
        output: out std_logic_vector(3 downto 0));
    end component ;

    component dff
    port (
        clk: std_logic;
        d: in std_logic;
        q: out std_logic;
        qbar: out std_logic);
    end component;

    constant period : time := 50 ns ;

    signal clk      : std_logic := '0' ;    
    signal done     : boolean := false ;
    signal output   : std_logic_vector(3 downto 0) ;

    shared variable cycle : natural := 0 ;

    signal temp:std_logic_vector(3 downto 0):=(others=>'0');

begin
-- this is the unit under test
    u1: tbc
    port map(
        clk    => clk,
        output => output) ;

    clkprocess: process(done, clk)
    begin
    if (not done) then
        if (clk = '1') then
        cycle := cycle + 1 ;
        end if ;
        clk <= not clk after period / 2 ;
    end if ;
    end process ;

    r1: dff port map(clk, temp(3), temp(0));
    r2: dff port map(clk, temp(0), temp(1));
    r3: dff port map(clk, temp(1), temp(2));
    r4: dff port map(clk, temp(2), temp(3));
    output <= temp;

    testbench: process
    begin
    wait until (clk = '0') ;
    temp <= "1000";
    wait for period*4 ;

    done <= true ;      -- force the clock process to shutdown
    wait ;          -- this waits forever
    end process ;
end arch ;

但是'输出'的波形对于所有位都是'U'。 我哪里错了?

3 个答案:

答案 0 :(得分:2)

在测试平台过程中,当您尝试将temp初始化为“1000”时,触发器仍然会驱动临时信号,因此您可以有效地进行公交车比赛。

答案 1 :(得分:0)

使用铃声计数器中temp的初始化来设置信号。

请注意,根据您的体系结构和综合工具,这可能无法正确合成。

最通用的方法是向除了on之外的所有DFF添加一个复位信号,并在该DFF上放置一个预置信号。然后在开始时断言复位,这将把DFF设置为一个好的值。

这是一个更简单的代码版本,它可以做到这一点并避免使用显式DFF。您还可以更改temp的宽度,代码将为您完成所有其他操作:

process (clk)
begin
   if reset = '1' then
      temp <= (0=>'1', others => '0'); -- set one bit high, the others low.
   elsif rising_edge(clk) then
      -- take the high bit and move it to the low bit. 
      -- Move the other bits left 1 place
      temp <= temp(temp'high-1 downto 0) & temp(temp'high);
   end if;
end process;

(注意:代码只是在消息中输入,那里可能存在语法拼写错误!)


除非他们属于shared variable类型,否则{BT},protected是一个坏主意。他们可能有竞争条件。

答案 2 :(得分:-1)

要做的一件事是向D触发器添加一个使能信号。当你想复位电路时,使能信号变低,然后将温度改为“1000”。

r1: dff port map(clk, temp(3), temp(0), enable);

process(clk,reset)
begin
if(rising_edge(clk)) then
 if( reset='1') then
  enable='0';
  temp <= "1000";
 else
  enable <= '1';
 end if;
end if;
end process;