Проблема асинхронного встречного обратного действия VHDL - PullRequest
0 голосов
/ 24 сентября 2018

У меня проблема со следующим кодом, представляющим общий асинхронный счетчик.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity ASYNC_COUNTER is
    generic(NBIT:integer);
        port(
            CLK : in std_logic;
            COUNT : out std_logic_vector(NBIT-1 downto 0)
        );
end entity ASYNC_COUNTER;

architecture architectural of ASYNC_COUNTER is

    component FF is
    port(   INPUT, CLK: in std_logic;
            OUTPUT, NOUTPUT: out std_logic
    );
end component FF;

signal q: std_logic_vector(NBIT-1 downto 0);
signal retroaction: std_logic_vector(NBIT-1 downto 0);
signal first_in: std_logic := '0';

begin

ARCH: for i in 0 to NBIT-1 generate
    FIRST:if i=0 generate
        F1: FF
        port map(first_in, CLK, q(0), retroaction(0));
    end generate FIRST;
    first_in <= retroaction(0);
    OTHER:if i>0 generate
        F: FF
        port map(retroaction(i), q(i-1), q(i), retroaction(i));
    end generate OTHER;
end generate;

COUNT <= q;

end architecture architectural;

Конечно, проблема заключается в обратной реакции, но я не знаю, как реализовать ее другими способами.Есть предложения?

1 Ответ

0 голосов
/ 24 сентября 2018

В этой части вашего кода:

OTHER:if i>0 generate
    F: FF
    port map(retroaction(i), q(i-1), q(i), retroaction(i));
end generate OTHER;

Вы используете retroaction(i) в качестве ввода.Этот сигнал никогда не устанавливается с известным значением.При запуске этот сигнал равен «U», и на каждом такте (фактически q(i-1) циклов) он получает (не «U») значение «U».

Решение состоит в том, чтобы инициализировать сигнал обратной реакциидо 0 в объявлении:

signal retroaction: std_logic_vector(NBIT-1 downto 0) := (others => '0');
...