|
|
  |
ModelSim, вопросы новичка |
|
|
|
May 18 2018, 11:43
|
Группа: Участник
Сообщений: 13
Регистрация: 29-04-18
Из: Москва
Пользователь №: 103 558

|
Здравствуйте! У вас в TestBench переменная "addr" задана как "wire" + присваивается значение константы - "0". В самом модуле "spi_slave" вы начинаете с этой переменной работать. Получается что с одной стороны вы переменной "addr" присваиваете присваиваете постоянное значение, а с другой, меняете его.
|
|
|
|
|
May 18 2018, 11:45
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Sprite @ May 18 2018, 14:26)  Доброго всем времени суток!
Решил отложить стандартный квартус-симулятор и изучить ModelSim. Отлаживаю модуль SPI, но картинка не та, которую я вижу в квартус-симуляторе, сигналы addr, data, miso в неопределенном состоянии. В чем может быть дело? Не заданы начальные условия или код модуля кривой? Картинка такая: Насколько я помню, Вы не любите сигнал "Сброс". Квартус "знает", что по исходному все триггера в проекте грузятся в 0. А Моделсим этого не знает... А вот те, которые были зеленые, а стали красные - это значит скорее всего, что на сигнал пытаются воздействовать два драйвера...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 18 2018, 12:56
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(Sprite @ May 18 2018, 15:15)  А можно как-нибудь автоматизировать посылку разных значений по SPI? В идеале хочется иметь тестбенч такого формата, чтобы в нем задавались только 2 параметра: значение данных и время в которые они посылаются, а сама колбаса из 32-х битов проходила автоматом. Как решить эту задачку? Ставить внешний цикл for над всем тестбенчем? Мне понятен этот вопрос, вспоминаю как я был нубасом по части тестбенчей в HDL-симуляторах, и кажется представляю что хочется. Краткий ответ может быть таким банальным: Verilog состоит не только из конструкций, которые могут быть синтезированы в ПЛИС, но и несинтезируемых конструкций, которые по сути не уступают по гибкости классическим языкам программирования (особенно System Verilog). Поэтому да, можно действительно сделать так, чтобы была очень сложная логика взаимодействия с тестируемым устройством, причем делать ее на порядок проще и "халявнее" чем изобретать ответную часть на синтезируемых конструкциях Verilog. В том числе и функция имитации SPI с двумя входными параметрами. Цитата(iosifk @ May 18 2018, 15:38)  Пишем файл паттерна с этими двумя параметрами. И в тесбенче вычитываем их из файла. Результаты приема можно тоже писать в файл... Или в консоль.... А потом исходный и полученный программным инструментом сравнить... Прошу прощения, но совет странный  Файл? Зачем там.
--------------------
|
|
|
|
|
May 18 2018, 17:47
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Код А можно как-нибудь автоматизировать посылку разных значений по SPI? В идеале хочется иметь тестбенч такого формата, чтобы в нем задавались только 2 параметра: значение данных и время в которые они посылаются, а сама колбаса из 32-х битов проходила автоматом. Как решить эту задачку? Ставить внешний цикл for над всем тестбенчем? Я обычно делаю так: 1. У меня есть отдельная папочка, которая называется SIM_MODELS. 2. В этой папочке хранятся, как ,наверное, легко догадаться - модели для симуляции. Эти модели я специально написал на несентизируемом подмножестве языка HDL. Обычно в качестве моделей я создаю распространенную периферию - источники сигнала, такие как UART, SPI, I2C, и пр. Недавно пришлось написать VGA источник, где в качестве параметра - генерируемое разрешение. 3. В модели у меня есть возможность задать необходимые параметры. Одним из таких параметров является возможность выбора файла откуда читаются внешние воздействия. 4. Когда я начинаю моделировать в Modelsim я просто подключаю к тестбенчу мою модель, в которой указываю файл откуда читать внешние воздействия. 5. В случае если модель не удовлетворяет необходимому функционалу - я её улучшаю. В итоге имеем - крайне простую генерацию внешних воздействий. Постоянно улучшающуюся модель источника. И самое главное возможность повторного использования ранее написанного, что ускорит создание проектов в будущем. Основная цель - по-максимуму применять то, что было написано и отлажено раньше, что уменьшит вероятность ошибок, и ускорит разработку.
|
|
|
|
|
May 18 2018, 18:03
|
Частый гость
 
Группа: Свой
Сообщений: 92
Регистрация: 20-01-06
Из: Зеленоград
Пользователь №: 13 407

|
Цитата(Sprite @ May 18 2018, 14:26)  Решил отложить стандартный квартус-симулятор и изучить ModelSim. Сказали а, говорите сразу и б: управляйте ModelSim-ом с помощью tcl. Потратите время на изучение, зато потом будете сильно экономить на отладке. Не претендую на непогрешимость, но вот (в скрепке) пример: вдруг, чего себе возьмёте? Любые вопросы и замечания приветствуются.
--------------------
WMBR
|
|
|
|
|
May 18 2018, 19:21
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 8-04-11
Из: Ростов-на-Дону
Пользователь №: 64 227

|
Можно создать *.qsys проект в который добавить нужные BFM корки, потом выбрать пунккт Generate->Generate TestBench systems . После генерации в директории synthesis появятся *.sv файлы. Собственно это они и есть  Еще у альтеры есть экземплы: https://www.altera.com/support/support-reso...ication-ip.htmlТам же и ссылка на документацию. Правда от последней, как по мне, не сильно много толку Сейчас, как раз, занялся этим. Есть желание наковырять оттуда кода, и сделать для себя боле-менее обощенный пакет который можно былоб использовать в разных проектах
|
|
|
|
|
May 18 2018, 20:30
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834

|
Цитата(Sprite @ May 18 2018, 12:26)  Отлаживаю модуль SPI Кстати, вдруг ещё не видели - ИМО там есть, что принять к сведению: SPI Verilog Master & Slave modules :: Overview. Да и, вообще, там погуляйте. И я вместе с Вами ) И ещё одна ссылка, как введение к первой: https://marsohod.org/projects/marsohod2/amb...c/215-opencores
Сообщение отредактировал Marat Zuev - May 18 2018, 21:02
--------------------
-- С наилучшими пожеланиями, Marat.
|
|
|
|
|
May 19 2018, 13:35
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(AnatolySh @ May 19 2018, 01:03)  Не претендую на непогрешимость, но вот (в скрепке) пример: вдруг, чего себе возьмёте? Пантово..! Очень пантово!) Прямо все как я люблю: нажал одну кнопку и ПЭМС! - файл симуляции готов! Особенно мне понравились строчки "ThisPCLocationIsWORK" и "ThisPCLocationIsHOME" батника simulate  Браво! Реально круто!  Благодаря Вашему коду наткнулся на интересную статью, может кому пригодится. Цитата(Marat Zuev @ May 19 2018, 03:30)  Кстати, вдруг ещё не видели - ИМО там есть, что принять к сведению: SPI Verilog Master & Slave modules :: Overview. Да и, вообще, там погуляйте. И я вместе с Вами ) И ещё одна ссылка, как введение к первой: https://marsohod.org/projects/marsohod2/amb...c/215-opencoresСпасибо за инфу! Обязательно ознакомлюсь! Еще один вопрос: verilog начал изучать совсем недавно, и мне привычнее представлять top_level в виде bdf-схемы, куда я далее вставляю veriog-модули и компилирую. ModelSim насколько мне известно может принимать только verilog. Как быть в этом случае? Описывать всю схему, связи в верилоге или есть еще какие варианты? И как в этом случае привязывать входы-выходы к конкретным пинам?
|
|
|
|
|
May 19 2018, 13:52
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834

|
Цитата(Sprite @ May 19 2018, 14:35)  наткнулся на интересную статьюВсё, чем Вы восторгались, написано, в том числе после прочтения статей, подобных этой ) Цитата(Sprite @ May 19 2018, 14:35)  Еще один вопрос: verilog начал изучать совсем недавно, и мне привычнее представлять top_level в виде bdf-схемы, куда я далее вставляю veriog-модули и компилирую. ModelSim насколько мне известно может принимать только verilog. Как быть в этом случае? Описывать всю схему, связи в верилоге или есть еще какие варианты? И как в этом случае привязывать входы-выходы к конкретным пинам? Как раз для Вас с того же сайта: https://marsohod.org/11-blog/251-sch-or-txt
Сообщение отредактировал Marat Zuev - May 19 2018, 13:56
--------------------
-- С наилучшими пожеланиями, Marat.
|
|
|
|
|
May 20 2018, 06:38
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(Marat Zuev @ May 19 2018, 20:52)  Всё, чем Вы восторгались, написано, в том числе после прочтения статей, подобных этой ) Как раз для Вас с того же сайта: https://marsohod.org/11-blog/251-sch-or-txtСпасибо, я уже понял что надо делать все на verilog. У меня в схеме есть такой компонент:  Это сгенерированый компонент Single-port RAM megafunction. В RLT это выглядит так:  Как мне к нему обратиться? CYCLONEIII_RAM_BLOCK? Задача то в общем простая - сделать компонент для хранения 1 слова, но не на D-триггерах, а на RAM-элементах, чтобы не тратить драгоценные логические элементы ПЛИСа.
|
|
|
|
|
May 20 2018, 07:09
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834

|
Цитата(Sprite @ May 20 2018, 07:38)  Как мне к нему обратиться? Вам надо было поставить галку здесь:
--------------------
-- С наилучшими пожеланиями, Marat.
|
|
|
|
|
May 20 2018, 08:16
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(R6L-025 @ May 20 2018, 14:12)  А, еще есть quartus templates. В выпадающем меню Edit->Insert Template есть шаблоны кода и директив (чтоб это меню появилось нужно чтоб в квартусе было открыто окно встроенного редактора кода). Там, как раз, есть шаблоны работы с памятью. Это первое, с чего я начинал. Вставлял template, но он RAM все равно синтезируется как D-триггер. Попробую сделать как написал Marat Zuev, посмотрим что получится. Вообще мне нужно создать несколько RAM, каждый из которых использовался бы только под хранение одного элемента, но если делать через мегавизард - то минимальная разрядность шины адреса - 2. Приходится создавать RAM под 2 элемента, а шину адреса тупо весить на VCC. Получается не оптимально как то. В идеале ищу такое решение, чтобы можно было создавать RAM для хранения одного элемента (16 бит данных) и чтобы его полностью можно было описать на verilog, а иначе зачем я его изучать начал? ))
Сообщение отредактировал Sprite - May 20 2018, 08:23
|
|
|
|
|
May 20 2018, 10:12
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 8-04-11
Из: Ростов-на-Дону
Пользователь №: 64 227

|
Да, verilog, vhdl... Берете описание портов pll корки, подключаете выходы корки к портам Вашего модуля. Вообще, лучше не делитель клока использовать, а в корке pll создать второй клок, частоту которого настраиваете как вам нужно. Както так: Код module my_pll ( input wire in_clk, output wire out_clk0, output wire out_clk1 );
pll pll_inst ( .inclk0 (in_clk ),
.c0 (out_clk0), .c1 (out_clk1) );
endmodule // my_pll Потом назначаете номера пинов к портам модуля. Можно вручную в *.qsf скрипте, но проще будет через квартусовский pin-planner. Посмотрите на даташит или иную документацию на плату, там должны быть указаны напряжения банков ввода-вывода. Назначаете согласно этому интерфейс, например, "3.3-V LVCMOS"
|
|
|
|
|
May 20 2018, 10:27
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(R6L-025 @ May 20 2018, 17:12)  Да, verilog, vhdl... Берете описание портов pll корки, подключаете выходы корки к портам Вашего модуля. Вообще, лучше не делитель клока использовать, а в корке pll создать второй клок, частоту которого настраиваете как вам нужно. Както так: Код module my_pll ( input wire in_clk, output wire out_clk0, output wire out_clk1 );
pll pll_inst ( .inclk0 (in_clk ),
.c0 (out_clk0), .c1 (out_clk1) );
endmodule // my_pll Потом назначаете номера пинов к портам модуля. Можно вручную в *.qsf скрипте, но проще будет через квартусовский pin-planner. Посмотрите на даташит или иную документацию на плату, там должны быть указаны напряжения банков ввода-вывода. Назначаете согласно этому интерфейс, например, "3.3-V LVCMOS" Спасибо большое, уже сам разобрался) Сделал так: Код module main_inst(input clk, output clk_out, output clk_108MHz); pll pll1(.c0(clk_108MHz), .inclk0(clk)); divider divider1(.out(clk_out), .clk(clk_108MHz)); defparam divider1.bitnum = 25; //Задаем параметр модуля divider endmodule Все компилится и работает, еду дальше ) Цитата Вообще, лучше не делитель клока использовать, а в корке pll создать второй клок, частоту которого настраиваете как вам нужно. Да, Вы конечно правы! Делитель - это мой первый модуль на verilog, он в проекте просто для наглядности, сигнал с него выводится на светодиод отладочной платы, по нему я понимаю, что плата вообще работает)
Сообщение отредактировал Sprite - May 20 2018, 10:33
|
|
|
|
|
May 21 2018, 11:53
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Всем добра!Перевел проект полностью на verilog, хочу запустить тестбенч. Делаю так: 1. Создаю новый проект; 2. Добавляю все verilog-файлы своего проекта и компилю их; 3. Запускаю Simulate, подсовывая тестбенч, на что modelsim ругается: Код # Region: /tb/main_inst_tb/mem_block1/ram_blocks1 # Searched libraries: # C:/altera/91sp1/Projects/cyclone III/simulation/work # ** Error: (vsim-3033) C:/altera/91sp1/Projects/cyclone III/helper/ram/ram.v(62): Instantiation of 'altsyncram' failed. The design unit was not found. # # Region: /tb/main_inst_tb/mem_block1/ram_blocks1/ram_08 # Searched libraries: # C:/altera/91sp1/Projects/cyclone III/simulation/work # ** Error: (vsim-3033) C:/altera/91sp1/Projects/cyclone III/helper/ram_blocks/ram_blocks.v(56): Instantiation of 'AND2' failed. The design unit was not found. # Region: /tb/main_inst_tb/mem_block1/ram_blocks1 # Searched libraries: # C:/altera/91sp1/Projects/cyclone III/simulation/work # ** Error: (vsim-3033) C:/altera/91sp1/Projects/cyclone III/helper/ram/ram.v(62): Instantiation of 'altsyncram' failed. The design unit was not found. # # Region: /tb/main_inst_tb/mem_block1/ram_blocks1/ram_08 # Searched libraries: # C:/altera/91sp1/Projects/cyclone III/simulation/work # ** Error: (vsim-3033) C:/altera/91sp1/Projects/cyclone III/helper/ram_blocks/ram_blocks.v(56): Instantiation of 'AND2' failed. The design unit was not found. Если я правильно понимаю - modelsim хочет увидеть компоненты AND2, altsyncram и DFF. Как и куда прописывать пути до библиотек их содержащих?
Сообщение отредактировал Sprite - May 21 2018, 11:53
|
|
|
|
|
May 21 2018, 12:42
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834

|
Цитата(Sprite @ May 21 2018, 11:53)  Если я правильно понимаю - modelsim хочет увидеть компоненты AND2, altsyncram и DFF. Как и куда прописывать пути до библиотек их содержащих? Понимаете правильно. Вам надо добавить требуемые библиотеки примерно так: vsim -voptargs=+acc -L "требуемая библиотека" -L Ваша_рабочая_библиотека Ваша_рабочая_библиотека.Ваш_tb у меня, например, это было так: vsim -voptargs=+acc -L maxii_ver -L lpm_ver -L work work.tb
--------------------
-- С наилучшими пожеланиями, Marat.
|
|
|
|
|
May 21 2018, 13:16
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(Flip-fl0p @ May 21 2018, 19:47)  Я бы ещё не применял имена модулей - названия примитивов регистров. Например DFF - имя запрещенное. Очень странно что Quartus не ругался... Не совсем Вас понимаю. В проекте есть такая строчка: Код AND2 AND2_01(.IN1(addr[0]), .IN2(wr), .OUT(s1)); Что здесь запрещенного? Как по другому создать примитив AND2? Описывать конструкцию в виде assign q = in1 & in2 в отдельном файле? AND2 - примитив библиотеки, я и беру его из библиотеки, только какой пока не знаю, так же как и DFF. Остальные элементы вроде нашел, правда некрасиво как-то - в папку work компилируется все подряд( когда нужны всего пара элементов. Вобщем психанул) Скомпилировал в проект все что было в C:\altera\15.0\modelsim_ase\altera\verilog\src Проект увеличился на 1,2Гб) Но элементы AND2 и DFF так и не найдены. Вывод - либо отсутствует нужная библиотека для cyclone III, либо Flip-fl0p прав и я что-то делаю не так. Среда в которой разрабатывается проект - квартус 9.1, а ModelSim установлен в ModelSim-Altera Starter Edition 15.0.0.145, который не поддерживает cycloneIII. Может быть в этом дело?
|
|
|
|
|
May 21 2018, 13:17
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Поскольку полного кода я не вижу, я предположил, что вы создали свой модуль с именем DFF. А этого делать крайне нежелательно. Цитата Я и беру его из библиотеки, только какой пока не знаю, так же как и DFF Это как ?  Вообще было бы неплохо, чтобы Вы полный текст проекта сюда выложили. Обычно для RTL симуляции библиотек надо минимум. И тип чипа вообще роли играть не должен !
|
|
|
|
|
May 21 2018, 13:32
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(Flip-fl0p @ May 21 2018, 20:17)  Поскольку полного кода я не вижу, я предположил, что вы создали свой модуль с именем DFF. А этого делать крайне нежелательно. Это как ?  Вообще было бы неплохо, чтобы Вы полный текст проекта сюда выложили. Обычно для RTL симуляции библиотек надо минимум. И тип чипа вообще роли играть не должен ! Вот код одного из модулей: CODE module ram_blocks( input clk, input [15:0]addr, input [15:0]data, input wr, output [15:0]data_1, output [15:0]data_2, output [15:0]data_3, output [15:0]data_4, output [15:0]data_5, output [15:0]data_6, output [15:0]data_7, output [15:0]data_8, output [15:0]data_9, output [15:0]data_10, output [15:0]data_11, output [15:0]data_12, output [15:0]data_13, output [15:0]data_14, output [15:0]data_15, output [15:0]data_16); wire s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16; wire w_VCC; assign w_VCC = 1'b1; AND2 AND2_01(.IN1(addr[0]), .IN2(wr), .OUT(s1)); ram ram_01(.data(data), .wren(s1), .address(w_VCC), .clock(clk), .q(data_1)); AND2 AND2_02(.IN1(addr[1]), .IN2(wr), .OUT(s2)); ram ram_02(.data(data), .wren(s2), .address(1'b1), .clock(clk), .q(data_2)); AND2 AND2_03(.IN1(addr[2]), .IN2(wr), .OUT(s3)); ram ram_03(.data(data), .wren(s3), .address(1'b1), .clock(clk), .q(data_3));
AND2 AND2_04(.IN1(addr[3]), .IN2(wr), .OUT(s4)); ram ram_04(.data(data), .wren(s4), .address(1'b1), .clock(clk), .q(data_4));
AND2 AND2_05(.IN1(addr[4]), .IN2(wr), .OUT(s5)); ram ram_05(.data(data), .wren(s5), .address(1'b1), .clock(clk), .q(data_5)); AND2 AND2_06(.IN1(addr[5]), .IN2(wr), .OUT(s6)); ram ram_06(.data(data), .wren(s6), .address(1'b1), .clock(clk), .q(data_6)); AND2 AND2_07(.IN1(addr[6]), .IN2(wr), .OUT(s7)); ram ram_07(.data(data), .wren(s7), .address(1'b1), .clock(clk), .q(data_7));
AND2 AND2_08(.IN1(addr[7]), .IN2(wr), .OUT(s8)); ram ram_08(.data(data), .wren(s8), .address(1'b1), .clock(clk), .q(data_8));
AND2 AND2_09(.IN1(addr[8]), .IN2(wr), .OUT(s9)); ram ram_09(.data(data), .wren(s9), .address(1'b1), .clock(clk), .q(data_9)); AND2 AND2_10(.IN1(addr[9]), .IN2(wr), .OUT(s10)); ram ram_10(.data(data), .wren(s10), .address(1'b1), .clock(clk), .q(data_10)); AND2 AND2_11(.IN1(addr[10]), .IN2(wr), .OUT(s11)); ram ram_11(.data(data), .wren(s11), .address(1'b1), .clock(clk), .q(data_11));
AND2 AND2_12(.IN1(addr[11]), .IN2(wr), .OUT(s12)); ram ram_12(.data(data), .wren(s12), .address(1'b1), .clock(clk), .q(data_12));
AND2 AND2_13(.IN1(addr[12]), .IN2(wr), .OUT(s13)); ram ram_13(.data(data), .wren(s13), .address(1'b1), .clock(clk), .q(data_13)); AND2 AND2_14(.IN1(addr[13]), .IN2(wr), .OUT(s14)); ram ram_14(.data(data), .wren(s14), .address(1'b1), .clock(clk), .q(data_14)); AND2 AND2_15(.IN1(addr[14]), .IN2(wr), .OUT(s15)); ram ram_15(.data(data), .wren(s15), .address(1'b1), .clock(clk), .q(data_15));
AND2 AND2_16(.IN1(addr[15]), .IN2(wr), .OUT(s16)); ram ram_16(.data(data), .wren(s16), .address(1'b1), .clock(clk), .q(data_16)); endmodule В модуле используется элемент AND2, экземпляры которого я создаю. Но элемент AND2 так же как и DFF не могу найти ни в одной из библиотек, подключал уже все файлы из папки C:\altera\15.0\modelsim_ase\altera\verilog\src Я подозреваю, что это из за того, что проект разрабатывался в Quartus 9.1, а ModelSim используется от версии квартуса 15.0 где отсутствует библиотека для cyclone III. Как мне быть? Перейти на Quartus 13.1? Не очень бы хотелось - как показывает практика - чем выше версия квартуса - тем больше тормозов и времени на компиляцию. Warning from admin: Используйте codebox для длинных цитат программного кода!
Сообщение отредактировал makc - May 21 2018, 14:45
Причина редактирования: Замена code -> codebox
|
|
|
|
|
May 21 2018, 14:48
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(Flip-fl0p @ May 21 2018, 21:30)  А какую цель Вы ставите перед собой ? Сделать правильно ? Или научиться ? Сделать правильно и научиться.
Сообщение отредактировал Sprite - May 21 2018, 14:49
|
|
|
|
|
May 21 2018, 18:29
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 8-05-18
Пользователь №: 103 834

|
Цитата(Sprite @ May 21 2018, 13:32)  Вот код одного из модулей: Во-первых, используйте defin-ы для Ваших констант: `define arr_dim 16 `define arr_rng [`arr_dim-1:0] и тогда output [15:0]data_4, выливается в output `arr_rng data_4, далее wire s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16; пишется как wire [16:1] s; или снова как выше через defin-ы. Далее AND2 AND2_01(.IN1(addr[0]), .IN2(wr), .OUT(s1)); если не важно указание имени инстанциированного модуля, то его можно опустить: AND2 (.IN1(addr[0]), .IN2(wr), .OUT(s1)); вообще, подозреваю, что такую последовательность Ваших примитивов можно описать через generate Цитата(Sprite @ May 21 2018, 13:32)  В модуле используется элемент AND2, экземпляры которого я создаю. Но элемент AND2 так же как и DFF не могу найти ни в одной из библиотек, подключал уже все файлы из папки C:\altera\15.0\modelsim_ase\altera\verilog\src Я подозреваю, что это из за того, что проект разрабатывался в Quartus 9.1, а ModelSim используется от версии квартуса 15.0 где отсутствует библиотека для cyclone III. Как мне быть? Перейти на Quartus 13.1? Либо использовать ModelSim-Altera(Starter)Edition от той версии Quartus-a, которая поддерживает интересующий чип, либо (здесь могу врать) скомпилить библиотеки для того ModelSima, который чип не поддерживает, но с которым хочется работать.
Сообщение отредактировал Marat Zuev - May 21 2018, 18:30
--------------------
-- С наилучшими пожеланиями, Marat.
|
|
|
|
|
May 22 2018, 05:28
|

Участник

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239

|
Цитата(Sprite @ May 21 2018, 13:32)  ... AND2 AND2_01(.IN1(addr[0]), .IN2(wr), .OUT(s1)); ram ram_01(.data(data), .wren(s1), .address(w_VCC), .clock(clk), .q(data_1)); ... А почему вы так упорно используете Альтеровские примитивые? Чем вас не устраивает конструкция вроде "a & b" для логических операций? Возможно, я просто не понимаю чего-то, но юзать примитивы для логических операций - это как-то... избыточно? А еще про память: это поптыка самостоятельно создать что-то вроде IP Core альтеры, которое разведется в RAM память? Если так - тогда стоит полистать мануалы по стилям кодинга от Альтеры же - там примеры, как написать, что бы ваш код лег именно в память, а не логику.
|
|
|
|
|
May 22 2018, 08:40
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
С учетом замечаний Marat Zuev переписал модуль, получилось компактнее! Код module ram_blocks( input clk, input [15:0]addr, input [15:0]data, input wr, output [15:0]data_1, output [15:0]data_2, output [15:0]data_3, output [15:0]data_4, output [15:0]data_5, output [15:0]data_6, output [15:0]data_7, output [15:0]data_8, output [15:0]data_9, output [15:0]data_10, output [15:0]data_11, output [15:0]data_12, output [15:0]data_13, output [15:0]data_14, output [15:0]data_15, output [15:0]data_16); wire [15:0]data_out[15:0]; wire [16:0]s; genvar i; generate for(i = 0; i < 16; i = i + 1) begin : ram_generation assign s[i] = addr[i] & wr; ram ram_inst(.data(data), .wren(s[i]), .address(1'b1), .clock(clk), .q(data_out[i])); end endgenerate
assign data_1 = data_out[0]; assign data_2 = data_out[1]; assign data_3 = data_out[2]; assign data_4 = data_out[3]; assign data_5 = data_out[4]; assign data_6 = data_out[5]; assign data_7 = data_out[6]; assign data_8 = data_out[7]; assign data_9 = data_out[8]; assign data_10 = data_out[9]; assign data_11 = data_out[10]; assign data_12 = data_out[11]; assign data_13 = data_out[12]; assign data_14 = data_out[13]; assign data_15 = data_out[14]; assign data_16 = data_out[15]; endmodule nice_vladi по поводу использования AND2-примитива согласен с Вами, сделал через & и assign, но вот DFF так и не нашел в библиотеке, пришлось описывать вручную: Код wire w_cs reg dff_out; always @(posedge clk) begin dff_out <= cs; end assign w_cs = dff_out; Неудобно немного получается, но с этим можно мириться. Проект скомпилил в Modelsim 6.5, симуляция собралась с варнингами: Код # ** Warning: (vsim-3009) [TSCALE] - Module 'ram_blocks' does not have a `timescale directive in effect, but previous modules do. # Region: /tb/main_inst_tb/mem_block1/ram_blocks1 # Loading work.decoder # ** Warning: (vsim-3009) [TSCALE] - Module 'decoder' does not have a `timescale directive in effect, but previous modules do. # Region: /tb/main_inst_tb/mem_block1/decoder1 Как-то можно от них избавиться? Объявлять `timescale в каждом файле?
|
|
|
|
|
May 22 2018, 09:20
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Sprite @ May 22 2018, 11:40)  А если надо 1024 разряда ? Вы вроде хотите научиться делать правильно. Тут Вам могут помочь, и обязательно помогут. Но от вас требуется правильно сформулировать задачу ! Я так и не понял толком, что Вы хотите сделать. Похоже на некое подобие памяти. Но где такое может пригодиться я ума не приложу ! P.S. Спускаться на уровень описания взаимодействия триггеров между собой необходимо лишь в том случае, когда требуется выжать из чипа каждый мегагерц. Но без правильного файла констрейнов, и атрибутов синтеза - грош цена такому описанию... Один фиг, синтезатор разложит по-своему. Да и не стоит недоверять синтезатору. Синтезатор умный. Если правильно описана схема на поведенческом уровне , то синтезатор её сам прекрасно разместит в ячейках FPGA. Почти всегда синтезатор делает это лучше, чем разработчик.
|
|
|
|
|
May 22 2018, 09:46
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Flip-fl0p @ May 22 2018, 12:20)  Но от вас требуется правильно сформулировать задачу ! Я так и не понял толком, что Вы хотите сделать. Похоже на некое подобие памяти. Но где такое может пригодиться я ума не приложу ! Я тоже не понял. Ведь адрес-то только один, а значит одновременно все блоки памяти считываться и записываться не будут. А тогда почему надо много мелких блоков, а не один, в который все и поместится? И вот это: assign s[i] = addr[i] & wr; ram ram_inst(.data(data), .wren(s[i]), .address(1'b1), .clock(clk), .q(data_out[i])); совершенно криво, можно даже сказать, что уродливо...  Короче, проект методически начат не верно, отсюда и все вопросы...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 22 2018, 10:24
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Спасибо всем за критику) Задачу в двух словах описать можно так: есть МК и есть ПЛИС. На ПЛИС построено несколько конечных автоматов, каждый из которых работает со своими данными, которые загружаются из МК по SPI по разным адресам RAM. Поскольку каждый блок работает со своим словом данных и нужно чтобы данные всегда были видимы блоку я отказался от использования одного компонента RAM, скажем 16x16, выдающего по адресу только одно значение данных и использую несколько блоков RAM минимальной разрядности (что, как справедливо заметил Иосиф Григорьевич, криво и уродливо  ), Компонент RAM пришлось генерировать через визард, т.к. другого способа добавить ячейку RAM я не нашел (создавать RAM из темплейтов пробовал - при компиляции создаются D-триггеры, что громоздко и неоптимально ввиду лишней занимаемой памяти). Минимальная разрядность адреса блока RAM через визард - 2, если указываю 1 - выдает ошибку.
Сообщение отредактировал Sprite - May 22 2018, 10:26
|
|
|
|
|
May 22 2018, 12:04
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Довольный как слон Все получилось! Собрал проект в modelsim 10.3, все работает, нашел благодаря ему пару ошибок, которые в стандартном квартус-симуляторе не отображались:  В момент времени, когда начинал работать умножитель на одном модуле появлялось неопределенное состояние, вспомнил Иосифа Григорьевича, добавил reset описание default и вуаля! Сейчас соберу все в красивый скрипт, чтобы на кнопку только ПЭМС и все как я люблю - во весь экран файл симуляции) Доделок конечно еще много, но какая-то конкретика есть. Впереди освоение TimeQuest...
Сообщение отредактировал Sprite - May 22 2018, 12:06
|
|
|
|
|
May 22 2018, 12:28
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(iosifk @ May 22 2018, 19:20)  У Вас что, автоматы всегда работают с данными в памяти одновременно? Почему не сделать двух-портовку? В один порт - пишите из SPI, а по другому порту автоматы через арбитр читают содержимое памяти? Чтение через арбитр подразумевает поочередное обращение к данным, а мне они (данные) нужны всегда, этот вариант я продумывал в самом начале.
|
|
|
|
|
May 22 2018, 15:54
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(iosifk @ May 22 2018, 19:35)  И в каждом состоянии автомат пользуется этими данными? Или все же не в каждом? Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока?
|
|
|
|
|
May 23 2018, 06:18
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Sprite @ May 22 2018, 18:54)  Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока? Так и запихните в Ваш каждый автомат блок памяти. И по SPI грузите в нужный автомат, нужные данные. Так логичнее схема смотрится, как мне кажется. Есть SPI контроллер, который принимает данные. Есть простенький Арбитр - который принимаемые по SPI данные записывает в память автомата. И есть ваши автоматы, которые уже работают с памятью, куда арбитр данные загнал. Вообще неплохо было бы сначала на бумаге структурную схему проекта нарисовать. Затем описать алгоритмы в виде блок схем, или графов перехода, или опять в виде структурной схемы прохождения данных. И затем уже все это дело перенести на HDL Как мне кажется такая структура проекта логичнее, понятнее, и проще. И хоть 1000 автоматов добавляйте . Интерфейс с внешним модулем (арбитром)один.
|
|
|
|
|
May 23 2018, 07:10
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Sprite @ May 22 2018, 18:54)  Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока? То, что "проще" для Вас, совсем не проще для ПЛИС... На 16х16 битов данных необходимо задействовать столько же интерконнектов. И это самый дорогой ресурс в ПЛИС. И, кстати не говорилось о том, с какой скоростью идет обработка данных. Говорилось о 25 Мгц от АЦП и 100 Мгц тактовой. А сколько тактов в автомате и в скольки тактах он пользуется данными из памяти? И всегда ли арбитр будет задерживать автоматы, если запрос на доступ подать на 1 такт раньше, чтобы ссработал арбитр? И, кстати, компилятор совершенно прав, когда пытается вместо блочной памяти, применить триггера. Потому как ко входам триггеров идет одна шина в 16 бит, а сами триггера можно разместить в любом месте кристалла. А вот блочная память сидит в центре кристалла и от нее надо гнать 16х16 проводов...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 23 2018, 11:49
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Flip-fl0p, Иосиф Григорьевич спасибо! Подумаю над Вашим вариантом, сейчас другая проблема возникла - не хочет запускаться pll clock. Делал так: 1. Сгенерил мегавизардом компонент pll с коэффициентом умножения 6. Один клок на входе и один на выходе. 2. Выкинул все из проекта, кроме pll. 3. Скопировал файл altera_mf.v и добавил его в компиляцию (без него ModelSim не может найти altpll).  Нажимаю на "ТЫЦ" - все собирается, проходит компиляция файлов и тестбенча, но выдается ошибка: Код ** Error: (vsim-3601) Iteration limit reached at time 0 ns. Сам "ТЫЦ.bat" и файлы проекта во вложении. Отладку провожу в ModelSim 10.3d. Прошу прощения, нашел ошибку: в строке макроса было задано слишком малое время симуляции: Код vsim -t 1ns tb
|
|
|
|
|
May 23 2018, 11:51
|

Участник

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239

|
Цитата(Sprite @ May 23 2018, 11:01)  [b] Код ** Error: (vsim-3601) Iteration limit reached at time 0 ns. Это modelsim достигает предела итераций моделирования. Из-за того, что в core PLL много подмодулей, и они довольно крупные и для симуляции каждого требуется куча операций. Вот он и наедается. Можно покрутить параметр лимита операций в настройка сабжа, но лучше при моделировании не использовать PLL, а описывать клоки несинтезируемыми конструкциями языка (ИМХО). Т.е.: Для симуляции используете "искусственные" клоки; Для синтеза - корку Альтеры; Совсем хорошо будет отбить дефайнами эти области, что бы вручную не комментить каждый раз.
|
|
|
|
|
May 23 2018, 11:59
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 12-05-05
Из: г. Москва
Пользователь №: 4 944

|
В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение
Не могу запустить ваш пример и проверить, но в в macros.do наверно нужно указать симуляцию с разрешением 1ps.(строка 4 vsim -t 1ps tb). Pll обычно симулируются с пикосекундными разрешениями.
Сообщение отредактировал OM-S - May 23 2018, 12:15
|
|
|
|
|
May 23 2018, 12:24
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(OM-S @ May 23 2018, 18:59)  В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение Спасибо! Исправил. Теперь другая проблема: клок вместо умножения начал делиться) Тестбенч:Код `timescale 1ps / 1ps
`include "altera_mf.v" `include "main.v" `include "pll.v"
module tb; reg clk; wire clk_108MHz; main main_tb( .clk(clk), .clk_108MHz(clk_108MHz)); always #5 clk = !clk;
initial begin clk = 0; #10000; $stop; end endmodule Макрос запуска:Код transcript on vlib work vlog -sv tb.v vsim -t 1ps tb add wave /* quietly radix unsigned configure wave -timelineunits ns run -all wave zoom full Причем если в тестбенче явно указываю время, т.е. вместо #5 ставлю #5ns и вместо #10000 ставлю #10000ns - то все работает. В чем проблема? nice_vladi, похоже Вы правы - для симуляции проще использовать искусственные клоки. По крайней мере один железный плюс я здесь вижу - размер проекта меньше (не включаются файлы типа altera_mf.v и т.д.) Насколько такой подход правильный - не знаю.
Сообщение отредактировал Sprite - May 23 2018, 12:35
|
|
|
|
|
May 23 2018, 13:20
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(_Anatoliy @ May 23 2018, 19:38)  Что-то у вас входной клок дюже быстро клацает для 18 МГц... Это потому что я в тестбенче указываю задержку в тактах, а не в реальном времени, а в качестве величины такта система, как я понимаю, принимает минимальный timescale из всех модулей проекта, в данном случае как правильно заметил OM-S - это pll. По совету nice_vladi задефайнил все, что касается pll. Теперь при симуляции в modelsim если дефайн активен - то pll волшебным образом исчезает из схемы)). Получилось довольно красиво и главное работает!
Сообщение отредактировал Sprite - May 23 2018, 13:20
|
|
|
|
|
May 25 2018, 13:34
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Добрый день всем!Еще один нубский вопрос: Решил промоделировать конечный автомат, но сигнал на выходе (out) в ModelSim отображает как "X", хотя в квартус-симуляторе моделируется все нормально. Если файлы (конечный автомат и тестбенч) добавлять в ModelSim вручную и - то тоже нормально все, сигнал out отображается так как планировалось. Делаю вывод - дело в макросе. Конечный автомат:Код module generator ( input clk, input ena, output reg out ); wire pulse; reg [15:0] cnt_val = 16'd0; reg [15:0] cnt_comp_val = 16'hFFFF; reg [1:0] state = 2'b00; parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3;
reg [15:0] comp_val[3:0]; initial begin comp_val[0] = 16'd4; comp_val[1] = 16'd5; comp_val[2] = 16'd6; comp_val[3] = 16'd7; end
//---------------------------------------- always @ (state) begin case (state) S0: begin cnt_comp_val = comp_val[0]; out = 1; end S1: begin cnt_comp_val = comp_val[1]; out = 0; end S2: begin cnt_comp_val = comp_val[2]; out = 1; end S3: begin cnt_comp_val = comp_val[3]; out = 0; end default: begin cnt_comp_val = 16'hFFFF; out = 0; end endcase end
//---------------------------------------- always @ (posedge clk) begin if (!ena) state <= S0; else case (state) S0: state <= pulse? S1:S0; S1: state <= pulse? S2:S1; S2: state <= pulse? S3:S2; S3: state <= pulse? S0:S3; default: state <= S0; endcase end
//---------------------------------------- always @(posedge clk) begin if(ena) if(cnt_val==cnt_comp_val) cnt_val = 4'b1; else cnt_val = cnt_val + 1'd1; else cnt_val = 4'd1; end assign pulse = (cnt_val==cnt_comp_val); //---------------------------------------- endmodule Тестбенч к нему:Код `timescale 1ns / 1ns `include "generator.v"
module tb; reg clk; reg ena; wire out; generator generator1(.clk(clk), .ena(ena), .out(out));
always #1 clk = ~clk; initial begin clk = 0; ena = 0; #100; ena = 1; #1000; $stop; end endmodule Макрос:Код #transcript on vlib work vlog -sv tb.v vsim -t 1ns tb add wave /tb/* add wave /tb/generator1/*
#quietly radix unsigned configure wave -timelineunits ns run -all wave zoom full И картина на выходе (если запускать с помощью макроса): Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же(
|
|
|
|
|
May 25 2018, 14:19
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Sprite @ May 25 2018, 16:34)  Добрый день всем! Еще один нубский вопрос: ....
Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же( Мой опыт работы в техподдержке говорит, что если пользователь сначала делает что-то не по шаблону, а как-то по своему, то потом у него появляется богатая возможность для "преодоления", для "трудового подвига", для "порыва души"... Это к стилю описания автомата... Вот не согласились же Вы узнать, что есть общего у одноглазого бога викингов, у сигналов паритета, у девушки и у симулятора. А если бы знали это, то моментально бы и причину нашли... А это - к "красному" сигналу "out"... Вот какие дела...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 25 2018, 15:14
|
Группа: Участник
Сообщений: 13
Регистрация: 29-04-18
Из: Москва
Пользователь №: 103 558

|
1. У вас в схеме нет сигнала "reset", рекомендуется его сипользовать для начальной инициализации. 2. Не рекомендую вносить в список чувствительности текущее состояние FSM. 3. В модуле "generator", сигнал "out" задан как "output reg", а в модуле "tb" как "wire".
|
|
|
|
|
May 25 2018, 15:50
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Sprite @ May 25 2018, 16:34)  Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же( Вот странный Вы человек. Вам же говорили как лучше начинать делать правильно тем кто только встал на путь изучения HDL. https://electronix.ru/forum/index.php?showtopic=146965 Но Вы упорно продолжаете делать по-своему. Вот я смотрю Вы в прошлой теме описали несчастный счетчик. Теперь Вы описываете счетчик ещё раз. А не проще было создать один отдельный файл счетчика. Добавить необходимые параметры, отладить, и больше к нему не возвращаться ? Таким образом Вы упростите следующие проекты, т.к исключите место где потенциально можно допустить ошибку. А если у Вас будет проект где используется десяток счетчиков, десяток FSM и куча всего ? Как тогда Вы будете все это отлаживать ?
|
|
|
|
|
May 25 2018, 16:41
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Цитата(Nieve @ May 25 2018, 22:14)  1. У вас в схеме нет сигнала "reset", рекомендуется его сипользовать для начальной инициализации. 2. Не рекомендую вносить в список чувствительности текущее состояние FSM. 3. В модуле "generator", сигнал "out" задан как "output reg", а в модуле "tb" как "wire". 1. Не люблю reset. Предпочитаю задавать начальные значения регистрам при их объявлении или в секции initial 2. Не совсем понимаю Вас. Работать только по clk? Пример state-машины брал из шаблона verilog. 3. Модуль tb - это тестбенч. В них если я правильно понимаю выходные сигналы объявляются как wire. Иосиф Григорьевич, за Вашей мыслю так и не угнался) Слишком уж она сложная и мудреная, а настроения ребусы разгадывать нет. Цитата Вот странный Вы человек. Вам же говорили как лучше начинать делать правильно тем кто только встал на путь изучения HDL. https://electronix.ru/forum/index.php?showtopic=146965 Но Вы упорно продолжаете делать по-своему. Не только странный, но и упрямый - это Вы верно заметили) За наводку на мысль спасибо! Мысль: проблема в описании стейт-машины. Цитата(Flip-fl0p @ May 25 2018, 22:50)  Вот я смотрю Вы в прошлой теме описали несчастный счетчик. Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться.
|
|
|
|
|
May 25 2018, 17:01
|
Группа: Участник
Сообщений: 13
Регистрация: 29-04-18
Из: Москва
Пользователь №: 103 558

|
1. В таком случае как быть если схема зависла и необходимо ее сбросить? Или необходимо задать другие значения? В таком случае сначала "подать" сброс, а затем, по сигналу загрузки, записать входные данные. 2. Шаблон FSM не всегда является универсальным. Рекомендую использовать FSM "по clk" либо комбинационной логикой " @(*) ". 3. Я о другом. В модуле "generator" выходные сигналы делайте "wire-ми", чтобы могли их связывать с другими модулями (например верними уровнями) или для того, чтобы вывести этот сигнал на ножку ПЛИС и снять значения с "осцила".
Сообщение отредактировал Nieve - May 25 2018, 17:05
|
|
|
|
|
May 25 2018, 18:19
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Sprite @ May 25 2018, 19:41)  Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться. Смысл в том, что зачем описывать ещё раз то, что уже было когда то описано ? Это опять тратить время надо. Опять проверять счетчик надо. Да и схема выглядит в итоге некрасивой, и запутанной. Вот представьте: у вас есть некий блок, где применяется несколько счетчиков, несколько регистров сдвига и автомат. В случае если Вы пишете "все в одном" то при тестировании Вам приходится проверять автомат. А ещё придется проверять правильность работы счетчиков и регистров сдвига. Безусловно, счетчик штука простая, и шансов допустить ошибку мало. Тем не менее ошибку допустить можно и она скорее всего будет  . И Вам придется тратить время на проверку, выискивание этой ошибки. А если бы счетчик был отдельным файлом, который уже протестирован и гарантированно работает, то нет необходимости тратить время на его проверку. Поскольку неправильная работа счетчика говорит лишь о том, что им неправильно управляют. А ещё счетчик можно сделать универсальным и параметрами настраивать: 1. Направление счета: вверх или вниз. 2. Максимальное значение счета. 3. Будет ли счетчик обновляться при переполнении, или останется в максимальном значении. 4. Можно добавить режим Debug и выводить состояния счетчика на консоль. Я от такого подхода вижу только преимущества - ускорение разработки, упрощение тестирования, уменьшение риска совершить ошибку. Да и код становится более понятным. Проще поддерживать его. Но как поступать - решать Вам. Я все карты раскрыл
|
|
|
|
|
May 25 2018, 18:35
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Sprite @ May 25 2018, 19:41)  Иосиф Григорьевич, за Вашей мыслю так и не угнался) Слишком уж она сложная и мудреная, а настроения ребусы разгадывать нет. Не только странный, но и упрямый - это Вы верно заметили) Мысль: проблема в описании стейт-машины. Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться. так вот... Одноглазого бога звали Один. Именно поэтому мы говорим: один, два, три... И бит нечетности называется одд, тоже в честь него. А вот бит четности назван в честь Евы, потому как она дополнила Адама до четного. И для Адама это было большое событие, которые некоторые называют ивент. И именно по ивнтам срабатывает симулятор. А сигнал out у Вас переключается по какому событию? А вот оно: always @ (state) begin case (state) S0: begin cnt_comp_val = comp_val[0]; out = 1; end........ А переключается ли state??? Смотрим картинку и видим, что? Не переключается state, ни разу... А значит, если не выполняется always, то и до case дело ни разу не доходило.. Так с чего бы выполнилось вот это: out = 1??? Ведь этот out нигде больше не встречается... А почему? Да потому что некоторые маршируют по-Суворовски, через Альпы и при этом заявляют, что "Не люблю reset"... И все в таком же духе... А когда весь проект в один прекрасный момент раком встанет, то кого любить будете? Или только перезагружаться? И как тогда будете отлаживать железо?
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 26 2018, 14:23
|

Частый гость
 
Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414

|
Flip-Flop, Иосиф Григорьевич - спасибо! Прочитал еще раз документ и переписал автомат согласно последнему примеру. Получилось вот что: Код module generator ( input clk, input ena, output reg out ); wire pulse; reg [15:0] cnt_val; reg [15:0] cnt_comp_val; reg [2:0] state; parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3;
reg [15:0] comp_val[3:0]; initial begin comp_val[0] = 16'd4; comp_val[1] = 16'd5; comp_val[2] = 16'd6; comp_val[3] = 16'd7; end
//---------------------------------------- always @ (posedge clk) begin if (ena) begin case (state) S0: begin cnt_comp_val <= comp_val[0]; state <= pulse? S1:S0; out <= 1; end S1: begin cnt_comp_val <= comp_val[1]; state <= pulse? S2:S1; out <= 0; end S2: begin cnt_comp_val <= comp_val[2]; state <= pulse? S3:S2; out <= 1; end S3: begin cnt_comp_val <= comp_val[3]; state <= pulse? S0:S3; out <= 0; end default: begin cnt_comp_val <= comp_val[0]; state <= S0; out <= 0; end endcase end else begin cnt_comp_val <= comp_val[0]; state <= S0; out <= 0; end end
//---------------------------------------- always @(posedge clk) begin if(ena) if(cnt_val==cnt_comp_val) cnt_val = 4'b1; else cnt_val = cnt_val + 1'd1; else cnt_val = 4'd1; end assign pulse = (cnt_val==cnt_comp_val); //---------------------------------------- endmodule Проверил - все работает  А насчет счетчика в отдельном файле не вопрос - так и сделаю - просто собрал что называется на "скорую руку".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|