Verilog下的image processing---第一话---读取旋转并写入

为了实现硬件加速而把C code转化为Verilog。

参考的是: http://beiciliang.weebly.com/uploads/2/4/3/1/24316476/verilog.pdf

因为FPGA上的VGA或者ARM-M3上的摄像头模块都需要一些设置和添加模块(frame buffer,等)。所以为了pre-simulation,将图像作为txt 文件读入verilog里面。

1. 所以第一步是MATLAB code: 把图像转化为binary txt 文件。

注意:不通的图像文件的格式不同:如BMP是有(row X col X 3)而PGM则只有1层。因为SIFT里面是用的PGM,所以这个例子里面我就用PGM格式的。

%% transform image into text file

%% read the image in pgm format
tu = imread('file2.pgm');
%% get the size parameter to set in Verilog file
[row, col] = size(tu);
%% transform into 8bit binary number
tutu = dec2bin(tu);
%% get the string length of binary data
len = size(tutu);
%% then simply open tutu and CtrlC+CtrlV to 'img.txt'


2. 当第一步完成后得到binary文档后,就可以在Verilog里面用$readmemh或者$readmemb。 eg:$readmemh("mem3.txt",mem4); 读入。

`timescale 1ns / 1ps

module rotate; 

parameter row = 115,
		   col = 153,
		   len = row*col;// = 17595;

reg clk; 
reg[0:7] mem1[0:len-1]; 
reg[0:7] mem3[0:len-1]; 
reg[0:7] mem4[0:len-1]; 
integer r,c,p,newp,n,x,i,file1,file2; 

initial clk=0; 
always #5 clk=~clk; 
 
initial 
$readmemb("img.txt",mem1); //读入 img.txt 中的数据寄存在 mem1 中 

initial 
for(c=0;c

当Verilog用Iverilog编译之后就可以并用VVP执行后就可以得到输出。注意:Verilog只可以处理2维数组。

3. 现在就可以将结果用MATLAB转换成图像文件来验证了:

%% load dec output from Verilog
qq = load('lena2.txt');
%% transform into binary
qqq = uint8(qq);
%% reshape to size of 'img.pgm'
 Q = reshape(qqq, 153, 115);
%% plot
imshow(Q);

这里分别是输入:

Verilog下的image processing---第一话---读取旋转并写入_第1张图片

和输出图像:

Verilog下的image processing---第一话---读取旋转并写入_第2张图片

你可能感兴趣的:(thesis)