схема цифровой цепи для мультиплексора кольцевого счетчика vhdl

У меня есть эта схема, которую я хочу реализовать в vhdl. Есть тактовый вход, и какое тактовое событие последовательно изменяет вывод 1. 0001 -> 0010 -> 0100 -> 1000...

мультиплексор часов

Мне интересно, каков правильный подход к этому. Я мог бы сделать это с несколькими ifs и elsifs и целочисленным сигналом счетчика. Извините за нубский вопрос, есть ли название для такой схемы?


person Ratata Tata    schedule 28.11.2014    source источник
comment
Вы возможно ищете счетчик Джонсона. Ищите это и решайте сами.   -  person user_1818839    schedule 29.11.2014


Ответы (1)


Судя по вашему описанию, это был счетчик звонков. Твои ворота кажутся лишними:

library ieee;
use ieee.std_logic_1164.all;

entity ring_counter is
    port (
        clk:    in  std_logic;
        q:      out std_logic_vector (0 to 3)
    );
end entity;

architecture your_representation of ring_counter is
    signal qint: std_logic_vector (0 to 3) := "0000";
    signal all_zero:        std_logic;
begin
YOURS:
    process(clk)
    begin
        if rising_edge(clk) then
            qint(0) <= qint(3);
            qint(1) <= all_zero or qint(0);
            qint (2 to 3) <= qint(1 to 2);
        end if;
    end process;

    all_zero <= '1' when qint = "0000" else
                '0';

    q <= (qint(0) or all_zero) & qint(1 to 3);
end architecture;

С испытательным стендом:

library ieee;
use ieee.std_logic_1164.all;

entity ring_counter_tb is
end entity;

architecture foo of ring_counter_tb is
    signal clk:     std_logic := '0';
    signal q:       std_logic_vector(0 to 3);
begin
DUT:
    entity work.ring_counter(your_representation)
        port map (
            clk => clk,
            q => q
        );
CLOCK:
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if Now > 200 ns then
            wait;
        end if;
    end process;

end architecture;

Дает:

ваше представление в VHDL (кликабельно)

В то время как классический счетчик звонков:

architecture classic of ring_counter is
    signal qint: std_logic_vector (0 to 3) := "1000";
begin
RING_CTR:
    process(clk)
    begin
        if rising_edge(clk) then
            qint <= qint(3) & qint(0 to 2);
        end if;
    end process;

    q <= qint;

end architecture;

(и модифицированный испытательный стенд):

    entity work.ring_counter(classic)

дает:

ring counter classic (кликабельно)

А стартовая фаза - это все в начальном состоянии.

person Community    schedule 29.11.2014