Jump to content

    

Эквивалентность РОМ мегафункции и кода

Здравствуйте, уважаемве.

Я в квартусе 18 создаю мегафункцию ROM - однопортовую, простую с инициализированой памятью.

Квартус не хочет автоматически создавать ром в on-chip memory, за сим приходится использовать мегу.

Потом я достаю данные из нее как:

wire signed [32-1 : 0] coefsC;
rom470 rom(caddr, clk,coefsC);
always @(posedge clk)
if (reset_n == 0)
	cc <= 0;
else
	cc <= coefsC;

и мне оч хочется это в модельсиме просимулировать. 

Я не знаю как квартуса мегу впихнуть в модельсим, за сим я пишу так:

reg signed [32-1 : 0] coefsC [0:479];
initial $readmemh("coefs470.txt", coefsC);


always @(posedge clk)
if (reset_n == 0)
	cc <= 0;
else
	cc <= coefsC[caddr];

Будет ли второй, "ручной" вариант, эквивалентен мегафункции в железе.

Заранее благодарен

 

 

Share this post


Link to post
Share on other sites
42 минуты назад, diwil сказал:

Я в квартусе 18 создаю мегафункцию ROM - однопортовую, простую с инициализированой памятью.

Квартус не хочет автоматически создавать ром в on-chip memory, за сим приходится использовать мегу.

......

Будет ли второй, "ручной" вариант, эквивалентен мегафункции в железе

А как там с латентностью?

И для чего нужен "Сброс" для памяти?

Share this post


Link to post
Share on other sites

сброс для коэффициента. наверное и не нужен.

про латентность я не нашел.

 

кто по существу может ответить?

 

Share this post


Link to post
Share on other sites
21 минуту назад, diwil сказал:

кто по существу может ответить?

Наводящий вопрос про сброс по существу и был. Если у памяти физически нет сброса, то РОМ будет реализован на триггерах. Это же очевидно.

Share this post


Link to post
Share on other sites
8 минут назад, andrew_b сказал:

Наводящий вопрос про сброс по существу и был. Если у памяти физически нет сброса, то РОМ будет реализован на триггерах. Это же очевидно.

Ну да, а дальше будет это:

 

 

Verilog HDL Synthesis Attributes and Directives

 

 

http://quartushelp.altera.com/14.1/mergedProjects/hdl/vlog/vlog_file_dir.htm

 

Share this post


Link to post
Share on other sites

и, кстати да, почему с (* ramstyle = "M9K, no_rw_check" *) (и множеством других комбинаций)  память на регистрах квартус оставляет?

 

Share this post


Link to post
Share on other sites

1. В Quartus II Handbook Volume 1: Design and Synthesis есть раздел Inferring Memory Functions from HDL Code, где подробно описывается, как нужно описать память желаемого типа, чтобы Quartus ее обнаружил, в т.ч. случаи, когда он не может расположить ее на BRAM.

 

2. У "почему не получается" факторов много. Приведите код или проект, чтобы кто-то мог посмотреть и подсказать. Может, у Вас Stratix V, где нет M9K. ( :

 

3. Добавить библиотеки мегафункций и моделей аппаратных блоков в Modelsim очень просто:

В Quartus заходим Tools > Launch Simulation Library Compiler

Выбираем Modelsim и папку с vsim.exe (...\modeltech64_10.2c\win64)

Выбираем семейства (они нужны, если соберетесь симулировать gate-level или работать с трансиверами и др. аппаратными блоками; для ALTPLL они не нужны)

Выбираем Verilog

Выбираем Output directory

Жмем Start Compilation

 

После окончания компиляции в выбранной Output directory будет лежать modelsim.ini. Нужно скопировать строчки с библиотеками (altera_ver и другие) в секцию [Library] файлов ...\modeltech64_10.2c\modeltech.ini и в файл проекта (.mpf). В последующем, библиотеки Альтеры будут присутствовать в каждом новом проекте, т.к. каждый раз при создании проекта они копируются из ...\modeltech64_10.2c\modeltech.ini.

 

4. Синтез Quartus поддерживает инициализацию памяти с помощью $readmemb и $readmemh.

Share this post


Link to post
Share on other sites

спсибо за ответ!

Но квартус 18 не дает скомпилировать либы и говорит, что все они уже есть в модельсиме.

 

Share this post


Link to post
Share on other sites

другой вопрос - 

если я пишу так (это двухпортовая рам):

(* ramstyle = "M9K, no_rw_check" *) reg signed [DATA_IN_SIZE-1:0] delay [511:0];

...

always @(posedge clk)

...

dd <= delay[rdaddr];

...

 

и квартус это запихивает действительно в память, то будет ли соответствие чтению из памяти в симутяторе и в железе (такт порядка 8мгц, но это наверное, не важно)?

 

Share this post


Link to post
Share on other sites
29 минут назад, diwil сказал:

будет ли соответствие чтению из памяти в симутяторе и в железе

Да.

Share this post


Link to post
Share on other sites
2 hours ago, diwil said:

Но квартус 18 не дает скомпилировать либы и говорит, что все они уже есть в модельсиме.

Тогда м.б. у Вас ModelSim-Intel FPGA Edition, которая поставилась вместе с Quartus? Тогда все библиотеки уже в него добавлены (см. вкладку Libraries в главном окне Modelsim).

Чтобы запустить симуляцию проекта с LPM-функциями, подключите библиотеку altera_mf_ver: Simulate > Start Simulation > Вкладка Libraries > Add.

Share this post


Link to post
Share on other sites

о! примного благодарен! получилось! (не могу, правда сказать, что с первого раза, но получилось)

И получилось так (это еще один ворос):

Я объявляю мега-ром с данными 

CONTENT BEGIN
    0000    :    0000012f;
    0001    :    00000045;
    0002    :    00000028;
    0003    :    ffffffec;

ит.д. , но самые последние коэффициенты - нули. 

а так же ром2 с данными:

FFFFFC
000001
000002
и т.д.

 

и такой код:

always @(posedge clock) address <= address + 1;

filter_rom rom (address,clock,q);
always @(posedge clock) zz <= q;

reg [23:0] rom2[215:0];
initial $readmemh("coefs1024-24bits.txt", rom2);

always @(posedge clock) y1 <= rom2[address];

на выходе получается:

image.png.46432e72788c5f2b99d06615e723e31c.png

 

Правильно ли я понимаю, что для того, чтобы выровнять "фазы" мега-рома и ром2 (регистр zz в коде выше) я должен написать-добавить конвеер в симуляторе (мне так проще) типа такого:

 

always @(posedge clock) y1 <= rom2[address];
always @(posedge clock) y2 <= y1;
always @(posedge clock) yy <= y2;

и тогда (опять же в модельсиме) получится

image.png.691bfc74f1931f38be3e318e61e89704.png

т.е. zz и yy синхронны. 

Но тогда возникает еще вопрос - если я объявляю RAM и квартус делает ее, по сути дела, асинхронной, (при этом данные в ончип памяти), то можно ли как-либо сконфигурить мега ром, чтобы она вела себя как 

reg [23:0] rom2[215:0];

(при этом если я пишу как строчкой выше, при этом нет никакого асинхронного доступа и даже записи, то он упорно не хочет размещать коэффициенты в памяти) ?

 

Заранее благодарю.

 

 

 

 

Share this post


Link to post
Share on other sites
13 часов назад, diwil сказал:

если я объявляю RAM и квартус делает ее, по сути дела, асинхронной, (при этом данные в ончип памяти)

Он-чип память синронная в принципе. Без клока вы ничего с ней сделать не сможете.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this