Фон
Целью является разработка сторожевого таймера (WDT) с использованием структурного моделирования с использованием Xilinx. WDT получил триггер запуска, который запускает счетчик, подсчитывает 59 тактов, генерирует импульс с одним тактом, чтобы сообщить о состоянии сброса, и сбрасывает его до 0. Поэтому я сделал следующую диаграмму в фотошопе, чтобы проиллюстрировать компоненты и то, как они должны быть связаны. WDT - это верхний объект.
Schemati c и общая концепция
- CLKN - это тактовый сигнал отрицательного фронта, общий для SR-ff и WDT ( а также счетчик и T-ffs в счетчике)
- Счетчик - это 6-битный двоичный счетчик, состоящий из T-FF
- Шесть T-FF, расположенные каскадом, где вход в первый FF линия часов - это системные часы, а вход часов для оставшихся ffs - это Q от предыдущего T-ff, поэтому ffs переключается через каждые 2i, где i = 0, 1, 2, 3, 4, 5, поэтому он создает двоичный счетчик
- 6 входных и выходных вентилей - это пользовательский элемент и вентиль, выполненный так, что выходной сигнал равен 1, только когда последовательность 111010 является входным (111010 = 58; 0-> 58 = 59 тактовые циклы)
- Когда выход = 1, он сбрасывает SR ff, который сбрасывает счетчик и WDT
- 2 вентилятора и вентиль гарантируют, что счетчик работает только тогда, когда Q = 1 и CLKN установлен
- Q = 1, когда S = 1, когда активирован запуск запуска. Триггер остается на высоком уровне до тех пор, пока WDT не сбросит
- Внешний толстый фрейм представляет WDT
- START, отображающий на Start,
- CLKN, отображающий на CLKN
- Reset_Signal сопоставляется с Send_Reset
Что я пробовал
- Я протестировал каждый компонент отдельно, и они работают соответственно (код для них указан в списке в конце)
- Попытался переключить std_logi c в бит, чтобы избежать значений, отличных от 0 и 1 - не сработало; переключился обратно на std_logi c
- Инициализировал каждый возможный порт и сигнал, чтобы избежать проблем с неинициализированными значениями - работал несколько раз для определенной комбинации, но я никогда не мог дублировать ее
- Я отлаживал компоненты и сигналы на экране формы сигнала ISim
Снимок экрана моделирования
- Не учитываются первые 100 нс
- Значение SR ff не выводит aq или qnot, даже если он показывает постоянное значение 1 и 0; обратите внимание, что для этих двух выходов нет волновых форм, а также для R
- Эта проблема распространяется на вентиль И 2, который выдает постоянный выход 1, даже если входы не 11; он не считывает вывод Q из SR ff; так как выходное значение является константой 1, переход не происходит, поэтому нет часов в счетчике
- Кажется, проблема связана с отображением портов, но я не вижу, что я делаю неправильно. Я имею в виду, это должно быть потому, что я пробовал все остальное (что касается кода), и я изолировал его от сопоставления портов.
- Синтаксических ошибок нет, я, честно говоря, не знаю, что делать делай больше Я застрял на этом около 7 часов и, честно говоря, схожу с ума (недостаток сна не помогает).
Код (основные разделы)
SR FF
entity SR_FF is
Port ( S : in std_logic;
R : in std_logic;
CLKN : in std_logic;
QNOT : out std_logic := '1';
Q : out std_logic := '0');
end SR_FF;
architecture Behavioral of SR_FF is
begin
process(CLKN)
variable imm: std_logic := '0';
begin
if (falling_edge(CLKN)) then
if (S = '0' AND R = '0') then
imm := imm; --no change
elsif (S = '0' AND R = '1') then
imm := '0';
elsif (S = '1' AND R = '0') then
imm := '1';
else
NULL;
end if;
end if;
Q <= imm;
QNOT <= not imm;
end process;
T FF
entity T_FF is
Port ( T : in STD_LOGIC;
CLKN : in STD_LOGIC;
Reset : in STD_LOGIC;
Q : out STD_LOGIC := '0';
Qnot : out STD_LOGIC := '1');
end T_FF;
architecture Behavioral of T_FF is
begin
process(CLKN, Reset)
variable imm: std_logic := '0';
begin
if (Reset = '0') then
if (falling_edge(CLKN)) then
if (T = '0') then
imm := imm; --no change
elsif (T = '1') then
imm := not imm; --toggle
else
NULL;
end if;
end if;
else
imm := '0';
end if;
Q <= imm;
Qnot <= not imm;
end process;
end Behavioral;
SIX BIT COUNTER
entity six_bit_counter is
Port ( CLKN : in STD_LOGIC;
RESET : in STD_LOGIC;
COUNT : out STD_LOGIC_VECTOR (5 downto 0) := "000000");
end six_bit_counter;
architecture Structural of six_bit_counter is
component T_FF
Port ( T : in STD_LOGIC;
CLKN : in STD_LOGIC;
Reset : in STD_LOGIC;
Q : out STD_LOGIC;
Qnot : out STD_LOGIC);
end component;
component OR_two
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
C : out STD_LOGIC);
end component;
signal clk_trigger : std_logic_vector (4 downto 0) := "00000";
signal temp_count : std_logic_vector (5 downto 0) := "000000";
begin
T0: T_FF port map (T => '1', Reset => RESET, CLKN => CLKN, Q => temp_count(0), Qnot => open);
T1: T_FF port map (T => '1', Reset => RESET, CLKN => clk_trigger(0), Q => temp_count(1), Qnot => open);
T2: T_FF port map (T => '1', Reset => RESET, CLKN => clk_trigger(1), Q => temp_count(2), Qnot => open);
T3: T_FF port map (T => '1', Reset => RESET, CLKN => clk_trigger(2), Q => temp_count(3), Qnot => open);
T4: T_FF port map (T => '1', Reset => RESET, CLKN => clk_trigger(3), Q => temp_count(4), Qnot => open);
T5: T_FF port map (T => '1', Reset => RESET, CLKN => clk_trigger(4), Q => temp_count(5), Qnot => open);
//used to duplicate signals; same signal is applied to the clock_input of the flip flops as well as the counter output value
O0: OR_two port map (A => '0', B => temp_count(0), C => clk_trigger(0));
O1: OR_two port map (A => '0', B => temp_count(1), C => clk_trigger(1));
O2: OR_two port map (A => '0', B => temp_count(2), C => clk_trigger(2));
O3: OR_two port map (A => '0', B => temp_count(3), C => clk_trigger(3));
O4: OR_two port map (A => '0', B => temp_count(4), C => clk_trigger(4));
//signal mapped to counter output
O5: OR_two port map (A => '0', B => temp_count(0), C => COUNT(0));
O6: OR_two port map (A => '0', B => temp_count(1), C => COUNT(1));
O7: OR_two port map (A => '0', B => temp_count(2), C => COUNT(2));
O8: OR_two port map (A => '0', B => temp_count(3), C => COUNT(3));
O9: OR_two port map (A => '0', B => temp_count(4), C => COUNT(4));
OA: OR_two port map (A => '0', B => temp_count(5), C => COUNT(5));
end Structural;
WDT
entity WDT is
Port ( CLKN : in STD_LOGIC;
Start : in STD_LOGIC;
Reset_Signal : out STD_LOGIC);
end WDT;
architecture Structural of WDT is
component SR_FF is
Port ( S : in std_logic;
R : in std_logic;
CLKN : in std_logic;
QNOT : out std_logic;
Q : out std_logic);
end component;
component six_bit_counter
Port ( CLKN : in STD_LOGIC;
RESET : in STD_LOGIC;
COUNT : out STD_LOGIC_VECTOR (5 downto 0));
end component;
component AND_six
Port ( A_IN : in STD_LOGIC_VECTOR (5 downto 0);
A_OUT : out STD_LOGIC);
end component;
component AND_two
Port ( A_IN : in STD_LOGIC_VECTOR (1 downto 0);
A_OUT : out STD_LOGIC);
end component;
component OR_two
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
C : out STD_LOGIC);
end component;
signal temp_count : std_logic_vector (5 downto 0) := "000000";
signal send_reset : std_logic := '0'; --coming out of and_six
signal q_temp : std_logic := '0';
signal clk_counter : std_logic := '0';
signal q_not_temp : std_logic := '0';
begin
--58 = 111010
SRFF1: SR_FF port map (S => Start, R =>send_reset, CLKN => CLKN, Q => q_temp, QNOT => q_not_temp);
A1: AND_two port map (A_IN(0) => CLKN, A_IN(1) => q_temp, A_OUT => clk_counter);
C1: six_bit_counter port map (CLKN => clk_counter, Reset => send_reset, COUNT => temp_count);
A2: AND_six port map (A_IN => temp_count, A_OUT => send_reset);
//used to duplicate Reset signal which is mapped to the interal reset signal to reset the counter and SR ff as well as mapped to the WDT output to demonstrate the counter reached its threshold
OR1: OR_two port map (A => '0', B => send_reset, C => Reset_Signal);
end Structural;
Я ценю любую помощь / идеи / предложения. Я бы предпочел не начинать сначала, потому что я уже столько времени потратил на это, но я сделаю это, если придется. Заранее спасибо!