Структурный 4-битный кольцевой счетчик с D-триггером. VHDL / GHDL
Я не знаю, как это сделать со структурным программированием...
"Двоичный счетчик (с сигналом сброса) из 4 битов, выполненный из 4 D триггеров".
Как подключить входы / выходы?
Вот объявления сущности. Суть проблемы - в последних строках.
--FFD
entity FFD is
port( CLK, D, reset : in STD_LOGIC;
Q : out STD_LOGIC
);
end FFD;
architecture behaviour of FFD is
begin
process(CLK, reset)
begin
if reset='1' then Q<='0';
elsif (clk'event and clk='1') then Q<=D;
else null;
end if;
end process;
end behaviour;
----------------------------------------------------------
--counter
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity counter is
port(clk : in std_logic;
reset : in std_logic;
count : out std_logic_vector(3 downto 0));
end entity counter;
architecture rtl of counter is
--
component FFD
port (CLK, D, reset : in STD_LOGIC;
Q : out STD_LOGIC);
end component;
signal q0,q1,q2: std_logic:='0';
signal q3: std_logic:='1';
begin
--
---
inst1: FFD port map (CLK=>clk, D=>q3, reset=>reset, Q=>q0);
inst2: FFD port map (CLK=>clk, D=>q0, reset=>reset, Q=>q1);
inst3: FFD port map (CLK=>clk, D=>q1, reset=>reset, Q=>q2);
inst4: FFD port map (CLK=>clk, D=>q2, reset=>reset, Q=>q3);
inst5: count<=q3&q2&q1&q0;
end architecture rtl;
Моя проблема в этих последних строках.
Спасибо!
2 ответа
Там нет проблем с вашими подключениями (они правильно образуют счетчик звонка), но вы не увидите, что многое произойдет. После сброса все ваши триггеры содержат ноль, который будет циркулировать по кольцу с каждым тактовым импульсом, но на самом деле никогда не вызывает изменения выходов. Присвоение значения по умолчанию '1' для q3, когда вы объявляете сигнал, будет перекрыто фактическим выходом триггера, как только ваша схема начнет работать (или имитировать), и, как правило, является неправильным способом инициализации оборудования,
Вам необходимо убедиться, что когда вы устанавливаете сигнал сброса, ваше оборудование переходит в соответствующее состояние (то есть: один бит установлен, все остальные сброшены). Один из способов сделать это - использовать FF с установленным входом для Q3. Если у вас нет триггера с установленным (вместо сброса) сигналом, вы можете смоделировать его, установив инверторы на входе и выходе, что обеспечит "1" для тактирования вокруг вашего счетчика звонков, когда вы применить сброс. Вы также можете создать несколько промежуточных сигналов и создать мультиплексор для входов D, чтобы создать загружаемый счетчик или любое из множества других решений...
Я думаю, что проблема в другом.
Я думаю, что ваш D-триггерный выход Q должен иметь направление порта как inout(или буфер), а не как out. Это потому, что выход также действует как вход. я думаю, что это должно быть тщательно прослежено при выполнении структурного моделирования.
порт (CLK, D, сброс: в STD_LOGIC; Q: вход в STD_LOGIC);
но, пожалуйста, проверьте, я не уверен,
Счетчик Джонсона также является кольцевым счетчиком, см. этот код VHDL для Счетчика Джонсона, который использует стиль структурного моделирования.