3-битный счетчик VHDL: сообщение об ошибке 3363, 1408

Я хочу реализовать 3-битный счетчик в VHDL, схема которого показана на рисунке.

http://i.stack.imgur.com/OoD7F.jpg

Когда я реализую код, я получил следующие сообщения об ошибках:

--Фактическое значение, связанное с формальным режимом OUT. Сигнал 'Q' может не быть преобразованием типа или вызовом функции

--Операция не может быть связана с формальным режимом OUT.

Я получил эти три сообщения об ошибках для связи выхода D-триггера и сигналов.

в FF1 Q => не q0

в FF2 Q => не q1

в FF3 Q => не q2

Вот код VHDL для 3-битного счетчика:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity counter_3bit_alt is
    Port ( clk : in  STD_LOGIC;
           clr : in  STD_LOGIC;
           Qout : out  STD_LOGIC_VECTOR (2 downto 0));
end counter_3bit_alt;

architecture Behavioral of counter_3bit_alt is

    component D_FlipFlop is
    Port ( clk : in  STD_LOGIC;
           clr : in  STD_LOGIC;
           D : in  STD_LOGIC;
           Q : out  STD_LOGIC);
end component;

signal q0, q1, q2 : std_logic;

begin

    FF1 : D_FlipFlop
        port map(
            clk => clk,
            clr => clr,
            D => q0,
            Q => not q0
        );

    FF2 : D_FlipFlop
        port map(
            clk => q0,
            clr => clr,
            D => q1,
            Q => not q1     );

    FF3 : D_FlipFlop
        port map(
            clk => q1,
            clr => clr,
            D => q2,
            Q => not q2
        );

        Qout <= q2&q1&q0;
end Behavioral;

Код VHDL для D Flip Flop:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity D_FlipFlop is
    Port ( clk : in  STD_LOGIC;
           clr : in  STD_LOGIC;
           D : in  STD_LOGIC;
           Q : out  STD_LOGIC);
end D_FlipFlop;

architecture Behavioral of D_FlipFlop is
begin
    process(clk, clr)
        begin
            if (clr = '1') then
                q <= '0';
            elsif(rising_edge(clk)) then
                q <= D;
            end if;
    end process;

end Behavioral;

person Umit Guden    schedule 17.09.2016    source источник
comment
Схематический триггер имеет 2 выхода, триггер VHDL — только один. Сообщения об ошибках в конечном итоге являются следствием этой ошибки.   -  person user_1818839    schedule 17.09.2016


Ответы (1)


В D_FlipFlop порту Q есть выход. Выход должен быть назначен сигналу, а не оператору. Назначьте выход сигналу, затем инвертируйте его, чтобы он был входом для порта D.

Вот предложение

signal q0, q1, q2 : std_logic;
signal not_q0, not_q1, not_q2 : std_logic;

begin

FF1 : D_FlipFlop
    port map(
        clk => clk,
        clr => clr,
        D => not_q0,
        Q => q0
    );
not_q0 <= not q0;

FF2 : D_FlipFlop
    port map(
        clk => q0,
        clr => clr,
        D => not_q1,
        Q => q1
    );
not_q1 <= not q1;

FF3 : D_FlipFlop
    port map(
        clk => q1,
        clr => clr,
        D => not_q2,
        Q => q2
    );
not_q2 <= not q2;

Qout <= q2 & q1 & q0;
end Behavioral;
person Thanushan    schedule 21.09.2016
comment
Вы правы, за исключением следующего: not_q0 ‹= not q0. not_q1 ‹= не q1 not_q2 ‹= не q2 - person Umit Guden; 21.09.2016
comment
Вы можете сделать D => (not q0), потому что D — это входной порт. - person Thanushan; 22.09.2016