Jump to content

    
Sign in to follow this  
georgy31

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

На 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';

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by Кирилл Лубнин

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

always @(posedge alarm)

begin

if (alarm == 1'b1)end

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

(posedge CLK =0 );

 

end

end

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Если нужно вырабатывать импульс от входного сигнала сброса (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);

 

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

Edited by Barktail

Share this post


Link to post
Share on other sites

Да я уже перепробовал много вариантов. В лучшем случае, сигнал повторяется многократно. А нужно что бы импульс в пару клоков подавался при подаче управляющей команды (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

 

Share this post


Link to post
Share on other sites

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

always @(CLK, alarm)

begin

if(posedge(CLK))

begin

reseta = alarm;

resetb = reseta;

resetc = resetb;

end

end

assign reset = resetc & !reseta;

Edited by Кирилл Лубнин

Share this post


Link to post
Share on other sites

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

 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; находит ошибку и не компилирует. Что я сделал не так?

Share this post


Link to post
Share on other sites

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

reg reset;

 

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

wire reset;

 

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

Азы Verilog'а.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this