2017-02-14 25 views
0

Хотя я закончил университетский курс по цифровой логике, я новичок в дизайне VHDL, и я надеюсь, что кто-то может помочь мне создать 2 тактовых сигнала, которые зависят от состояния друг друга.Создание двух тактовых импульсов в VHDL

Я использую тактовую частоту 50 МГц на плате FPGA DE2-115, которая используется для создания тактовой частоты 5 МГц (с именем dclk_5). Тем не менее, симуляция показывает два сигнала, но только до 200 нс времени выполнения и больше не будет работать. Почему симуляция не превышает 200 нс?

техническое описание из 2-х часов:

https://gyazo.com/485e354bf8cfef984757e2014fa8fde3

Альтернатива VHDL Дизайн для тестирования dclk_5 и clk_50 который синтезирует, но моделирование не является правильным:

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

entity DCLK_top is 
port(
    clk_50 : in std_logic; 
    sw   : in std_logic; 
    dclk_5 : out std_logic 
); 

end DCLK_top; 

architecture behaviour of DCLK_top is 
    signal clk_counter   : integer range 0 to 10 := 0; 
    signal dclk_counter   : integer range 0 to 8 := 0; 
    signal dclk_pause_counter : integer range 0 to 7 := 0; 

    signal dclk_pause    : std_logic := '0'; 
    signal clk_pause_counter : integer range 0 to 7 := 0; 

begin 
    dclk_proc : process(clk_50) 
    begin 

     if(clk_50'event and clk_50='1') then 
      clk_counter <= clk_counter+1; 

      if(clk_counter=10) then 
       clk_counter <= 0; 
      end if; 

      if(clk_counter<5) then 
       dclk_5 <= '0'; 
      else 
       dclk_5 <= '1'; 
      end if; 
     end if; 

    end process dclk_proc; 
end architecture behaviour; 

Изображение моделирования:

https://gyazo.com/ad902a9a8066144692f2672484672b8d

+0

Я не знаю много о Quartus, но нет ли там инструмента для создания таких часов, как xilinx? Вы не объясните, в чем ваша конкретная проблема ... код кажется синтезируемым .... Я бы поставил 'start_dclk = '1'' в другой' if'. – ferdepe

+0

Я использовал ModelSim для генерации часов, но проблема в том, что 50 МГц будет работать нормально в любое время, но когда я включаю dclk (5 МГц), вся симуляция остановится после 400 нс, которая равна 1 циклу dclk. Поэтому я предполагал, что проблема в моем дизайне. Я также обновляю сообщение снимками экрана симуляции. – MrMuffins

+0

Ваш вопрос непонятен, каковы результаты и каковы ожидаемые результаты? См. [Как задать хороший вопрос?] (Https://stackoverflow.com/help/how-to-ask) и [Как создать минимальный, полный и проверенный пример] (https://stackoverflow.com/помощь/mcve). Первоначально он рассматривался как [Quartus VHDL ModelSim, не показывающий, что я хочу] (http://electronics.stackexchange.com/questions/286307/quartus-vhdl-modelsim-not-showing-what-i-want) по обмену стеками электротехники, в разделе «Переполнение стека» разные рекомендации по учетным записям. – user1155120

ответ

1

Ну, ваш код не так уж плох, но есть одна проблема.

clk_counter <= clk_counter+1; 
if(clk_counter=10) then 
    clk_counter <= 0; 
end if; 

Так <= назначение не назначается не до конца процесса. Итак, clk_counter - 9 для всего процесса. Он будет установлен в 10, но не до конца процесса, поэтому оператор if не запускается. Итак, следующая оценка процесса, clk_counter - 10. Теперь оператор if-statement/will/trigger. Однако перед этим вы хотите назначить 10 + 1 = 11 для clk_counter .... Но это недопустимо, потому что диапазон clk_counter равен от 0 до 10. Вы можете установить диапазон до 11, и этого не произойдет. но тогда код не делает того, что вы хотите. Итак, лучший код лучше imho. Например:

if(clk_counter<10) then 
    clk_counter <= clk_counter+1; 
else 
    clk_counter <= 0; 
end if; 

Вы также можете отделить назначение dclk от процесса. Например:

dclk <= '0' when (clk_counter<5) else '1'; 

Но это не сбой. Вам лучше назначить свое задание, как вы уже делаете.

+0

p.s. в следующий раз сообщите об ошибке: modelsim сообщит об ошибке при присвоении 11 диапазону от 0 до 10 сигналов. Сообщения об ошибках очень важны! Они уже могли помочь вам решить вашу собственную проблему. – JHBonarius

+0

Если вы посмотрите на волну, 'dclk' активируется на шестом часе, несмотря на то, что он активирован в пятом. Это то, что ваш ответ решает и не решает проблему с симулятором. Тем не менее, я не знаю много Modelsim, но в ISIM 'range' назначения устарели. – ferdepe

+0

Да, конечно. Это связано с тем, что clk_count изменяется на 5 на один такт, но определяется (clk_count <5) - это следующий триггер процесса. поскольку dclk синхронизируется, ему назначается период синхронизации позже. Но это не должно быть большой проблемой. Не могли бы вы ссылаться на заявление, где назначение диапазона устарело? Потому что я не знаю об этом: диапазон отлично подходит для VHDL, иногда даже требуется предотвратить целое число, приводящее к 32-разрядным регистрам в реализации. – JHBonarius