Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как правильно использовать readmemb
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Kokos
добрый день. возникла проблема с использованием данной команды:

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
для примера приведу простую программку с этой проблемой:
read_test
CODE
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_tb
CODE
`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.mif
CODE
-- 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;


проблема та же.ни у кого нет идей?
iosifk
Есть команды синтезируемые, а есть - несинтезируемые.
Симулятор выполняет несинтезируемые команды, а компилятор их не берет. Ну и в чем проблема?
У меня на сайте, в статьях, "Краткий Курс". Раздел описания компонентов, зависимых от производителя. Вообще там есть примеры, в которых показано, как в одном файле сделать два куска текста и для компилятора и для симулятора...
Удачи!
Kokos
Цитата(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."

нужна таблица, такая что ко всем строчкам единовременно можно обратиться. вот и подумал что так это можно реализовать.


iosifk
Цитата(Kokos @ Oct 31 2012, 11:09) *
смущает это:
"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."

нужна таблица, такая что ко всем строчкам единовременно можно обратиться. вот и подумал что так это можно реализовать.

Я давно с Ква не работал, но раньше пользовался только мегафункциями для описания памяти и там указывал mif...
А что значит "нужна таблица, такая что ко всем строчкам единовременно"... Это поисковая таблица, такая чтобы по данным искать адрес?
Kokos
таблица необходима,грубо говоря, для дискретизации монотонной кривой. затем будет определяться в какой из промежутков между точками этой кривой попадает входной сигнал.причем все за один такт.
да, по сути по данным ищется адрес.
есть конечно вариант просто в основном коде указать массив, и проинициализировать:

CODE
initial
begin
read_mem[0]=10b'0000000000;
...
read_mem[13]=10b'1000000000;
end


но если таблица большая будет, основной код не очень удобно читать станет. но похоже придется остановиться на этом варианте.
iosifk
Цитата(Kokos @ Oct 31 2012, 12:09) *
таблица необходима,грубо говоря, для дискретизации монотонной кривой. затем будет определяться в какой из промежутков между точками этой кривой попадает входной сигнал.причем все за один такт.
...
но если таблица большая будет, основной код не очень удобно читать станет. но похоже придется остановиться на этом варианте.

А такт - это сколько?
Дело в том, что таблицы в ПЗУ ПЛИС - это не самый лучший вариант использования ПЛИС...
И как Вы хотите получить из таблицы два значения данных? Двухпортовая память?
Kokos
Пока для частоты 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
iosifk
Цитата(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".
Удачи!
Kokos
Есть над чем подумать, спасибо за пищу для размышлений!
Kokos
Если не сложно можете еще объяснить пару моментов?

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 начал не так уж давно, поэтому заранее извиняюсь если вопросы покажутся глупыми.
XVR
Цитата(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];
и будет выполняться параллельно.
Будет. Синтезатор размотает цикл и сделает параллельное чтение из всей вашей таблицы mem_tab. В результате получится 512 сравнения input с константой и приоритетный шифратор на 512 входа (это если повезет). Если не повезет, то умножайте все на 2.

Это будет грандиозная, чисто логическая схема, которая угробит как частоту так и ресурсы вашей FPGA smile3046.gif

iosifk
Цитата(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 МГц такие вычисления сделает без труда. Зачем нужна именно ПЛИС?
И самое главное, прочтите те статьи, которые я вам рекомендовал. Ваша беда в том, что Вы мыслите "последовательностью вычислений", а для реализации проекта в ПЛИС надо мыслить "структурой вычислителя"...
Kokos
спасибо за ответы!с МК пока ни разу не сталкивался. видимо это скоро произойдет.

Цитата
Зачем нужна именно ПЛИС?

пока "сверху" хотят так.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.