Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ModelSim, вопросы новичка
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Страницы: 1, 2
Sprite
Доброго всем времени суток!

Решил отложить стандартный квартус-симулятор и изучить ModelSim. Отлаживаю модуль SPI, но картинка не та, которую я вижу в квартус-симуляторе, сигналы addr, data, miso в неопределенном состоянии. В чем может быть дело? Не заданы начальные условия или код модуля кривой? Картинка такая:



Исходный файл и тестбенч к нему во вложении. Заранее спасибо.
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
Nieve
Здравствуйте!
У вас в TestBench переменная "addr" задана как "wire" + присваивается значение константы - "0".
В самом модуле "spi_slave" вы начинаете с этой переменной работать.
Получается что с одной стороны вы переменной "addr" присваиваете присваиваете постоянное значение, а с другой, меняете его.
iosifk
Цитата(Sprite @ May 18 2018, 14:26) *
Доброго всем времени суток!

Решил отложить стандартный квартус-симулятор и изучить ModelSim. Отлаживаю модуль SPI, но картинка не та, которую я вижу в квартус-симуляторе, сигналы addr, data, miso в неопределенном состоянии. В чем может быть дело? Не заданы начальные условия или код модуля кривой? Картинка такая:

Насколько я помню, Вы не любите сигнал "Сброс".
Квартус "знает", что по исходному все триггера в проекте грузятся в 0. А Моделсим этого не знает...
А вот те, которые были зеленые, а стали красные - это значит скорее всего, что на сигнал пытаются воздействовать два драйвера...
Sprite
Nieve, Иосиф Григорьевич, спасибо!
Проглядел).
А можно как-нибудь автоматизировать посылку разных значений по SPI? В идеале хочется иметь тестбенч такого формата, чтобы в нем задавались только 2 параметра: значение данных и время в которые они посылаются, а сама колбаса из 32-х битов проходила автоматом. Как решить эту задачку? Ставить внешний цикл for над всем тестбенчем?
iosifk
Цитата(Sprite @ May 18 2018, 15:15) *
Nieve, Иосиф Григорьевич, спасибо!
Проглядел).
А можно как-нибудь автоматизировать посылку разных значений по SPI? В идеале хочется иметь тестбенч такого формата, чтобы в нем задавались только 2 параметра: значение данных и время в которые они посылаются, а сама колбаса из 32-х битов проходила автоматом. Как решить эту задачку? Ставить внешний цикл for над всем тестбенчем?

Пишем файл паттерна с этими двумя параметрами. И в тесбенче вычитываем их из файла. Результаты приема можно тоже писать в файл... Или в консоль.... А потом исходный и полученный программным инструментом сравнить...
AVR
Цитата(Sprite @ May 18 2018, 15:15) *
А можно как-нибудь автоматизировать посылку разных значений по SPI? В идеале хочется иметь тестбенч такого формата, чтобы в нем задавались только 2 параметра: значение данных и время в которые они посылаются, а сама колбаса из 32-х битов проходила автоматом. Как решить эту задачку? Ставить внешний цикл for над всем тестбенчем?

Мне понятен этот вопрос, вспоминаю как я был нубасом по части тестбенчей в HDL-симуляторах, и кажется представляю что хочется.
Краткий ответ может быть таким банальным: Verilog состоит не только из конструкций, которые могут быть синтезированы в ПЛИС, но и несинтезируемых конструкций, которые по сути не уступают по гибкости классическим языкам программирования (особенно System Verilog).
Поэтому да, можно действительно сделать так, чтобы была очень сложная логика взаимодействия с тестируемым устройством, причем делать ее на порядок проще и "халявнее" чем изобретать ответную часть на синтезируемых конструкциях Verilog. В том числе и функция имитации SPI с двумя входными параметрами.


Цитата(iosifk @ May 18 2018, 15:38) *
Пишем файл паттерна с этими двумя параметрами. И в тесбенче вычитываем их из файла. Результаты приема можно тоже писать в файл... Или в консоль.... А потом исходный и полученный программным инструментом сравнить...

Прошу прощения, но совет странный sm.gif Файл? Зачем там.
Stewart Little
Цитата(AVR @ May 18 2018, 15:56) *
Прошу прощения, но совет странный sm.gif Файл? Зачем там.

Затем, что тестбенч будет один и тот же, и его не потребуется переписывать под новый массив данных, если их нужно будет изменить.
Flip-fl0p
Код
А можно как-нибудь автоматизировать посылку разных значений по SPI? В идеале хочется иметь тестбенч такого формата, чтобы в нем задавались только 2 параметра: значение данных и время в которые они посылаются, а сама колбаса из 32-х битов проходила автоматом. Как решить эту задачку? Ставить внешний цикл for над всем тестбенчем?

Я обычно делаю так:
1. У меня есть отдельная папочка, которая называется SIM_MODELS.
2. В этой папочке хранятся, как ,наверное, легко догадаться - модели для симуляции. Эти модели я специально написал на несентизируемом подмножестве языка HDL. Обычно в качестве моделей я создаю распространенную периферию - источники сигнала, такие как UART, SPI, I2C, и пр. Недавно пришлось написать VGA источник, где в качестве параметра - генерируемое разрешение.
3. В модели у меня есть возможность задать необходимые параметры. Одним из таких параметров является возможность выбора файла откуда читаются внешние воздействия.
4. Когда я начинаю моделировать в Modelsim я просто подключаю к тестбенчу мою модель, в которой указываю файл откуда читать внешние воздействия.
5. В случае если модель не удовлетворяет необходимому функционалу - я её улучшаю.
В итоге имеем - крайне простую генерацию внешних воздействий. Постоянно улучшающуюся модель источника. И самое главное возможность повторного использования ранее написанного, что ускорит создание проектов в будущем. Основная цель - по-максимуму применять то, что было написано и отлажено раньше, что уменьшит вероятность ошибок, и ускорит разработку.
AnatolySh
Цитата(Sprite @ May 18 2018, 14:26) *
Решил отложить стандартный квартус-симулятор и изучить ModelSim.
Сказали а, говорите сразу и б: управляйте ModelSim-ом с помощью tcl.
Потратите время на изучение, зато потом будете сильно экономить на отладке.
Не претендую на непогрешимость, но вот (в скрепке) пример: вдруг, чего себе возьмёте?
Любые вопросы и замечания приветствуются.

R6L-025
Вроде как неплохо еще прогонять на случайных выборках сигналов. Т.е. задаете случайные данные, ставите передающий модуль, с приемного считываете и сравниваете с переданными. Это довольно легко поддается автоматизации и можно гонять случайные слова данных нужное количество раз. Еще попробуйте посмотреть в сторону Altera'ских bfm модулей для верификации. Из их исходников можно много интересного понадергать
Flip-fl0p
Цитата(R6L-025 @ May 18 2018, 22:02) *
Altera'ских bfm модулей для верификации. Из их исходников можно много интересного понадергать

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

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

Пантово..! Очень пантово!) Прямо все как я люблю: нажал одну кнопку и ПЭМС! - файл симуляции готов!
Особенно мне понравились строчки "ThisPCLocationIsWORK" и "ThisPCLocationIsHOME" батника simulate biggrin.gif Браво! Реально круто! disco.gif Благодаря Вашему коду наткнулся на интересную статью, может кому пригодится.

Цитата(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. Как быть в этом случае? Описывать всю схему, связи в верилоге или есть еще какие варианты? И как в этом случае привязывать входы-выходы к конкретным пинам?
Marat Zuev
Цитата(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
Sprite
Цитата(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-элементах, чтобы не тратить драгоценные логические элементы ПЛИСа.

R6L-025
А почему эту самую корку использовать нельзя? Если хотите без корки реализовать память - посмотрите главу Recommended HDL Coding Styles в quartus handbook. Там есть примеры кода которые реализует память которая будет синтезирована именно на блоках памяти. Еще есть директивы самого Quartus позволяющие указать что вы хотите от него. Попробуйте погуглить по слову "ramstyle".
Marat Zuev
Цитата(Sprite @ May 20 2018, 07:38) *
Как мне к нему обратиться?
Вам надо было поставить галку здесь:

R6L-025
А, еще есть quartus templates. В выпадающем меню Edit->Insert Template есть шаблоны кода и директив (чтоб это меню появилось нужно чтоб в квартусе было открыто окно встроенного редактора кода). Там, как раз, есть шаблоны работы с памятью.
Sprite
Цитата(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, а иначе зачем я его изучать начал? ))
R6L-025
Ну тогда попробуйте поиграть с директивами. Quartus при синтезе проводит оптимизацию, и может попросту решить что использовать триггеры вместо памяти целесообразней для такого малого объема
Sprite
Спасибо, попробую. Еще один вопрос: как описать этот BDF на verilog?



Особенно интересует привязка к конкретным пинам. В качестве top-level использовать нужно verilog-файл?
R6L-025
Да, 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"
Sprite
Цитата(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
Всем добра!

Перевел проект полностью на 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. Как и куда прописывать пути до библиотек их содержащих?
Marat Zuev
Цитата(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
Flip-fl0p
Я бы ещё не применял имена модулей - названия примитивов регистров. Например DFF - имя запрещенное. Очень странно что Quartus не ругался...
Sprite
Цитата(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. Может быть в этом дело?
Flip-fl0p
Поскольку полного кода я не вижу, я предположил, что вы создали свой модуль с именем DFF. А этого делать крайне нежелательно.

Цитата
Я и беру его из библиотеки, только какой пока не знаю, так же как и DFF

Это как ? wacko.gif
Вообще было бы неплохо, чтобы Вы полный текст проекта сюда выложили. Обычно для RTL симуляции библиотек надо минимум. И тип чипа вообще роли играть не должен !
Sprite
Цитата(Flip-fl0p @ May 21 2018, 20:17) *
Поскольку полного кода я не вижу, я предположил, что вы создали свой модуль с именем DFF. А этого делать крайне нежелательно.
Это как ? wacko.gif
Вообще было бы неплохо, чтобы Вы полный текст проекта сюда выложили. Обычно для 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 для длинных цитат программного кода!
Flip-fl0p
А какую цель Вы ставите перед собой ?
Сделать правильно ?
Или научиться ?
Или сделать и забыть ?
Просто Ваш код, ничего кроме дерганья глаза у меня не вызвал...
Sprite
Цитата(Flip-fl0p @ May 21 2018, 21:30) *
А какую цель Вы ставите перед собой ?
Сделать правильно ?
Или научиться ?

Сделать правильно и научиться.
Marat Zuev
Цитата(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, который чип не поддерживает, но с которым хочется работать.
AVR
Цитата(Sprite @ May 20 2018, 12:29) *
Спасибо, попробую. Еще один вопрос: как описать этот BDF на verilog?

В квартусе есть функция "convert to HDL code" и этот BDF превратится в код на Verilog.
nice_vladi
Цитата(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 память? Если так - тогда стоит полистать мануалы по стилям кодинга от Альтеры же - там примеры, как написать, что бы ваш код лег именно в память, а не логику.
Sprite
С учетом замечаний Marat Zuev переписал модуль, получилось компактнее! biggrin.gif
Код
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 в каждом файле?
Flip-fl0p
Цитата(Sprite @ May 22 2018, 11:40) *

А если надо 1024 разряда ?
Вы вроде хотите научиться делать правильно. Тут Вам могут помочь, и обязательно помогут. Но от вас требуется правильно сформулировать задачу !
Я так и не понял толком, что Вы хотите сделать. Похоже на некое подобие памяти. Но где такое может пригодиться я ума не приложу !
P.S. Спускаться на уровень описания взаимодействия триггеров между собой необходимо лишь в том случае, когда требуется выжать из чипа каждый мегагерц. Но без правильного файла констрейнов, и атрибутов синтеза - грош цена такому описанию... Один фиг, синтезатор разложит по-своему. Да и не стоит недоверять синтезатору. Синтезатор умный. Если правильно описана схема на поведенческом уровне , то синтезатор её сам прекрасно разместит в ячейках FPGA. Почти всегда синтезатор делает это лучше, чем разработчик.
iosifk
Цитата(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]));
совершенно криво, можно даже сказать, что уродливо... sad.gif

Короче, проект методически начат не верно, отсюда и все вопросы...
Sprite
Спасибо всем за критику)

Задачу в двух словах описать можно так: есть МК и есть ПЛИС. На ПЛИС построено несколько конечных автоматов, каждый из которых работает со своими данными, которые загружаются из МК по SPI по разным адресам RAM. Поскольку каждый блок работает со своим словом данных и нужно чтобы данные всегда были видимы блоку я отказался от использования одного компонента RAM, скажем 16x16, выдающего по адресу только одно значение данных и использую несколько блоков RAM минимальной разрядности (что, как справедливо заметил Иосиф Григорьевич, криво и уродливоwink.gif), Компонент RAM пришлось генерировать через визард, т.к. другого способа добавить ячейку RAM я не нашел (создавать RAM из темплейтов пробовал - при компиляции создаются D-триггеры, что громоздко и неоптимально ввиду лишней занимаемой памяти). Минимальная разрядность адреса блока RAM через визард - 2, если указываю 1 - выдает ошибку.
Sprite
Довольный как слон biggrin.gif
Все получилось! Собрал проект в modelsim 10.3, все работает, нашел благодаря ему пару ошибок, которые в стандартном квартус-симуляторе не отображались:



В момент времени, когда начинал работать умножитель на одном модуле появлялось неопределенное состояние, вспомнил Иосифа Григорьевича, добавил reset описание default и вуаля! Сейчас соберу все в красивый скрипт, чтобы на кнопку только ПЭМС и все как я люблю - во весь экран файл симуляции) Доделок конечно еще много, но какая-то конкретика есть. Впереди освоение TimeQuest...
iosifk
Цитата(Sprite @ May 22 2018, 13:24) *
Спасибо всем за критику)

Задачу в двух словах описать можно так: есть МК и есть ПЛИС. На ПЛИС построено несколько конечных автоматов, каждый из которых работает со своими данными, которые загружаются из МК по SPI по разным адресам RAM. Поскольку каждый блок работает со своим словом данных и нужно чтобы данные всегда были видимы блоку я отказался от использования одного компонента RAM, скажем 16x16, выдающего по адресу только одно значение данных и использую несколько блоков RAM минимальной разрядности

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

Чтение через арбитр подразумевает поочередное обращение к данным, а мне они (данные) нужны всегда, этот вариант я продумывал в самом начале.
iosifk
Цитата(Sprite @ May 22 2018, 15:28) *
Чтение через арбитр подразумевает поочередное обращение к данным, а мне они (данные) нужны всегда, этот вариант я продумывал в самом начале.

И в каждом состоянии автомат пользуется этими данными? Или все же не в каждом?
Sprite
Цитата(iosifk @ May 22 2018, 19:35) *
И в каждом состоянии автомат пользуется этими данными? Или все же не в каждом?

Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока?
Flip-fl0p
Цитата(Sprite @ May 22 2018, 18:54) *
Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока?

Так и запихните в Ваш каждый автомат блок памяти. И по SPI грузите в нужный автомат, нужные данные. Так логичнее схема смотрится, как мне кажется.
Есть SPI контроллер, который принимает данные. Есть простенький Арбитр - который принимаемые по SPI данные записывает в память автомата. И есть ваши автоматы, которые уже работают с памятью, куда арбитр данные загнал.
Вообще неплохо было бы сначала на бумаге структурную схему проекта нарисовать. Затем описать алгоритмы в виде блок схем, или графов перехода, или опять в виде структурной схемы прохождения данных. И затем уже все это дело перенести на HDL wink.gif

Как мне кажется такая структура проекта логичнее, понятнее, и проще. И хоть 1000 автоматов добавляйте . Интерфейс с внешним модулем (арбитром)один. cool.gif
iosifk
Цитата(Sprite @ May 22 2018, 18:54) *
Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока?

То, что "проще" для Вас, совсем не проще для ПЛИС... На 16х16 битов данных необходимо задействовать столько же интерконнектов. И это самый дорогой ресурс в ПЛИС.
И, кстати не говорилось о том, с какой скоростью идет обработка данных. Говорилось о 25 Мгц от АЦП и 100 Мгц тактовой. А сколько тактов в автомате и в скольки тактах он пользуется данными из памяти? И всегда ли арбитр будет задерживать автоматы, если запрос на доступ подать на 1 такт раньше, чтобы ссработал арбитр?
И, кстати, компилятор совершенно прав, когда пытается вместо блочной памяти, применить триггера. Потому как ко входам триггеров идет одна шина в 16 бит, а сами триггера можно разместить в любом месте кристалла. А вот блочная память сидит в центре кристалла и от нее надо гнать 16х16 проводов...
Sprite
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
nice_vladi
Цитата(Sprite @ May 23 2018, 11:01) *
[b]
Код
** Error: (vsim-3601) Iteration limit reached at time 0 ns.


Это modelsim достигает предела итераций моделирования. Из-за того, что в core PLL много подмодулей, и они довольно крупные и для симуляции каждого требуется куча операций. Вот он и наедается. Можно покрутить параметр лимита операций в настройка сабжа, но лучше при моделировании не использовать PLL, а описывать клоки несинтезируемыми конструкциями языка (ИМХО).
Т.е.:
Для симуляции используете "искусственные" клоки;
Для синтеза - корку Альтеры;

Совсем хорошо будет отбить дефайнами эти области, что бы вручную не комментить каждый раз.
OM-S
В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение

Не могу запустить ваш пример и проверить, но в в macros.do наверно нужно указать симуляцию с разрешением 1ps.(строка 4 vsim -t 1ps tb).
Pll обычно симулируются с пикосекундными разрешениями.
Sprite
Цитата(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 и т.д.) Насколько такой подход правильный - не знаю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.