Reanimatorr 1 9 сентября, 2012 Опубликовано 9 сентября, 2012 · Жалоба После endmodule добавьте один "enter", ну т.е. перевод строки + возврат каретки. Не знаю почему у меня квартус ругается когда файл заканчивается словом endmodule, хочет чтобы была начата еще одна строка, хотя бы пустая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 (изменено) · Жалоба Решение конечно красивое, если бы работало. ... Добрался я сегодня до инструментария и... действительноничего не работает и не только на моделировании, но и синтезится не правильно. Странно на 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 Изменено 10 сентября, 2012 пользователем Кирилл Лубнин Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Да, теперь начал компилироваться, только на выходе ничего нет почему то, ни малейшего движения. Видимо надо какую то размерность указать. Типа resetb = reseta +1'b1. Или как то иначе? В новой редакции более правдоподобно. Пойду симулировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба можете картинку показать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Нет, ничего не выходит. Надо попробовать через оператор цикла попробовать. Через 3 цикла reset = 0 Примерно так как то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Обратите внимание, что при смене регистров reseta и resetc в строчке assign reset = reseta & !resetc; Формирование импульса будет происходить либо по положителльному, либо по отрицательному перепаду входного сигнала alarm. Также проверте длительность входного сигналла alarm. Ну и попробуйте синтезировать и моделировать синтезированное описание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба если совсем по простому 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Да. Это то что надо. Тем более легко конвертируется из положительного в отрицательный импульс. Только он появляется когда alarm сбрасывается. Как его переделать, что бы появлялся при включении? Что бы не городить внешние инверторы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Либо я не русский, либо я не понял тему; хотя не исключаю и то, и другое =) Из того, что я понял: нужен счетчик 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") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Да. Это то что надо. Тем более легко конвертируется из положительного в отрицательный импульс. Только он появляется когда 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 такта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Да, второй вариант, просто приклеился. Сказка и песня. Будете в Севастополе, напомните мне про коньяк долгу. Уважаемый stu вы всё мыслите правильно, только ваш вариант с определённым начальным состоянием, а надо из любого состояния получить импульс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Да я уже перепробовал много вариантов. В лучшем случае, сигнал повторяется многократно. А нужно что бы импульс в пару клоков подавался при подаче управляющей команды (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 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба Да, второй вариант, просто приклеился. Сказка и песня. Будете в Севастополе, напомните мне про коньяк долгу. Уважаемый 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться