Компоненты VHDL работают отлично отдельно; возникают проблемы с их соединением в верхнем объекте - PullRequest
0 голосов
/ 22 февраля 2020

Фон

Целью является разработка сторожевого таймера (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;

Я ценю любую помощь / идеи / предложения. Я бы предпочел не начинать сначала, потому что я уже столько времени потратил на это, но я сделаю это, если придется. Заранее спасибо!

...