Перейти к содержанию

    

ModelSim, вопросы новичка

Всё, чем Вы восторгались, написано, в том числе после прочтения статей, подобных этой )

Как раз для Вас с того же сайта: https://marsohod.org/11-blog/251-sch-or-txt

 

Спасибо, я уже понял что надо делать все на verilog. У меня в схеме есть такой компонент:

 

ram.png

 

Это сгенерированый компонент Single-port RAM megafunction. В RLT это выглядит так:

 

ram_rlt.png

 

Как мне к нему обратиться? CYCLONEIII_RAM_BLOCK? Задача то в общем простая - сделать компонент для хранения 1 слова, но не на D-триггерах, а на RAM-элементах, чтобы не тратить драгоценные логические элементы ПЛИСа.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему эту самую корку использовать нельзя? Если хотите без корки реализовать память - посмотрите главу Recommended HDL Coding Styles в quartus handbook. Там есть примеры кода которые реализует память которая будет синтезирована именно на блоках памяти. Еще есть директивы самого Quartus позволяющие указать что вы хотите от него. Попробуйте погуглить по слову "ramstyle".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Как мне к нему обратиться?
Вам надо было поставить галку здесь:

Ram.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, еще есть quartus templates. В выпадающем меню Edit->Insert Template есть шаблоны кода и директив (чтоб это меню появилось нужно чтоб в квартусе было открыто окно встроенного редактора кода). Там, как раз, есть шаблоны работы с памятью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А, еще есть quartus templates. В выпадающем меню Edit->Insert Template есть шаблоны кода и директив (чтоб это меню появилось нужно чтоб в квартусе было открыто окно встроенного редактора кода). Там, как раз, есть шаблоны работы с памятью.

Это первое, с чего я начинал. Вставлял template, но он RAM все равно синтезируется как D-триггер. Попробую сделать как написал Marat Zuev, посмотрим что получится.

Вообще мне нужно создать несколько RAM, каждый из которых использовался бы только под хранение одного элемента, но если делать через мегавизард - то минимальная разрядность шины адреса - 2. Приходится создавать RAM под 2 элемента, а шину адреса тупо весить на VCC. Получается не оптимально как то. В идеале ищу такое решение, чтобы можно было создавать RAM для хранения одного элемента (16 бит данных) и чтобы его полностью можно было описать на verilog, а иначе зачем я его изучать начал? ))

Изменено пользователем Sprite

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тогда попробуйте поиграть с директивами. Quartus при синтезе проводит оптимизацию, и может попросту решить что использовать триггеры вместо памяти целесообразней для такого малого объема

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, попробую. Еще один вопрос: как описать этот BDF на verilog?

 

scheme.png

 

Особенно интересует привязка к конкретным пинам. В качестве top-level использовать нужно verilog-файл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, 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"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Да, 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. Как и куда прописывать пути до библиотек их содержащих?

Изменено пользователем Sprite

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Если я правильно понимаю - modelsim хочет увидеть компоненты AND2, altsyncram и DFF. Как и куда прописывать пути до библиотек их содержащих?
Понимаете правильно. Вам надо добавить требуемые библиотеки примерно так:

vsim -voptargs=+acc -L "требуемая библиотека" -L Ваша_рабочая_библиотека Ваша_рабочая_библиотека.Ваш_tb

у меня, например, это было так:

vsim -voptargs=+acc -L maxii_ver -L lpm_ver -L work work.tb

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы ещё не применял имена модулей - названия примитивов регистров. Например DFF - имя запрещенное. Очень странно что Quartus не ругался...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я бы ещё не применял имена модулей - названия примитивов регистров. Например 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. Может быть в этом дело?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поскольку полного кода я не вижу, я предположил, что вы создали свой модуль с именем DFF. А этого делать крайне нежелательно.

 

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

Это как ? :wacko:

Вообще было бы неплохо, чтобы Вы полный текст проекта сюда выложили. Обычно для RTL симуляции библиотек надо минимум. И тип чипа вообще роли играть не должен !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Поскольку полного кода я не вижу, я предположил, что вы создали свой модуль с именем DFF. А этого делать крайне нежелательно.

Это как ? :wacko:

Вообще было бы неплохо, чтобы Вы полный текст проекта сюда выложили. Обычно для RTL симуляции библиотек надо минимум. И тип чипа вообще роли играть не должен !

 

Вот код одного из модулей:

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
Замена code -> codebox

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти