Неопределенный выходной сигнал теста счетчика кольца - PullRequest
1 голос
/ 28 октября 2011

Я смоделировал 4-битный счетчик звонков, используя D Flip Flop.

Триггер 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;

Вот код тестового стенда для счетчика звонков:

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 ]

2 голосов
/ 28 октября 2011

В процессе тестового стенда, когда вы пытаетесь инициализировать временное значение «1000», триггеры все еще управляют временным сигналом, так что вы фактически продолжаете бой на автобусе.

0 голосов
/ 30 октября 2011

Используйте инициализацию temp в вашем кольцевом счетчике для настройки сигнала.

Обратите внимание, что это может не правильно синтезироваться в зависимости от вашей архитектуры и инструмента синтеза.

Наиболее общий способ сделать это состоит в том, чтобы добавить сигнал сброса ко всем 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 s - плохая идея, если они не относятся к protected типам.У них могут быть условия гонки.

0 голосов
/ 29 октября 2011

Одна вещь, которую нужно сделать, это добавить сигнал включения к 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;
...