Как отладить красные сигналы в ModelSIM?

11

Я должен спроектировать конечный автомат, используя только вентили NAND для комбинаторной части и D триггеры для последовательной логики. Все должно работать на часах 1 ГГц / 53.

Теперь, прежде чем вы нападаете на меня со словами «мы не сделаем вашу домашнюю работу за вас», позвольте мне сказать вам, что я все отбросил после нескольких дней работы и начал делать все более строго. Я хочу сделать это самостоятельно, но я постоянно получаю случайные неопределенные сигналы в самых простых частях проекта, и это расстраивает.

Итак, прежде всего у меня есть конечный автомат и таблица истинности, которые я сделал для него следующим образом:

Схема конечного автомата и таблица истин для нее

Следующее - это kmaps:

Kmaps

Поскольку для D-триггеров D = Q + разводка комбинаторной логики (как только я соберу ее в упрощенный блок) не должна быть слишком сложной.

Но моя первая проблема возникает на тестовом стенде для Q3 +. Позвольте мне для упрощения изложить здесь быструю диаграмму, которую я составил для Q3 +:

Логическая диаграмма для Q3 +

Позже в посте вы увидите, что в VHDL я фактически назвал входы in1Q3plus в in11Q3plus (11 входов), так как это не последний блок (последний комбинаторный логический блок состоит из четырех блоков Q3 +, Q2 +, Q1 +, Q0 +, связанных между собой на сигналы).

Таким образом, я должен был сделать все, используя ворота NAND, это означает, что я должен был использовать структурный подход. Каждый шлюз в основном основан на логических элементах NAND, а затем усложняется (но только логические элементы AND, OR и NOT структурно записываются из логических элементов NAND). Затем у меня есть логический элемент ИЛИ с 3 входами, логический элемент ИИ с 3 входами и логический элемент ИЛИ с 5 входами (как в примере с логической схемой), каждый из которых основан на предыдущих двух входных логических элементах И & ИЛИ.

Каждый тестовый стенд до Q3plus (диаграмма выше) работал. Моя процедура тестирования заключается в создании сигналов для каждого входа, чтобы я мог удобно просматривать сигналы в окне имитации. Например, у меня есть следующие сигналы для логического элемента И с тремя входами:

process
    begin
a1 <= '0' ; wait for 4ns;
a1 <= '1' ; wait for 4ns;
end process;

process
    begin
b1 <= '0' ; wait for 8ns;
b1 <= '1' ; wait for 8ns;
end process;

process
    begin
c1 <= '0' ; wait for 2ns;
c1 <= '1' ; wait for 2ns;
end process;

И соединения будут выглядеть так:

u1:ANDgate3 port map(A=>a1, B=>b1, C=>c1, fand3=>q1 );

Таким образом, проблема возникает, когда я хочу смоделировать тестовый стенд Q3plus. Кажется, у меня есть ошибка, где она меньше всего ожидается, на тестовом сигнале, который просто переворачивает от 0 до 1 с периодом 2 нс: |. Я опубликую здесь код тестового стенда, еще раз заявив, что все остальные тестовые стенды работали без нареканий:

library ieee;
use ieee.std_logic_1164.all;

entity Q3plusTEST is
end Q3plusTEST;

architecture behavior of Q3plusTEST is
    component Q3plus is
    port(outQ3plus: out std_Logic;
    in1Q3plus: in std_Logic;
    in2Q3plus: in std_Logic;
    in3Q3plus: in std_Logic;
    in4Q3plus: in std_Logic;
    in5Q3plus: in std_Logic;
    in6Q3plus: in std_Logic;
    in7Q3plus: in std_Logic;
    in8Q3plus: in std_Logic;
    in9Q3plus: in std_Logic;
    in10Q3plus: in std_Logic;
    in11Q3plus: in std_Logic);
    end component;

signal a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11, outsignal: std_logic;

begin
    process
    begin
        a1<= '0'; wait for 4ns;
        a1<= '1'; wait for 4ns;
    end process;

    process
    begin
        a2<= '0'; wait for 6ns;
        a2<= '1'; wait for 6ns;
    end process;

    process
    begin
        a3<= '0'; wait for 8ns;
        a3<= '1'; wait for 8ns;
    end process;

    process
    begin
        a4<= '0'; wait for 10ns;
        a4<= '1'; wait for 10ns;
    end process;

    process
    begin
        a5<= '0'; wait for 12ns;
        a5<= '1'; wait for 12ns;
    end process;

    process
    begin
        a6<= '0'; wait for 14ns;
        a6<= '1'; wait for 14ns;
    end process;

    process
    begin
        a7<= '0'; wait for 16ns;
        a7<= '1'; wait for 16ns;
    end process;

    process
    begin
        a8<= '0'; wait for 18ns;
        a8<= '1'; wait for 18ns;
    end process;

    process
    begin
        a9<= '0'; wait for 20ns;
        a9<= '1'; wait for 20ns;
    end process;

    process
    begin
        a10<= '0'; wait for 22ns;
        a10<= '1'; wait for 22ns;
    end process;

    process
    begin
        a1<= '0'; wait for 24ns;
        a1<= '1'; wait for 24ns;
    end process;

    U1: Q3plus port map(in1Q3plus=> a1, in2Q3plus=>a2, in3Q3plus=>a3, in4Q3plus=>a4, in5Q3plus=>a5, in6Q3plus=>a6, in7Q3plus=>a7, in8Q3plus=>a8, in9Q3plus=>a9, in10Q3plus=>a10, in11Q3plus=>a11, outQ3plus=> outsignal); end behavior;

И код для фактического блока Q3plus:

 library ieee;
use ieee.std_logic_1164.all;

entity Q3plus is
    port(outQ3plus: out std_Logic;
    in1Q3plus: in std_Logic;
    in2Q3plus: in std_Logic;
    in3Q3plus: in std_Logic;
    in4Q3plus: in std_Logic;
    in5Q3plus: in std_Logic;
    in6Q3plus: in std_Logic;
    in7Q3plus: in std_Logic;
    in8Q3plus: in std_Logic;
    in9Q3plus: in std_Logic;
    in10Q3plus: in std_Logic;
    in11Q3plus: in std_Logic);
    end Q3plus;

architecture behavior of Q3plus is
    component ORgate5 is
    port(AOR5: in std_logic;
    BOR5: in std_logic;
    COR5: in std_logic;
    DOR5: in std_logic;
    EOR5: in std_logic;
    f5or: out std_logic);
    end component;

    component ANDgate3 is
    port(A: in std_logic;
    B: in std_logic;
    C: in std_logic;
    fand3: out std_logic);
    end component;

    component ANDgate is
    port(xand: in std_logic;
    yand: in std_logic;
    fand: out std_logic);
    end component;

signal z1,z2,z3,z4,z5: std_logic;

begin
    U1: ANDgate port map(xand=> in1Q3plus, yand=> in2Q3plus, fand=> z1);
    U2: ANDgate port map(xand=> in3Q3plus, yand=> in4Q3plus, fand=> z2);
    U3: ANDgate port map(xand=> in5Q3plus, yand=> in6Q3plus, fand=> z3);
    U4: ANDgate port map(xand=> in7Q3plus, yand=> in8Q3plus, fand=> z4);
    U5: ANDgate3 port map(A=> in9Q3plus, B=> in10Q3plus, C=> in11Q3plus, fand3=> z5);
-- urmeaza toate portile de mai sus conectate la OR5
    U6: ORgate5 port map(AOR5=>z1, BOR5=> z2, COR5=> z3, DOR5=> z4, EOR5=> z5, f5or=> outQ3plus);

end behavior;

Испытательный стенд дает следующий результат:

симуляция испытательного стенда

Как видите, первый сигнал имеет странное поведение, следующие сигналы работают нормально, а последний сигнал полностью не определен. Конечно, конечный сигнал, выходной, имеет недостатки.

Мой простой вопрос: как я могу отследить, где сигнал начинает повреждаться? Я чувствую себя полным нубом в этом беспорядке программы, и я действительно хочу закончить это. Заранее спасибо за любой ответ.

Azurium
источник
1
Очень хорошая презентация вопроса. В то время как Modelsim может разрешить, 18nsэто определенно запрещено в стандарте VHDL и останется таковым Есть два отдельных лексических элемента: абстрактный литерал 18и идентификатор ns. См. IEEE Std 1076-2008 15.3 Лексические элементы, разделители и разделители, пара. 4 - «... требуется как минимум один разделитель между идентификатором или абстрактным литералом и смежным идентификатором или абстрактным литералом». Вы могли бы написать свой стимул как один процесс, используя дополнительное время в операторах ожидания. Возможно, он прямо указывал на неразбитый сигнал.
user8352
Не могли бы вы рассказать подробнее о стимулирующей части? Я думаю, что вы сказали то, что я тоже много искал, но ничего не нашел: предупреждения, которые я получаю на каждом тестовом стенде. Вы имеете в виду, что я должен ввести пробел между 18 и нс ? редактировать Подтверждено, что была проблема.
Азуриум

Ответы:

9

Приятно видеть надлежащий тестовый стенд и код, который на самом деле соответствует вопросу для изменения ...

Существует два простых способа повредить сигнал:

  • управляйте этим от нескольких источников сигнала
  • не гони его с любого

Теперь A11 остается «U», предполагая, что у него нет драйвера. В то время как A1 чередует допустимые и недопустимые значения «X», предполагается, что он имеет более одного драйвера.

Имея это в виду, проверьте ваш код, где вы едете A1 и A11.

Вы будете смеяться ...

Чтобы подробнее остановиться на части вопроса «как отлаживать»: вызвав подозрение, что сигналы не были получены от ожидаемых источников, вы можете использовать команду «драйверов» Modelsim для вывода списка драйверов для сигнала. Если бы вы написали чуть более многословный VHDL и пометили каждый процесс, это дало бы вам тот же самый ответ без необходимости просматривать ваш код ...

например

Drive_A1 : process
begin
   a1 <= '0' ; wait for 4ns;
   ... etc
Брайан Драммонд
источник
2
Все это разочарование, которое накапливалось часами, рассмеялось. Также я заслуживаю хорошего шлепка по моему лицу. Испытательный стенд, кажется, работает сейчас!
Азуриум