2016-03-22 3 views
0

Я проектирую ворота для парковки в VHDL. Когда я имитирую его с использованием файлов Quartus VWF, я получаю неизвестные значения (X), но я не знаю почему.Неизвестные значения (X) при моделировании ворот парковки

В принципе, вам просто нужно подтвердить свою карточку (Sin), и ворота откроются на 10 секунд. И когда автомобиль выходит из автостоянки (Sout), он подсчитывает общее количество автомобилей в данный момент на стоянке. Я создал сигнал Ncarros (для подсчета количества автомобилей) и s_count для таймера.

Все готово правильно. Но когда я тестирую его с помощью файла VWF, это то, что я получаю:

Cropped simulation output

Original simulation output

Я использую Altera Quartus Prime Lite Edition.

Может кто-нибудь проверить мой код и рассказать мне, что я делаю неправильно?

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.NUMERIC_STD.all; 

entity MicroProj is 
    port (clk  : in std_logic; 
      Sin  : in std_logic; 
      Sout  : in std_logic; 
      cancela : out std_logic; 
      timerOut : out std_logic); 

end MicroProj; 

architecture Behavioral of MicroProj is 

    signal Ncarros : integer := 0; 
    signal s_count : integer := 0; 

begin 
    process (Sin,Sout,clk) 
    begin 
     if (Sin = '0') then 
      cancela <= '0'; 
     else 
      if (Ncarros < 99) then 
       Ncarros <= Ncarros + 1; 
       cancela <= '1'; 

       if(rising_edge(clk)) then 
        if(s_count /= 0) then 
         if(s_count = 499999999) then 
          timerOut <= '1'; 
          s_count <= 0; 
         else 
          timerOut <= '0'; 
          s_count <= s_count + 1; 
         end if; 
        else 
         timerOut <= '0'; 
         s_count <= s_count + 1; 
        end if; 
       end if; 
      end if; 
     end if; 

     if (Sout ='1') then 
      Ncarros <= Ncarros - 1; 
     end if; 
    end process; 


end Behavioral; 
+0

SO не подходит для вашего "вопроса". Для просмотра кода используйте http://codereview.stackexchange.com/. О, и вы не показываете нам тестовый стенд, который используете. – damage

+1

Создание testbench, который соответствует событиям в вашем файле waveform на clk, Sin и Sout. Я получаю другой [результат] (http://i.stack.imgur.com/eTHE9.png). У вас, похоже, проблема с использованием инструмента или проблема с методом применения имитационного стимула. Также обратите внимание, что Ncarros не управляется часовым событием и вместо этого увеличивает каждый раз уникальное событие в элементе списка senstivity. – user1155120

+0

Вы не являетесь [минимальным, полным и проверяемым примером] (http://stackoverflow.com/help/mcve), не предоставляя способ дублирования проблемы, отображаемой в вашем файле формы волны. – user1155120

ответ

0

При имитации с векторным Waveform File (ФВ), Quartus-II фактически моделирует поведение синтезированного списка соединений (проверено здесь с Quartus-II 13.1). Если вы не выполнили шаг «Анализ & Синтез», Quartus просит это сделать. Вы должны всегда выполните этот шаг вручную, когда вы измените файлы VHDL перед повторным имитацией VWF. Синтезированный список соединений списывается как код Verilog, который будет вводить симулятор ModelSim. Вы можете найти его в файле simulation/qsim/microproj.vo.

Пока Quartus сообщает о предупреждениях (или ошибках), поведение синтезированного дизайна может отличаться от описания VHDL. И это здесь, как указано ниже. Чтобы напрямую моделировать поведение вашего описания VHDL, вам нужно написать тестовый стенд.

Следующий испытательный стенд будет хорошим стартером. Он назначает те же входные значения, что и в вашем файле VWF за первые 200 нс. Вам нужно будет расширить код в указанном месте, чтобы добавить больше переходов сигнала.

library ieee; 
use ieee.std_logic_1164.all; 

entity microproj_tb is 
end entity microproj_tb; 

architecture sim of microproj_tb is 

    -- component ports 
    signal clk  : std_logic := '0'; 
    signal Sin  : std_logic; 
    signal Sout  : std_logic; 
    signal cancela : std_logic; 
    signal timerOut : std_logic; 

begin -- architecture sim 

    -- component instantiation 
    DUT: entity work.microproj 
    port map (
     clk  => clk, 
     Sin  => Sin, 
     Sout  => Sout, 
     cancela => cancela, 
     timerOut => timerOut); 

    -- clock generation 
    clk <= not clk after 10 ns; 

    -- waveform generation 
    WaveGen : process 
    begin 
    Sin <= '0'; 
    Sout <= '0'; 
    wait for 40 ns; -- simulation time = 40 ns 
    Sin <= '1'; 
    wait for 70 ns; -- simulation time = 110 ns 
    Sin <= '0'; 
    wait for 50 ns; -- simulation time = 160 ns 
    Sin <= '1'; 

    -- Extend here to add more signal transistions 
    wait; 
    end process WaveGen; 
end architecture sim; 

Quartus Prime Lite Edition включает в себя установку ModelSim Altera Edition. Вы можете настроить и запустить симуляцию с помощью ModelSim непосредственно в настройках проекта Quartus. Результаты моделирования для первых 200 нс, используя мой испытательный стенд выглядит следующим образом:

simulation output

Как вы видите, на выходе отличается от симуляции файла ФВ, так как дизайн VHDL сам моделируется в настоящее время.


В коде VHDL вы описали защелки для сигналов cancela и Ncarros а также сообщенных «Анализ & Синтеза» шаг:

Warning (10492): VHDL Process Statement warning at MicroProj.vhdl(26): signal "Ncarros" is read inside the Process Statement but isn't in the Process Statement's sensitivity list 
Warning (10492): VHDL Process Statement warning at MicroProj.vhdl(27): signal "Ncarros" is read inside the Process Statement but isn't in the Process Statement's sensitivity list 
Warning (10492): VHDL Process Statement warning at MicroProj.vhdl(48): signal "Ncarros" is read inside the Process Statement but isn't in the Process Statement's sensitivity list 
Warning (10631): VHDL Process Statement warning at MicroProj.vhdl(21): inferring latch(es) for signal or variable "cancela", which holds its previous value in one or more paths through the process 
Warning (10631): VHDL Process Statement warning at MicroProj.vhdl(21): inferring latch(es) for signal or variable "Ncarros", which holds its previous value in one or more paths through the process 

Info (10041): Inferred latch for "Ncarros[0]" at MicroProj.vhdl(20) 
Info (10041): Inferred latch for "Ncarros[1]" at MicroProj.vhdl(20) 
Info (10041): Inferred latch for "Ncarros[2]" at MicroProj.vhdl(20) 
... 
Info (10041): Inferred latch for "Ncarros[31]" at MicroProj.vhdl(20) 
Info (10041): Inferred latch for "cancela" at MicroProj.vhdl(20) 

На Altera FPGA, защелки реализованы с использованием look- (LUT) и комбинационный канал обратной связи в логическом элементе (LE).Состояние такой защелки не определено после программирования FPGA. Моделирование синтезированного списка соединений показывает это как «X'es».

Я рекомендую все же зафиксировать защелки и превратить ваш код в полностью синхронный, ориентированный на часы дизайн. То есть назначьте новые значения cancela и Ncarros только при нарастающем фронте часов. Код кода VHDL:

process(clk) 
begin 
    if rising_edge(clk) then 
    -- put all your assignments to cancela and Ncarros here 
    end if; 
end process; 
+0

IEEE Std 1076.6-2004 (RTL Synth, снято) 5. Методика проверки, параграф 2 * Процесс проверки результатов синтеза с использованием имитации состоит в применении эквивалентных входных данных как для исходной модели, так и для синтезированной модели, а затем для сравнения их результатов, чтобы гарантировать, что они эквивалентны. Эквивалент в этом контексте означает, что инструмент синтеза должен создать схему, эквивалентную на входных, выходных и двунаправленных портах модели .... * См. 1.2.2 Соответствие инструментам c) (требует проверки). Этот синтез не был бы совместимым (из-за комбинаторной фиксации). – user1155120