georgy31 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба Прошу сильно не пинать, всего пару месяцев услышал про Верилог. Пытаюсь использовать, но тяжко больно. Появилась задача подать вначале основного кода обнуляющий выходной импульс отрицательной полярности размерностью в два "клока". Код получился на пол страницы, поскольку ресурсы плис ограничены, пришлось использовать наружный триггер защёлку. Наверняка всё должно писаться элементарно. Подскажите как сие организовать. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aat_81 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба На 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'; На верилоге переписать такую конструкцию думаю не составит труда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 (изменено) · Жалоба Собственно, какой сброс вам нужет? если для кода который выходит из ПЛИС наружу то как-то так 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 Возможно второй вариант кода и синтезируется, но хз. я с верилогом только в тестбенчак общаюсь (кстати за синтаксис не ручаюсь). Изменено 7 сентября, 2012 пользователем Кирилл Лубнин Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба Я примерно так и написал, но он не останавливается после 1го импульса, а молотит постоянно. Может его в "initial" можно как то вклинить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба "Примерно так" - это как? уже представлено 3 варианта кода :) Ну. если по моему первому варианту, то я оговорил сразу что предполагается короткий запускающий. Выкладывайте код - будем смотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба always @(posedge alarm) begin if (alarm == 1'b1)end if else begin ( CLK == CLK +2'b10 ) (posedge CLK =0 ); end end Вот у меня такое уродство вышло, но не компилируется, какую то чушь несёт. CLOK - тактовая частота, alarm - сигнал дающий импульс для обнуления системы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба Вам нужен однократный сброс при включении питания, или сигнал сброса должен появляться перед каждым обновлением кода? Приведенный вами код - не синтесируем думаю именно на это рукается компилятор. Во первых условие alarm == 1'b1 не имеет смысла т.к. все, что у вас в блоке always будет происходить в момент перехода сигналла alarm из 0 в 1, т.е. в данном случае сигнал alarm у вас является тактовой частотой. не уверен насчет правильности синтаксита конструкции if else begin ( CLK == CLK +2'b10 ) именно первых трех слов. Далее условие (если это конечно условие) такое впринцепе не может быть выполнено потому что вы пытаетесь сравнить одноразрядный сигнал с самим собой + двухразрядная константа - на физическом уровне это полный абсурд. ну и (posedge CLK =0 ); вот это вообще не понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 (изменено) · Жалоба Если нужно вырабатывать импульс от входного сигнала сброса (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); Как то так... Хотя могу и ошибаться. Изменено 7 сентября, 2012 пользователем Barktail Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба Да я уже перепробовал много вариантов. В лучшем случае, сигнал повторяется многократно. А нужно что бы импульс в пару клоков подавался при подаче управляющей команды (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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 (изменено) · Жалоба стандартное решение выделения фронта широкого сигнала выглядит примерно так: always @(CLK, alarm) begin if(posedge(CLK)) begin reseta = alarm; resetb = reseta; resetc = resetb; end end assign reset = resetc & !reseta; Изменено 7 сентября, 2012 пользователем Кирилл Лубнин Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 8 сентября, 2012 Опубликовано 8 сентября, 2012 · Жалоба Решение конечно красивое, если бы работало. 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; находит ошибку и не компилирует. Что я сделал не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Серпантин 0 8 сентября, 2012 Опубликовано 8 сентября, 2012 · Жалоба Убрать объявление reg reset; либо объявить reset как wire reset; хотя можно не объявлять, т.к. входы/выходы модуля по умолчанию типа wire (цепь). Азы Verilog'а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 8 сентября, 2012 Опубликовано 8 сентября, 2012 · Жалоба Пробовал по всякому. Выдаёт синтаксическую ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lubnin 0 8 сентября, 2012 Опубликовано 8 сентября, 2012 · Жалоба Приведите конкретное сообщение компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
georgy31 0 8 сентября, 2012 Опубликовано 8 сентября, 2012 · Жалоба ... sintax error: endmodule <- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться