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

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

После endmodule добавьте один "enter", ну т.е. перевод строки + возврат каретки. Не знаю почему у меня квартус ругается когда файл заканчивается словом endmodule, хочет чтобы была начата еще одна строка, хотя бы пустая.

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


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

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

...

 

Добрался я сегодня до инструментария и... действительноничего не работает и не только на моделировании, но и синтезится не правильно. Странно на VHDL'е такой ситуации не возникало. Для правильной симуляции и синтеза нужно поменять порядок назначения регистров на противоположный. Да и описание приведенное Вами будет выдавать импульсы длительностью в 2 такта частоты ALARM. именно этот сигнал считается у Вас тактовой!!! Если Вам нужен сигнал длительностью 2 такта частоты CLK, то вам нужно придерживаться моего описания приведенного выше. Для этого нужен сигнал alarm больше 2-х тактов частоты CLK. Если у вас короткий сигнал - самое простое решение - расширить его на триггерах и функции "ИЛИ".

итоговый код для узкого импульса alarm выглядит так:

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

//reg reset;  
reg reseta;
reg resetb;
reg resetc;
reg alarmb;


always @(posedge clk)
begin
    alarmb = alarm;
end
   
   assign alarmbig = alarm | alarmb;
   
  always @(posedge clk)

begin
  resetc = resetb;
  resetb = reseta;
reseta = alarmbig;
end

assign reset = reseta & !resetc;

endmodule

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

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


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

Да, теперь начал компилироваться, только на выходе ничего нет почему то, ни малейшего движения. Видимо надо какую то размерность указать. Типа resetb = reseta +1'b1. Или как то иначе?

 

В новой редакции более правдоподобно. Пойду симулировать.

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


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

Нет, ничего не выходит. Надо попробовать через оператор цикла попробовать. Через 3 цикла reset = 0 Примерно так как то.

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


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

Обратите внимание, что при смене регистров reseta и resetc в строчке assign reset = reseta & !resetc; Формирование импульса будет происходить либо по положителльному, либо по отрицательному перепаду входного сигнала alarm. Также проверте длительность входного сигналла alarm. Ну и попробуйте синтезировать и моделировать синтезированное описание.

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


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

если совсем по простому

module imp2gen(clk,alarm,RST);
    input clk;
    input alarm;
    output RST;
    reg [2:0] cnt;
    
    always @ (posedge clk)
        cnt <=alarm?3'b110:{1'b0,cnt[2:1]};
    assign RST=cnt[0];    
endmodule

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


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

Да. Это то что надо. Тем более легко конвертируется из положительного в отрицательный импульс. Только он появляется когда alarm сбрасывается. Как его переделать, что бы появлялся при включении? Что бы не городить внешние инверторы.

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


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

Либо я не русский, либо я не понял тему; хотя не исключаю и то, и другое =)

Из того, что я понял: нужен счетчик 0, 1, 2 и на этом стоп(снимаем разрешение count>=2); когда он меньше 2 - держим на ресете отрицательный сигнал

reg reset;
reg [1:0] cnt;

initial
   reset <= 1'b0;

always @ (posedge clk)
   if (cnt<=1)
      cnt <= cnt + 2'd1;
   else
      reset <= 1'b1;

cnt: 00001 22222222 (начальное состояние = "0")

clk: -_-_-_-_ (начальное состояние = "1")

reset: ____---- (начальное состояние = "0")

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


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

Да. Это то что надо. Тем более легко конвертируется из положительного в отрицательный импульс. Только он появляется когда alarm сбрасывается. Как его переделать, что бы появлялся при включении? Что бы не городить внешние инверторы.

 

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

 

module imp2gen(clk,alarm,RST);
    input clk;
    input alarm;
    output RST;
    reg [2:0] cnt;
    
    always @ (posedge clk)
        cnt <=alarm?{1'b0,cnt[2:1]}:3'b110;
    assign RST=cnt[0];    
endmodule

 

если не держится, тогда как вариант, продлить alarm на двух триггерах на 2 такта

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


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

Да, второй вариант, просто приклеился. Сказка и песня. Будете в Севастополе, напомните мне про коньяк долгу.

 

Уважаемый stu вы всё мыслите правильно, только ваш вариант с определённым начальным состоянием, а надо из любого состояния получить импульс.

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


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

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

для асинхронной команды (т.е. команды приходящей из другого тактового домена)

 

module reset_synchronizer
#(
 parameter int pLENGTH = 4
)
(
 clk             ,
 reset_carry_in  ,
 reset_in        ,
 reset_out
);

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 input  logic  clk           ;
 input  logic  reset_in      ;
 input  logic  reset_carry_in;
 output logic  reset_out     ;

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 logic [pLENGTH-1:0] reset_srl;

 //------------------------------------------------------------------------------------------------------
 //
 //------------------------------------------------------------------------------------------------------

 always_ff @(posedge clk or posedge reset_in) begin : reset_shift_register
   if (reset_in)
     reset_srl <= '1;
   else
     reset_srl <= (reset_srl << 1) | reset_carry_in;
 end

 assign reset_out = reset_srl[$high(reset_srl)];

endmodule

для команды из синхронного домена будет чуть по другому %)

 

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


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

Да, второй вариант, просто приклеился. Сказка и песня. Будете в Севастополе, напомните мне про коньяк долгу.

 

Уважаемый stu вы всё мыслите правильно, только ваш вариант с определённым начальным состоянием, а надо из любого состояния получить импульс.

reg reset;
reg [1:0] cnt;

always @ (posedge clk)
   if (cnt<=1)
   begin
      cnt <= cnt + 2'd1;
      reset <= 1'b0;
   end
   else
      reset <= 1'b1;

еще что-то писали про разрешающий сигнал

input wire alarm;

reg reset;
reg ena;
reg [1:0] cnt;

initial
   ena = 1'b0;

always @ (posedge clk)
   if (alarm)
      ena <= 1'b1;

always @ (posedge clk)
   if (cnt<=2'd1 & ena)
   begin
      cnt <= cnt + 2'd1;
      reset <= 1'b0;
   end
   else
      reset <= 1'b1;

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


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

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

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

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

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

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

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

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

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

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