Перейти к содержанию
    

Как описать подачу одного импульса?

Прошу сильно не пинать, всего пару месяцев услышал про Верилог. Пытаюсь использовать, но тяжко больно. Появилась задача подать вначале основного кода обнуляющий выходной импульс отрицательной полярности размерностью в два "клока". Код получился на пол страницы, поскольку ресурсы плис ограничены, пришлось использовать наружный триггер защёлку. Наверняка всё должно писаться элементарно. Подскажите как сие организовать. Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На VHDL например так можно:

 

process(CLK)
begin
  if rising_edge(CLK) then
    if (RST = '1') then
      cnt <= "10";
    elsif cnt /= "00" then
      cnt <= cnt - '1';
    end if;
  end if;
end process;

pulse <= '1' when cnt = "00" else '0';

 

На верилоге переписать такую конструкцию думаю не составит труда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно, какой сброс вам нужет?

если для кода который выходит из ПЛИС наружу то как-то так

always @(CLK)
begin
   if(posedge(CLK))
   begin   
     reseta = 'сигнал старта кода';
     resetb = reseta;
   end
end
assign reset = reseta | resetb;

код приведен из расчета что импульс запуска кода длительностью в один такт. если больше - нужно будет доработать.

 

если для кода который Входит в ПЛИС (читай тестовый сигналл), то так:

always @(posedge 'сигнал запуска кода')
  begin
     reset = 1;
    @(posedge CLK);
    @(posedge CLK);
    reset = 0;
  end

Возможно второй вариант кода и синтезируется, но хз. я с верилогом только в тестбенчак общаюсь (кстати за синтаксис не ручаюсь).

Изменено пользователем Кирилл Лубнин

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я примерно так и написал, но он не останавливается после 1го импульса, а молотит постоянно. Может его в "initial" можно как то вклинить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Примерно так" - это как? уже представлено 3 варианта кода :)

Ну. если по моему первому варианту, то я оговорил сразу что предполагается короткий запускающий. Выкладывайте код - будем смотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always @(posedge alarm)

begin

if (alarm == 1'b1)end

if else begin ( CLK == CLK +2'b10 )

(posedge CLK =0 );

 

end

end

 

Вот у меня такое уродство вышло, но не компилируется, какую то чушь несёт. CLOK - тактовая частота, alarm - сигнал дающий импульс для обнуления системы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Приведенный вами код - не синтесируем думаю именно на это рукается компилятор. Во первых условие alarm == 1'b1 не имеет смысла т.к. все, что у вас в блоке always будет происходить в момент перехода сигналла alarm из 0 в 1, т.е. в данном случае сигнал alarm у вас является тактовой частотой. не уверен насчет правильности синтаксита конструкции if else begin ( CLK == CLK +2'b10 ) именно первых трех слов. Далее условие (если это конечно условие) такое впринцепе не может быть выполнено потому что вы пытаетесь сравнить одноразрядный сигнал с самим собой + двухразрядная константа - на физическом уровне это полный абсурд. ну и (posedge CLK =0 ); вот это вообще не понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужно вырабатывать импульс от входного сигнала сброса (RST) тогда (почти как e ув. aat_81, но там код немного надо поправить).

begin
  if rising_edge(CLK) then
    if (RST = '1') then
      cnt <= "110";
    elsif cnt /= "000" then
      cnt <= '0'&cnt(2 downto 1);
    end if;
  end if;
end process;
pulse <=  cnt(0);

Если вырабатывать нужно при включении питания, тогда вход RST заменяем на сигнал, вводим для сигналов pulse и RST начальное состояние '1', и код немного модернизируем

process(CLK)
begin
  if rising_edge(CLK) then
    if (RST = '1') then
      cnt <= "11";
      RST <= '0';
    elsif cnt /= "00" then
      cnt <= '0'&cnt(1);
    end if;
  end if;
end process;

pulse <=  cnt(0);

 

Как то так... Хотя могу и ошибаться.

Изменено пользователем Barktail

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я уже перепробовал много вариантов. В лучшем случае, сигнал повторяется многократно. А нужно что бы импульс в пару клоков подавался при подаче управляющей команды (alarm) для обнуления всего остального и вывода новых данных на дисплей. Не при включении питания, а именно при подачи команды.

 

 

always @(posedge alarm or clk)

begin

if (alarm ==1)

begin (clk = clk + 2'b01)

end else begin

clk >= 2'b11; end

begin

clk = 2'b00;

end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

стандартное решение выделения фронта широкого сигнала выглядит примерно так:

always @(CLK, alarm)

begin

if(posedge(CLK))

begin

reseta = alarm;

resetb = reseta;

resetc = resetb;

end

end

assign reset = resetc & !reseta;

Изменено пользователем Кирилл Лубнин

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение конечно красивое, если бы работало.

 module  one
  (clk, alarm,reset);
    input clk;    
    input alarm;
    output reset;

reg reset;  
reg reseta;
reg resetb;
reg resetc;
   
  always @(posedge clk or posedge alarm)

begin
if(alarm == 1'b1)
begin 
reseta = alarm;
resetb = reseta;
resetc = resetb;
end
end
assign reset = resetc & !reseta; 

endmodule

 

У меня получилась такая запись. Но в строчке assign reset = resetc & !reseta; находит ошибку и не компилирует. Что я сделал не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убрать объявление

reg reset;

 

либо объявить reset как

wire reset;

 

хотя можно не объявлять, т.к. входы/выходы модуля по умолчанию типа wire (цепь).

Азы Verilog'а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приведите конкретное сообщение компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...