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

Выгрузка данных из ROM

Здравствуйте!Реализую выгрузку 10 периодов сигнала с последующим наблюдением сигнала в modelSim.

Если я правильно понимаю, сначала файл с периодом (половиной, четвертью) записать в ROM (написал по шаблону, как в tamplate) в формате intel hex. На линию адреса записать адрес начала сигнала и сделать счетчик, инкриминирующий адрес на единичку.

post-83540-1415258641_thumb.jpg

Коэффициенты получил в Matlab'е c помощью функции dec2bin, после полученные данные сохраняю в файл с помощью функции dlmwrite (так же пробовал fwrite и fprintf)

post-83540-1415258742_thumb.jpg

, но проблема в том, что числа сохраняются в виде символов, и вместо того, чтобы число 1110 представилось как 1110, оно представляется в виде 31 31 31 30 (в ASC II). В итоге в конвертере WinHEx при переводе из bin->intel hex получается не то, что нужно.

post-83540-1415258710_thumb.jpg

В этом же конвертере после удалю перенос строки (в ASC II это 0a).

Может быть я все не так делаю? Просветите пожалуйста как это делается по науке:-)

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

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


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

Не мучайтесь с hex. Используйте mif.

В .mif данные требуется забивать вручную, а в .hex можно загружать из файла. Поправьте, если ошибаюсь.

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


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

dec2bin - переводит строку с записью числа в строку с записью этого числа битами. Отсюда и

оно представляется в виде 31 31 31 30 (в ASC II)

поглядите в сторону функции save

 

и еще есть косяк аски файлов, перенос строки это

0x0D 0x0A - перенос строки, возврат каректи.

И любая попытка записать в АСКИ файл 0x0A приводит к тому что оно дополняется автоматом символом 0x0D.

С этими файлами надо быть осторожным.

 

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


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

Не мучайтесь с hex. Используйте mif.

 

Спасибо, сейчас залез в мануал по mif (да и по hex) и нашел автозаполнение ячеек:

http://quartushelp.altera.com/13.1/master....number_word.htm

 

dec2bin - переводит строку с записью числа в строку с записью этого числа битами. Отсюда и

 

поглядите в сторону функции save

Спасибо, посмотрю.

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


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

В .mif данные требуется забивать вручную, а в .hex можно загружать из файла. Поправьте, если ошибаюсь.
Какое вручную? Генерируете текстовый файл в простом формате:

DEPTH = 16;
WIDTH = 8;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;

CONTENT
BEGIN

00: 63;
01: 7C;
02: 77;
03: 7B;
04: F2;
05: 6B;
06: 6F;
07: C5;
08: 30;
09: 01;
0A: 67;
0B: 2B;
0C: FE;
0D: D7;
0E: AB;
0F: 76;

END;

Ну или DEC вместо HEX, если нужно.

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


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

Какое вручную? Генерируете текстовый файл в простом формате:

DEPTH = 16;
WIDTH = 8;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;

CONTENT
BEGIN

00: 63;
01: 7C;
02: 77;
03: 7B;
04: F2;
05: 6B;
06: 6F;
07: C5;
08: 30;
09: 01;
0A: 67;
0B: 2B;
0C: FE;
0D: D7;
0E: AB;
0F: 76;

END;

Ну или DEC вместо HEX, если нужно.

 

Поясните пожалуйста этот момент. Как я понимаю

DEPTH = 16;
WIDTH = 8;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;

CONTENT
BEGIN
END

это общий вид .mif файла

А адреса придется забивать вручную, у меня ведь голый файл с двоичными числами.

Я не понял как сгенерировать его(

 

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


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

А адреса придется забивать вручную, у меня ведь голый файл с двоичными числами.

Я не понял как сгенерировать его(

Ну вы же файл в матлабе генерируете? Вот и сделайте цикл в матлабовском скрипте.

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


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

Ну вы же файл в матлабе генерируете? Вот и сделайте цикл в матлабовском скрипте.

Сделал файл вида:

-- Copyright © 1991-2013 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=16;
DEPTH=110;

ADDRESS_RADIX=HEX;
DATA_RADIX=BIN;

CONTENT BEGIN
00  :   0000000000000000;
01  :   0000100000001001;
02  :   0001000000001010;
03  :   0001011111111011;
04  :   0001111111010100;
05  :   0010011110001101;
06  :   0010111100011101;
07  :   0011011001111111;
08  :   0011110110101001;
09  :   0100010010010100;
0A  :   0100101100111011;
0B  :   0101000110010101;
0C  :   0101011110011101;
0D  :   0101110101001101;
0E  :   0110001010011110;
0F  :   0110011110001100;
10  :   0110110000010001;
11  :   0111000000101001;
12  :   0111001111001111;
13  :   0111011100000001;
14  :   0111100110111010;
15  :   0111101111111000;
16  :   0111110110111001;
17  :   0111111011111011;
18  :   0111111110111101;
19  :   0111111111111110;
1A  :   0111111110111101;
1B  :   0111111011111011;
1C  :   0111110110111001;
1D  :   0111101111111000;
1E  :   0111100110111010;
1F  :   0111011100000001;
20  :   0111001111001111;
21  :   0111000000101001;
22  :   0110110000010001;
23  :   0110011110001100;
24  :   0110001010011110;
25  :   0101110101001101;
26  :   0101011110011101;
27  :   0101000110010101;
28  :   0100101100111011;
29  :   0100010010010100;
2A  :   0011110110101001;
2B  :   0011011001111111;
2C  :   0010111100011101;
2D  :   0010011110001101;
2E  :   0001111111010100;
2F  :   0001011111111011;
30  :   0001000000001010;
31  :   0000100000001001;
32  :   0000000000000000;
33  :   0111011111110110;
34  :   0110111111110101;
35  :   0110100000000100;
36  :   0110000000101011;
37  :   0101100001110010;
38  :   0101000011100010;
39  :   0100100110000000;
3A  :   0100001001010110;
3B  :   0011101101101011;
3C  :   0011010011000100;
3D  :   0010111001101010;
3E  :   0010100001100010;
3F  :   0010001010110010;
40  :   0001110101100001;
41  :   0001100001110011;
42  :   0001001111101110;
43  :   0000111111010110;
44  :   0000110000110000;
45  :   0000100011111110;
46  :   0000011001000101;
47  :   0000010000000111;
48  :   0000001001000110;
49  :   0000000100000100;
4A  :   0000000001000010;
4B  :   0000000000000010;
4C  :   0000000001000010;
4D  :   0000000100000100;
4E  :   0000001001000110;
4F  :   0000010000000111;
50  :   0000011001000101;
51  :   0000100011111110;
52  :   0000110000110000;
53  :   0000111111010110;
54  :   0001001111101110;
55  :   0001100001110011;
56  :   0001110101100001;
57  :   0010001010110010;
58  :   0010100001100010;
59  :   0010111001101010;
5A  :   0011010011000100;
5B  :   0011101101101011;
5C  :   0100001001010110;
5D  :   0100100110000000;
5E  :   0101000011100010;
5F  :   0101100001110010;
60  :   0110000000101011;
61  :   0110100000000100;
62  :   0001111111111111;
63  :   0111011111110110;
64  :   0111111111111111;
65  :   0000000000000000;
66  :   0000100000001001;
67  :   0001000000001010;
68  :   0001011111111011;
69  :   0001111111010100;
6A  :   0010011110001101;
6B  :   0010111100011101;
6C  :   0011011001111111;
6D  :   0011110110101001;
END;

Но при анализе выскакивает ошибка:

Error (10170): Verilog HDL syntax error at xxx.mif(1) near text -

Error (12153): Can't elaborate top-level user hierarchy

Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 2 errors, 0 warnings

Error: Peak virtual memory: 495 megabytes

Error: Processing ended: Thu Nov 06 12:59:24 2014

Error: Elapsed time: 00:00:02

Error: Total CPU time (on all processors): 00:00:02

 

Сам код:

// circle_rom
module circle_rom
(
addr,
clk, 
q
);

//Parameters
parameter DATA_WIDTH_SIGNAL=16;		//длина слова сигнала
parameter ADDR_WIDTH=110;		  			//длина адреса памяти

//Input signals
input [ADDR_WIDTH-1:0] addr;
input clk;
output reg [DATA_WIDTH_SIGNAL-1:0] q ;

// Declare the ROM variable
reg [DATA_WIDTH_SIGNAL-1:0] rom[110:0]; // регист будет содержать четыре 4-х разрядных чисел

//описание внутренних регистров
reg [ADDR_WIDTH-1:0] addr_reg ;		  //регист счетчика

//считываем данные из файла и записываем весь массив в регист rom
initial
	begin
		$readmemb("xxx.mif", rom);
	end


//счетчик адреса
always @ (posedge clk)
	begin
		addr_reg <= addr_reg + addr + 7'b01; //инкремент адреса
		q <= rom[addr_reg];						 //выходное значение q
	end

endmodule

Может быть .mif считывается другой командой?

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


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

Коэффициенты получил в Matlab'е c помощью функции dec2bin, после полученные данные сохраняю в файл с помощью функции dlmwrite (так же пробовал fwrite и fprintf)

Может быть я все не так делаю? Просветите пожалуйста как это делается по науке:-)

Имхо правильнее не иметь дела с *.MIF файлами по той причине, что у разных вендоров (Альтера,Хилые и пр.) эти форматы отличаются.

Раз уж вы владеете Матлабом, то проще всего сгенерить верилоговский(или VHDL) исходник прямо из Матлаба.

Вот маленький примерчик для верилога:

% This script will convert simple 256*256 monochrome BMP file 
% to Xilinx block RAM (1k * 36 bits) content.
% MSB (35:18) - X coordinate, LSB (17:0) - Y coordinate.

M = imread('fun_test.bmp','bmp');

M = not(M);

imshow(M);

n = nnz(M);

n = 2 ^ (ceil(log2(n)));

rom = zeros(1,n,'int64');

index = 1;

size_x = size(M,1);

size_y = size(M,2);

for row = 1:size_x
    for col = 1:size_y
        if(M(row,col) > 0)
            x = col - size_x/2;
            y = size_y/2 - row;
            rom(index) = to_positive(x,18) * 2^18 + to_positive(y,18);
            index = index + 1;
        end
    end
end

filename = 'rom_text.vh';
fid = fopen(filename,'w');
%place a header:
fprintf(fid,'/* This source file is generated by Matlab script,\n do not edit it!*/\n');
fprintf(fid,'  localparam logic [35:0] coe_table [0:2047] = ''{\n');
    for addr = 1:n
        fprintf(fid,'36''d%d',rom(addr));
            if addr < n 
                fprintf(fid,','); 
            end
            if mod(addr,8) == 0
                fprintf(fid,'\n');
            end
    end
    fprintf(fid,'};');
fclose(fid);

 

 

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


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

Не могу понять, почему QuestaSim не понимает знаковые числа, подскажите пожалуйста!

post-83540-1416297726_thumb.png

 

Основной код:

module single_rom
	(
		addr,
		clk,
		q
	);



//Входные воздействия
input [6:0] addr ;							//длина адреса(в bin)
input clk;
output signed [15:0] q;						//выходные данные

//Внутренние регистры


//внутренние соединения


//Подключение ip-ядра rom
rom_ip	rom_ip_component (
			.address (addr),
			.clock (clk),
			.q (q));

//Основной код



//непрерывное присваивание

endmodule

 

 

Код testbench:

`timescale 1 ps/ 1 ps
module single_rom_tb();

// test vector input registers
reg [6:0] addr;
reg clk;
// wires                                               
wire signed [15:0]  q;

// assign statements (if any)                          
single_rom i1 (
// port map - connection between master ports and signals/registers   
.addr(addr),
.clk(clk),
.q(q)
);


//clk
initial
	begin
	  clk = 0;
	  forever #10 clk = ~clk;
	end
//beginning address
initial
		addr = 7'h00;

//loop
always
begin 
	@(posedge clk)
	if (addr >= 7'h64) 
		addr = 7'h0;
	else 
		addr = addr + 7'h1;
end

endmodule

 

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


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

2 verali

radix :

...
Arguments
You can abbreviate the following arguments to any length. For example, -dec is equivalent to
-decimal.
..
• -decimal
(optional) Displays values in decimal format. You can specify -signed as an alias for this
argument.
..

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


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

2 verali

radix :

...
Arguments
You can abbreviate the following arguments to any length. For example, -dec is equivalent to
-decimal.
..
• -decimal
(optional) Displays values in decimal format. You can specify -signed as an alias for this
argument.
..

 

 

Если я правильно понял в консоли QuestaSim набрать:

radix signed

Но ничего не изменилось. Или я неправильно делаю?

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...