使用matlab和ISE 创建并仿真ROM IP核
前言
本人想使用简单的中值滤波进行verilog相关算法的硬件实现,由于HDL设计软件不能直接处理图像,大部分过程都是可以将图像按照一定的顺序保存到TXT文档中,经过Modelsim仿真后,处理的数据再经过matlab显示图像;图像首先通过matlab或者C语言保存在TXT文档中,生成测试向量文件,然后在仿真软件中进行仿真处理,把处理后的数据保存为TXT格式,最后用matlab显示,观察结果。一般都是先创建MIF文件,将图像中的像素信息用一个ROM储存起来,然后调用ROM里面的地址进行处理,相当于制作了一个ROM查找表。
用Quartus II创建并仿真ROM的步骤:
1.在Quatus工程下生成一个ROM
2.编写.mif文件,作为ROM的初始化文件
3.将.mif文件拷贝到Modelsim工程下
4.进行Modelsim仿真
图像保存的步骤:
1.使用matlab将图像生成txt文。
%将256位的BMP灰度图像128*128大小生成TXT文档,再生成mif文件;
clc
clear all
close all
I_rgb = imread('lena.jpg');
subplot(2, 2, 1), imshow(I_rgb), title('lena-rgb') I_gray = rgb2gray(I_rgb);
subplot(2, 2, 2), imshow(I_gray), title('lena-gray') I = imresize(I_gray, 0.25);
subplot(2, 2, 3), imshow(I), title('lena-qtr') fid = fopen('./lena.txt','wt');
for i = 1 : size(I, 1)
for j = 1 : size(I, 2)
fprintf(fid, '%d ', I(i, j));%每个数据之间用空格分开%
end
fprintf(fid, '\n');
end
fid = fclose(fid);
I_data = load('./lena.txt');
2.创建mif文件(Memory Initialization File):使用mif生成器、C语言或者matlab语言来生成;
%mcode to create a mif file
src = imread('lena.jpg');
gray = rgb2gray(src);
[m,n] = size( gray ); % m行 n列 N = m*n; %%数据的长度,即存储器深度。
word_len = 8; %%每个单元的占据的位数,需自己设定
data = reshape(gray', 1, N);% 1行N列 %fid=fopen('gray_image.mif', 'w'); %打开文件
fid=fopen('gray_image.mif', 'w'); %打开文件
fprintf(fid, 'DEPTH=%d;\n', N);
fprintf(fid, 'WIDTH=%d;\n', word_len); fprintf(fid, 'ADDRESS_RADIX = UNS;\n'); %% 指定地址为十进制
fprintf(fid, 'DATA_RADIX = HEX;\n'); %% 指定数据为十六进制
fprintf(fid, 'CONTENT\t');
fprintf(fid, 'BEGIN\n');
for i = 0 : N-1
fprintf(fid, '\t%d\t:\t%x;\n',i, data(i+1));
end
fprintf(fid, 'END;\n'); %%输出结尾
fclose(fid); %%关闭文件
生成的mif文件如下图所示:

3.调用mif文件生成ROM(verilog文件即.v文件)
这个是Altera的方法,因为本人电脑上只安装了Xilinx软件,所以这一步没有进行实际操作。
使用Xilinx创建并仿真ROM的步骤:
1.编写.coe文件,作为ROM的初始化文件,.coe文件的格式和内容如代码所示:
%mcode to create a coe file
%生成的数据是一行行进行读取的
src = imread('lena.jpg');
gray = rgb2gray(src);
[m,n] = size( gray ); % m行 n列 N = m*n; %%数据的长度,即存储器深度。
word_len = 8; %%每个单元的占据的位数,需自己设定
data = reshape(gray', 1, N);% 1行N列 %fid=fopen('gray_image.mif', 'w'); %打开文件
fid=fopen('lena.coe', 'wt'); %打开文件
fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');
fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n'); for i = 1 : N-1
fprintf(fid, '%x,\n', data(i));%使用%x表示十六进制数
end
fprintf(fid, '%x;\n', data(N)); %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
fclose(fid); %%关闭文件
2.生成的.coe文件格式如下图所示:

3.使用Xilinx中的Core Generator完成ROM的例化(生成的.coe文件的图像数据是一行行进行读取的)。
打开ISE,右键单击New Source,如下图所示:

单击之后选择IP_Core_Generator,

单击Next选项,选择Memories&Storage Elements->RAMs&ROMs->,选择块式存储或者分布式存储(这里根据存储数据的大小进行选择,较小的可以选择块式存储)。

点击Next,然后Finish。然后就出现了下面的界面,一直点击Next进行ROM属性的一些设置,直至完成:


然后就要选择所需要的ROM的大小


portA 表示输出要不要时钟打拍输出,这个是在mux里实现的;
在添加初始化文件的时候,将之前matlab生成的.coe文件添加到ROM IP核中去。


一直next下去,就可以得到初始化好的ROM IP核,可以在./ipcore_dir目录下查看ROM文件,从而可以在顶层模块中对ROM进行例化。

生成的ROM文件的输入输出变量如下:
module rom_512by512(
clka,
addra,
douta
); input clka;
input [ : ] addra;
output [ : ] douta;
在顶层模块中对ROM进行例化如下:
wire [:] rom_data;
wire [:] rom_addr; rom_512by512 U1
(
.clka(CLK), //input clka;
.addra( rom_addr), //input
.douta(rom_data) //output
);
4.使用CoreGenerator完成ROM的例化后会生成一个.mif文件,这是Modelsim进行ROM仿真时需要的初始化文件,将.mif文件复制到Modelsim工程下进行仿真。
5.查看ROM模块中的初始化数据,双击Rom模块,出现如下图的界面,点击show按钮,即可查看数据;

完
使用matlab和ISE 创建并仿真ROM IP核的更多相关文章
- vivado中使用ROM IP核
1.在project中选择IP Catalog 在IP Catalog中选择---->Block Memory Generator------>RAMs&ROMs&BRAM ...
- 如何用ModelsimSE仿真IP核-以PLL为例
我们之前介绍了如何使用Modelsim SE进行仿真和利用do文件的仿真方法,但是其中待仿真的模块是我们自己编写的Verilog模块,但是在实际工作中,我们的设计中会经常用到FPGA厂商给我们提供的现 ...
- 用Modelsim SE 直接仿真 Altera(Intel PSG) IP核 需要注意的问题
如果我们直接用Modelsim SE仿真 Altera IP核,首先会进入Quartus II目录下找到IP核对应的仿真库源文件,然后在Modelsim SE中进行编译,添加到Modelsim SE的 ...
- modelsim 独立仿真vivado的IP核及仿真脚本
Modelsim独立仿真vivado的IP 最近一直在做local dimming项目的FPGA硬件实现,算法的其中一步就是直方图统计,即数字图像的某一灰度级的像素数,这个直方图的源码找了半天才搞到, ...
- quartus ii中仿真rom时遇到的问题(待完善)
1.modelsim仿真只支持.hex,并不支持.mif(Memory Initialzation File). 2.在Matlab中生成.mif文件,然后再quartus中打开,转换为hex格式后另 ...
- 通过文件读写方式实现Matlab和Modelsim的联合仿真
虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是Matlab的强项,不但有大量的关于数字信号处 ...
- ISE创建Microblaze软核(二)
ISE创建Microblaze软核(二) (2012-07-13 15:09:08) 转载▼ 标签: 杂谈 分类: FPGA开发 第四步 进入Platform Studio操作界面 通过向导创建软核后 ...
- ISE创建Microblaze软核(一)
在使用FPGA时,有时会用到它做为主控芯片.对于习惯于单片机及C语言开发的人,使用FPGA做主控芯片,首先还是想到它的嵌入式软核功能.如果能够基于Microblze软核进行C语言程序的开发,相对于使用 ...
- matlab中struct创建方法
MATLAB中struct创建方法可分为:直接创建法和struct()函数创建法 (1)直接创建: 直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充.下面创建一个Studen ...
随机推荐
- 启动Oracle时提示:ORA-01078:failure in processing system parameters
一.使用环境操作系统:CentOS release 6.2 (Final) 数据库:Oracle 12g数据库主目录:/ora12/product/product/12.1.0/db_1 二.问题描述 ...
- django学习之——模版
为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文 ...
- 【转】vue中动态设置meta标签和title标签
因为和原生的交互是需要h5这边来提供meta标签的来是来判断要不要显示分享按钮,所有就需要手动设置meta标签,标题和内容 //router内的设置 { path: '/teachers', name ...
- ActiveMQ 的连接和会话
要了解 connection 和 session 的概念,可以先从 ConnectionState 和 SessionState 入手: // 省略部分代码 public class Connecti ...
- java多线程读一个变量需要加锁吗?
如果只是读操作,没有写操作,则可以不用加锁,此种情形下,建议变量加上final关键字: 如果有写操作,但是变量的写操作跟当前的值无关联,且与其他的变量也无关联,则可考虑变量加上volatile关键字, ...
- mybatis枚举自动转换(通用转换处理器实现)
https://blog.csdn.net/fighterandknight/article/details/51520595 https://blog.csdn.net/fighterandknig ...
- hibernate配置log
hibernate依赖jboss-logging,通过它选择对应的对应的日志包,选择的逻辑课查看具体代码org.jboss.logging.LoggerProviders. 先通过系统变量(org.j ...
- commonJS 和 ES6 模块化的不同
commonjs 导出 module.exports={ add:function(){ console.log('add测试') } } 导入 var add=require('./add.js') ...
- 基础数据类型的坑和集合及深浅copy
一.基础数据类型的坑: 元组: 如果一个元组中,只有一个元素,且没有逗号,则该"元组"与里面的数据的类型相同. # 只有一个数据,且没有逗号的情况: print(tu1,type( ...
- u-boot的内存分布
cpu会自动从NAND flash 中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000).cpu是从0x000 ...