|
как правильно использовать readmemb |
|
|
|
Oct 29 2012, 06:29
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
добрый день. возникла проблема с использованием данной команды: CODE reg [15:0] MEM_0 [0:359]; $readmemb("MEM_0.mif", MEM_0); при моделировании в моделсиме на выходе то что нужно но при компиляции проекта в квартусе возникает следующая ошибка: Error (10170): Verilog HDL syntax error at MEM_0.mif(1) near text - Error (12153): Can't elaborate top-level user hierarchyтекст самого файла : CODE -- Quartus II generated Memory Initialization File (.mif)
WIDTH=16; DEPTH=360;
ADDRESS_RADIX=UNS; DATA_RADIX=BIN;
CONTENT BEGIN 0 : 0000000000010000; [1..15] : 0000000000000000; 16 : 0000000000001000; [17..359] : 0000000000000000; END;
Анализ курент файл применительно к mif файлу дает следующее: Error (12074): File D:/.../.../MEM_0.mif is not a recognized design file type Error: Quartus II 64-Bit Analyze Current File was unsuccessful. 1 error, 1 warning Error: Peak virtual memory: 371 megabytes Error: Processing ended: Mon Oct 29 09:36:13 2012 Error: Elapsed time: 00:00:00 Error: Total CPU time (on all processors): 00:00:00в чем проблема?кому не сложно объясните пожалуйста.
Сообщение отредактировал Kokos - Oct 29 2012, 06:31
|
|
|
|
|
 |
Ответов
(1 - 13)
|
Oct 31 2012, 05:57
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
для примера приведу простую программку с этой проблемой: read_testCODE module read_test ( clk,data_out);
input clk; output [13:0] data_out;
parameter size = 10; reg [13:0] read_mem[size-1:0]; reg [13:0] data_out; reg [9:0] i;
initial begin i=0;
$readmemb ("data.mif", read_mem); end
always@(posedge clk) begin data_out<= read_mem[i]; i <= i + 1; end
endmodule read_test_tbCODE `timescale 1ns/10ps module read_test_tb; reg clk;
read_test model(.clk(clk));
initial begin clk=0; end
always begin #5000 clk=~clk; end
endmodule
data.mifCODE -- Copyright © 1991-2011 Altera Corporation -- Your use of Altera Corporation's design tools, logic functions -- and other software and tools, and its AMPP partner logic -- functions, and any output files from any of the foregoing -- (including device programming or simulation files), and any -- associated documentation or information are expressly subject -- to the terms and conditions of the Altera Program License -- Subscription Agreement, Altera MegaCore Function License -- Agreement, or other applicable license agreement, including, -- without limitation, that your use is for the sole purpose of -- programming logic devices manufactured by Altera and sold by -- Altera or its authorized distributors. Please refer to the -- applicable agreement for further details.
-- Quartus II generated Memory Initialization File (.mif)
WIDTH=10; DEPTH=14;
ADDRESS_RADIX=UNS; DATA_RADIX=BIN;
CONTENT BEGIN 0 : 0000101010; 1 : 0000001111; 2 : 0010101010; 3 : 0000010111; 4 : 0000100011; 5 : 0000010101; 6 : 0000000100; 7 : 0101010011; 8 : 0000000011; 9 : 0000111111; 10 : 0000000011; 11 : 0100101010; 12 : 0000000010; 13 : 0000000110; END;
проблема та же.ни у кого нет идей?
Сообщение отредактировал Kokos - Oct 31 2012, 06:22
|
|
|
|
|
Oct 31 2012, 07:09
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
Цитата(iosifk @ Oct 31 2012, 09:25)  Есть команды синтезируемые, а есть - несинтезируемые. Симулятор выполняет несинтезируемые команды, а компилятор их не берет. Ну и в чем проблема? У меня на сайте, в статьях, "Краткий Курс". Раздел описания компонентов, зависимых от производителя. Вообще там есть примеры, в которых показано, как в одном файле сделать два куска текста и для компилятора и для симулятора... Удачи! смущает это: "Quartus II Integrated Synthesis supports the $readmemb and $readmemh system tasks to initialize memories. Example 14–1 shows an initial construct that initializes an inferred RAM with $readmemb." нужна таблица, такая что ко всем строчкам единовременно можно обратиться. вот и подумал что так это можно реализовать.
Сообщение отредактировал Kokos - Oct 31 2012, 08:00
|
|
|
|
|
Oct 31 2012, 08:09
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
таблица необходима,грубо говоря, для дискретизации монотонной кривой. затем будет определяться в какой из промежутков между точками этой кривой попадает входной сигнал.причем все за один такт. да, по сути по данным ищется адрес. есть конечно вариант просто в основном коде указать массив, и проинициализировать: CODE initial begin read_mem[0]=10b'0000000000; ... read_mem[13]=10b'1000000000; end но если таблица большая будет, основной код не очень удобно читать станет. но похоже придется остановиться на этом варианте.
Сообщение отредактировал Kokos - Oct 31 2012, 08:10
|
|
|
|
|
Oct 31 2012, 11:19
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Kokos @ Oct 31 2012, 12:09)  таблица необходима,грубо говоря, для дискретизации монотонной кривой. затем будет определяться в какой из промежутков между точками этой кривой попадает входной сигнал.причем все за один такт. ... но если таблица большая будет, основной код не очень удобно читать станет. но похоже придется остановиться на этом варианте. А такт - это сколько? Дело в том, что таблицы в ПЗУ ПЛИС - это не самый лучший вариант использования ПЛИС... И как Вы хотите получить из таблицы два значения данных? Двухпортовая память?
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Oct 31 2012, 11:55
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
Пока для частоты 10 МГц. Сама таблица будет большая 512 слов X 16 разрядов. А сравнение пока как-то так, чтобы одно значение брать: CODE for(i = 0; i < 511; i = i+1) begin if(mem_tab[i]>=input && input>mem_tab[i+1]) begin output<=i; end end
Сообщение отредактировал Kokos - Oct 31 2012, 11:56
|
|
|
|
|
Oct 31 2012, 12:14
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Kokos @ Oct 31 2012, 15:55)  Пока для частоты 10 МГц. Сама таблица будет большая 512 слов X 16 разрядов. А сравнение пока как-то так, чтобы одно значение брать: CODE for(i = 0; i < 511; i = i+1) begin if(mem_tab[i]>=input && input>mem_tab[i+1]) begin output<=i; end end
При 10 МГц можно считывать данные из внешней памяти... Вот это - mem_tab[i]>=input происходит так: сначала на счетчике устанавливается адрес, потом, на следующем такте, он защелкивается в ПЗУ, потом из ПЗУ вычитываются данные, при этом, возможно, тратится до 2-х тактов на латентность ПЗУ, потом, на следующем такте, производится сравнение. Если вторая ветвь - input>mem_tab[i+1] делается одновременно, то такты не расходуются. А если нет, то +1 такт на инкремент счетчика и + столько же тактов, сколько и для первого сравнения. Возможно без латентности памяти... И потом, на следующем такте, берется && И это повторяется 511 раз? но только это ведь не Си, и "for(i = 0; i < 511; i = i+1)" тут не работает... Поэтому здесь надо все переделать... Увы. Надо нарисовать алгоритм вычисления, и по нему блок-схему вычислителя... А что бы понятнее было, найдите у меня на сайте "Гайку М3". Удачи!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Oct 31 2012, 12:20
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
Есть над чем подумать, спасибо за пищу для размышлений!
|
|
|
|
|
Oct 31 2012, 14:00
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
Если не сложно можете еще объяснить пару моментов?
1)постараюсь объяснить подробнее.имею убывающую монотонную функцию записанную в таблицу. (в 0-й строчке максимум, в 511-й минимум). по каждому фронту частоты 10 МГц, на выходе моего ящика должен появляться номер строчки из таблицы mem_tab [0:511], такой что в этой строчке записано самое маленькое значение, которое все еще больше входного сигнала. Пусть этот номер будет N=511 (худший случай, входной сигнал меньше минимума функции). И если на одно сравнение требовалось ~4 такта по Вашему алгоритму. то на 511 сравнений будет необходимо 2044 такта вспомогательного генератора, по которому данные будут считываться из памяти. Получится ведь очень большая частота вспомогательного генератора.
2) почему for не будет тут работать?просто я думал что синтезатор будет раскладывать его в параллельные ветви кода, например
for(i=0;i<=2;i=i+1) begin a[i]=b[i]; end
разложится в a[0]=b[0]; a[1]=b[1]; и будет выполняться параллельно.
заниматься программированием на verilog начал не так уж давно, поэтому заранее извиняюсь если вопросы покажутся глупыми.
|
|
|
|
|
Nov 1 2012, 09:19
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Kokos @ Oct 31 2012, 18:00)  2) почему for не будет тут работать?просто я думал что синтезатор будет раскладывать его в параллельные ветви кода, например
for(i=0;i<=2;i=i+1) begin a[i]=b[i]; end
разложится в a[0]=b[0]; a[1]=b[1]; и будет выполняться параллельно.
заниматься программированием на verilog начал не так уж давно, поэтому заранее извиняюсь если вопросы покажутся глупыми. Если вы примените generate for(i=0;i<=2;i=i+1) begin a[i]=b[i]; end ... то компилятор не сможет сделать 512 выходов из блока памяти, а значит, что он это заменит на 512 регистров и схем сравнения. Вот только память инициализируется, а регистры - нет... И весь ресурс ПЛИС на это рухнет. А между тем обычный микроконтроллер, работающий на 500 - 800 МГц такие вычисления сделает без труда. Зачем нужна именно ПЛИС? И самое главное, прочтите те статьи, которые я вам рекомендовал. Ваша беда в том, что Вы мыслите "последовательностью вычислений", а для реализации проекта в ПЛИС надо мыслить "структурой вычислителя"...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Nov 1 2012, 10:51
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 5-11-10
Из: Санкт-Петербург
Пользователь №: 60 667

|
спасибо за ответы!с МК пока ни разу не сталкивался. видимо это скоро произойдет. Цитата Зачем нужна именно ПЛИС? пока "сверху" хотят так.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|