Lubnin
Участник-
Постов
31 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о Lubnin
-
Звание
Участник
- День рождения 24.06.1986
Контакты
-
Сайт
Array
-
ICQ
Array
Информация
-
Город
Array
-
Задача была "факультативная" ("Попробовать перевести критические куски проекта"). Поэтому была перебита текущей работой и заброшена. Сейчас порылся - у меня вариант с использованием мегафункции. Следовательно вопрос остался открытым. Похоже самый оптимальный вариант это использовать generic по рекомендации TRILLER.
-
Спасибо, Andrew Su все работает :a14: . Но пока ковырялся обнаружил такой нюанс: При моделировании блока памяти с использованием тестбенча (не важно VHDL или Verilog) все работает как надо, а при попытке моделирования с использованием команд среды (force, run и т.д.) при чтении данные на шину dat не выставляются и шина остается в третьем состоянии. Кто-нибудь вкурсе в чем дело?
-
Длительность импульсов записи и чтения по 100 нс. В принципе ничего не мешает взять стандартную и моделировать нетлист, но почему мое описание не работает? где я ошибся, я ведь не синтезирую его. Память не суть какая, в работе циклы записи и чтения разнесены по времени.
-
Как правильно описать память?
Lubnin опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Добрый день, уважаемые коллеги! в целях отладки мне требуется имитация внешней памяти, для чего мной было написано следующее описание: `timescale 1ns/1ps module RAM (DAT, ADRESS, CE, WE, OE, read, test_dat); input [14:0] ADRESS; inout [7:0] DAT; input CE; input OE; input WE; output read; output test_dat; reg [7:0] mas [0:32767]; wire read; assign read = OE | CE; assign DAT = !read ? mas[ADRESS] : 8'bZ; assign test_dat = mas[ADRESS]; always @(negedge WE) begin if (!CE) #5 mas[ADRESS] = DAT; end endmodule Вроде бы описание простейшее и все понятно, но не понятно почему не работает. Прилагаю диаграммы. Вопроса собственно два: 1. Почему не происходит запись во втором случае (когда выставлены данные и СЕ = 0)? 2. Почему не происходит чтение, дже тех же иксов, (когда ОЕ и read равны 0)? -
на двух частотах 37,5 и 40 реализован нониусный метод измерения временнЫх задержек.
-
Вроде разобрался. Оказалась банальная невнимательность. В процессе доработок каким-то образом покарежил цыфровую часть системы ФАПЧ, расположенную в ПЛИС (странно, вроде бы этот блок вообще не трогал). В итоге ФАПЧ вместо 37,5 генерил что придется. Сейчас все поправил - все работает. Всем спасибо за активное участие и полезные советы. :a14:
-
Обратите внимание, что при смене регистров reseta и resetc в строчке assign reset = reseta & !resetc; Формирование импульса будет происходить либо по положителльному, либо по отрицательному перепаду входного сигнала alarm. Также проверте длительность входного сигналла alarm. Ну и попробуйте синтезировать и моделировать синтезированное описание.
-
можете картинку показать?
-
Добрался я сегодня до инструментария и... действительноничего не работает и не только на моделировании, но и синтезится не правильно. Странно на 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
-
Приведите конкретное сообщение компилятора.
-
Вот тут крепко подумать надо. Вроде бы ничего такого нет все шины данных переходят вместе с сигналами записи, и при этом данные появляются на несколько тактов раньше записи т.е таких ситуаций с неполным защелгиванием быть не должно. Но на всякий случай еще раз проверю в понедельник. Да и при такой ситуации он бы вылетал постоянно, а не только после компиляции с изменениями. Там частоты близкие 40 и 37,5 они за 15/16 тактов полностью сходятся и расходятся.
-
стандартное решение выделения фронта широкого сигнала выглядит примерно так: always @(CLK, alarm) begin if(posedge(CLK)) begin reseta = alarm; resetb = reseta; resetc = resetb; end end assign reset = resetc & !reseta;
-
В этом вопросе согласен с Kuzmi4. Метасостояние, если оно имелось виду под "красные линии" не должно исправляться инверсией тактовой частоты в тесте. думаю вам нужно пересмотреть свой дизайн в плане включения синхронных сбросов всех или хотябы ключевых регистров. Или отковырять причину появления этих самых "красных линий".
-
Вам нужен однократный сброс при включении питания, или сигнал сброса должен появляться перед каждым обновлением кода? Приведенный вами код - не синтесируем думаю именно на это рукается компилятор. Во первых условие alarm == 1'b1 не имеет смысла т.к. все, что у вас в блоке always будет происходить в момент перехода сигналла alarm из 0 в 1, т.е. в данном случае сигнал alarm у вас является тактовой частотой. не уверен насчет правильности синтаксита конструкции if else begin ( CLK == CLK +2'b10 ) именно первых трех слов. Далее условие (если это конечно условие) такое впринцепе не может быть выполнено потому что вы пытаетесь сравнить одноразрядный сигнал с самим собой + двухразрядная константа - на физическом уровне это полный абсурд. ну и (posedge CLK =0 ); вот это вообще не понял.
-
"Примерно так" - это как? уже представлено 3 варианта кода :) Ну. если по моему первому варианту, то я оговорил сразу что предполагается короткий запускающий. Выкладывайте код - будем смотреть.