как посчитать 4us с тактовой частотой 8 МГц в VHDL? - PullRequest
0 голосов
/ 24 мая 2011

Мне нужно проверить активность автобуса до 4us.Поэтому мне нужно посчитать это.И тактовая частота составляет 8 МГц.Пожалуйста, помогите мне в этом.

Будет ли работать следующий код?

process(sync_dw_reg,data_edge) 
begin 
 if(rst_n='1' or data_edge='1' )then 
    gapen<='0'; 
 elsif(falling_edge(sync_dw_reg))then 
    gapen<='1'; 
 end if; 
 end process; 

 process(dec_clk,sync_dw_reg,rst_n,gapen) 
 begin 
 if(rst_n='1')then 
    gapcnt<="000000"; 
 elsif(gapen='1')then 
  if(dec_clk'event and dec_clk='1')then
     if(gapcnt="111111")then 
        gaperr_bit<='1'; 
     elsif(data_edge='1')then --if this condition comes within 4us then no setting of error 
        gaperr_bit<='0'; 
        gapcnt<="000000"; 
     else gapcnt<=gapcnt+'1';
     end if; 
  end if; 
 end if;

end process;

1 Ответ

3 голосов
/ 24 мая 2011

В общем, определите, сколько тактов 4us работает на вашей тактовой частоте.

Еще лучше, пусть VHDL сделает всю работу за вас. Если у вас есть глобальный пакет для вашего дизайна с константой, равной такту:

constant clock_period : time := 125 ns;

затем вы можете сделать:

constant bus_timeout_for_example : natural := 4 us / clock_period;

Затем создайте целочисленную переменную в вашем процессе. Увеличивайте его каждый такт. Когда он достигнет значения, которое вы рассчитали выше, это конец ваших 4-х нас.

EDIT: Теперь вы опубликовали код некоторых комментариев:

  • Не используйте std_logic_vectors для арифметики - http://parallelpoints.com/node/3
  • Сделайте все это синхронным с одним сигналом clk (т. Е. Dec_clk - это все, что у вас есть в списке чувствительности) - если вам нужно обнаружить «края» в других сигналах, сохраните их и сопоставьте их в следующем тактовом цикле, чтобы увидеть, изменился Вызов * _edge более чем одного сигнала во всем вашем проекте вызывает проблемы (как у новичка). Тогда gapen может быть переменной внутри одного процесса. И отметьте gapen внутри «синхронизированной» части.
  • Используйте переменную, вычисленную как я описываю, и целочисленного типа - тогда вы можете сравнить с числами: if gapcnt = bus_timeout then
...