2016-09-29 2 views
0

Прежде всего, мне жаль беспокоить вас, ребята, с моим вопросом, но я не могу найти никакого смысла в том, что происходит с моей (ModelSim имитируемой) схемой.Quartus II: простой счетчик, но странное поведение

Вот мой код, просто, как может быть:

LIBRARY ieee; 
    use ieee.std_logic_1164.all; 
    use ieee.numeric_std.all; 

ENTITY Counter IS 
    PORT(
    enable : in std_logic; 
    clk  : in std_logic; 
    count  : out integer range 0 to 255); 
END Counter; 

ARCHITECTURE LogicFunction OF Counter IS 

    signal count_i : integer range 0 to 255; 

begin 

    cnt : process(clk, enable, count_i) 
    begin 
     count <= count_i; 
     if (enable = '0') then 
      count_i <= 0; 
     else 
      count_i <= count_i + 1; 
     end if; 
    end process; 

end LogicFunction; 

Моей проблема: когда я выполнить моделирование синхронизации с ModelSim, с тактовым сигналом, «включен» является первым «0», а затем «1 ', выход («count») остается на ноль все время. Я пробовал много разных вещей, например, «подсчитывать» как вектор, делая всевозможные приведения, но он все равно остается прежним.

Приращение "count_i < = count_i + 1;" Кажется, проблема: я попытался заменить ее чем-то вроде «count_i < = 55», а затем выход изменился (до «55» в предыдущем примере).

Я видел точно такой же прирост в коде на этой странице, например: http://surf-vhdl.com/how-to-connect-serial-adc-fpga/ Я создал проект, моделируется его и ... это работает! Я действительно не понимаю, что сделал парень, которого я не сделал, за исключением кучки «если», которые мне не нужны в моем коде.

Любая помощь будет принята с благодарностью, я потратил как 3 часов проб и ошибок ...

Thanx заранее!

+1

использовать clk, Luke, использовать clk ... –

+0

Только квалифицируйте свое назначение count_i, если вы создаете комбинаторный цикл. Как отмечает Брайан, оператор if в процессе должен принять одобренную форму, обозначающую последовательную логику с использованием края тактового сигнала, а также разрешения. Руководство Quartus II Том 1, «Дизайн и синтез», «Руководства по дизайну», «Рекомендуемые стили кодирования HDL», «Рекомендации по кодированию для регистров и защелок». Пример: «VHDL D-Type Flipflop (Register) с ena, aclr и aload Control Signals (часть 2 из 2)». Опустите нагрузку и очистите. – user1155120

+0

Обратите внимание, что ваша ссылка surf-vhdl показывает 'elsif (rising_edge (i_clk)), затем if (r_counter_clock_ena = '1') then' (замечание условий в операторах if не требует скобок). – user1155120

ответ

1

В дополнение к тому, чтобы не использовать фронт часов для увеличения i_count, вы используете enable как clear, потому что он находится в списке чувствительности и встречается сначала в условии if.

library ieee; 
use ieee.std_logic_1164.all; 
-- use ieee.numeric_std.all; 

entity counter is 
    port(
    enable : in std_logic; 
    clk  : in std_logic; 
    count  : out integer range 0 to 255); 
end counter; 


architecture logicfunction of counter is 

    signal count_i : integer range 0 to 255; 

begin 

    cnt : process (clk) -- (clk, enable, count_i) 
    begin 
     -- count <= count_i; -- MOVED 
     -- if (enable = '0') then -- REWRITTEN 
     --  count_i <= 0; 
     -- else 
     --  count_i <= count_i + 1; 
     -- end if; 
     if rising_edge(clk) then 
      if enable = '1' then 
       count_i <= count_i + 1; 
      end if; 
     end if; 
    end process; 

    count <= count_i; -- MOVED TO HERE 

end architecture logicfunction; 

Ваш код модифицируется, используя нарастающий фронт CLK и требуют включения = «1» до того i_count приращения. Заявление о избыточном использовании, ссылающееся на пакет numeric_std, закомментировано. Единственная числовая операция, которую вы выполняете, - это целое число, и эти операторы предопределены в стандарте пакета.

Обратите внимание на замену, если оператор не окружает его с помощью круглых скобок. Это не язык программирования, и они не нужны.

Назначение счетчика перемещается в параллельное назначение сигнала. Это устраняет необходимость включения i_count в список чувствительности только для обновления счетчика.

Вбрасывание в тестбенча для завершения Miminal Complete and Verifiable Example:

library ieee; 
use ieee.std_logic_1164.all; 

entity counter_tb is 
end entity; 

architecture foo of counter_tb is 
    signal enable: std_logic := '0'; 
    signal clk:  std_logic := '0'; 
    signal count: integer range 0 to 255; 
begin 
DUT: 
    entity work.counter 
     port map (
      enable => enable, 
      clk => clk, 
      count => count 
     ); 
CLOCK: 
    process 
    begin 
     wait for 5 ns; -- 1/2 clock period 
     clk <= not clk; 
     if now > 540 ns then 
      wait; 
     end if; 
    end process; 
STIMULUS: 
    process 
    begin 
     wait for 30 ns; 
     enable <= '1'; 
     wait for 60 ns; 
     enable <= '0'; 
     wait for 30 ns; 
     enable <= '1'; 
     wait; 

    end process; 
end architecture; 

И это дает:

counter_tb.png

Это показывает, что счетчик не счетчик, когда включить '0' и не делает enable = '0' сбросить значение i_count.

Руководство по Quartus II Volume 1 Design and Synthesis не дает примера, использующего фронт тактового сигнала и разрешение без асинхронного четкого или нагрузочного сигнала.

Секрет здесь заключается в том, что внутри условия оператора if, заданного с использованием фронта часов, будет синхронно с часами. Любое внешнее состояние будет асинхронным.

Форма синтеза, подходящая последовательная логика, получена из ныне отозванного стандарта IEEE Std 1076.6-2004 IEEE для регистрации VHDL Синтез уровня передачи (RTL). Используя эти поведенческие описания, вы можете создавать оборудование через синтез, который соответствует моделированию.

Смежные вопросы