• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

把lena图像(256*256像素)顺时针旋转90度设计Verilog代码modelsim仿真

09/02 15:04
432
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-24092512042E08.doc

共1个文件

名称:把lena图像(256*256像素)顺时针旋转90度设计Verilog代码modelsim仿真

软件:modelsim

语言:Verilog

代码功能:

把lena图像(256*256像素)顺时针旋转90度

要求用verilog语言描述电路,实现把lena图像(也可以是其他图像)(256*256像素)顺时针旋转90度。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

演示视频:

设计文档:

设计说明

要求用verilog语言描述电路,实现把lena图像(也可以是其他图像)(256*256像素)顺时针旋转90度。

首先需要了解一下BMP图片文件的文件编码格式,BMP文件格式。

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

1.?bmp文件头(bmp?file?header):提供文件的格式、大小等信息(14字节)

2.位图信息头(bitmap?information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息(40字节)

3.调色板(color?palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表

4.位图数据(bitmap?data):就是图像数据(大小由图像尺寸决定)

本设计采用24位图像的BMP格式,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是位图信息头后面紧跟的就是位图数据了。因此,位图文件从文件头开始偏移54个字节就是位图数据了。

了解了这些基础知识后就可以开始设计了。

设计思路:首先将BMP文件通过verilog内部的fopen函数读取,并存储在内部RAM中,然后用fopen函数新建一个txt文件,用于保存旋转后的数据,旋转前需要将54个字节的头文件保持不变,先直接写入txt文件中,然后对剩余数据进行旋转处理。剩余数据大小为256*256像素,每个像素为24位,原图的数据顺序为按行扫描,即第一行,第二行。。。一直到最后一行,要实现旋转,只需要按反方向的列扫描,即读第最后列,倒数第二列。。。一直到第一列。将处理后的数据也存入txt文件中,这样就可以得到旋转后的数据。

首先将待处理的BMP文件通过verilog内部的fopen函数读取bmp文件,本设计以lina照片为例,通过以下代码实现bmp数据的读取和缓存于pci_RAM中。

随后,需要新建一个名称为lina.txt文件,并将BMP文件的前54个字节保存到lina.txt中,由于读取的文件是以24bit为单位保存在pic_RAM中,因此保存pic_RAM的前18地址内的数据即可,具体实现如下:

接下来需要写图像数据旋转控制代码,为使代码可综合,本设计避免采用for循环设计,而是采用时序电路设计方法,通过状态机来控制。

首先定义5个状态,状态名称分别为s_start、s_loop_j、s_comper_j、s_comper_i、s_end,

其中s_start为起始状态,将数据和计数器清零,s_loop_j是像素旋转算法执行状态,该状态按倒叙读列的方法读取pic_RAM里面所存的图像数据,并将它保存到新的lina.txt文件中,s_comper_j是对应列中数据读取次数计数,若列次数达到256则转到下一列(s_comper_i状态),否则继续该列的数据处理(s_loop_j状态)。s_comper_i状态和s_comper_j状态类似,在该状态下对列数就行计数,一直需要计数到256,若计数达到,则表示数据处理完毕,转到s_end状态。

源代码编写完成后,仿真时还需编写测试代码(testbench),testbench需要为被测模块提供测试输入,在本设计中设计输入为clk信号,故testbench如下,模拟产生了一个50MHz的时钟输入到BMP_ctrl模块,BMP_ctrl模块即我们设计的图片旋转控制代码。

打开modelsim软件,新建工程,将上述BMP_cerl代码和testbench代码加入,得仿真图如下:

下图可看到j计数到255后,i加1。State状态在该处跳转到状态3,即s_comper_i状态,而后再返回s_loop_j状态(状态1)。

下图为i累加到255后,状态跳转到4(end状态),表示数据转换完成。

数据转换完成后会在仿真文件夹内生成lena.txt文件,打开改文件如下图所示:

其中可以看到前54字节为头文件,后面数据为24位图像文件。得到txt数据后并不能直接显示为图片,这是因为txt是以ASCII码格式保存得数据,而BMP图片是二进制数据,因此需要进行格式转换,这里我们用到了这个工具软件,用该软件打开txt文件进行格式转换,如下图所示:

转换完成后另存为BMP格式就行了,下面两幅图为转换前后的对比图,左侧为原图,右侧为旋转之后的图:

???????????

部分代码展示:

module?BMP_ctrl(
input?clk
);
parameter?size=65554;
reg?[23:0]?pic_RAM[0:size-1];//定义存储picture的内部RAM
reg?[23:0]?data;
integer?file;
integer?pciture;
integer?pciture_rd;
initial?begin
pciture=$fopen("lena.bmp","rb");//打开图片,以2进制读的方式
pciture_rd=$fread(pic_RAM,pciture);//将图片数据存在pic_RAM
$fclose(pciture);
file?=$fopen("lena.txt","wb");//新建txt文件
//将BMP文件的前54个字节保存到txt
//18个24bit数据,即54字节
$fwrite(file,"%h",pic_RAM[0]);
$fwrite(file,"%h",pic_RAM[1]);
$fwrite(file,"%h",pic_RAM[2]);
$fwrite(file,"%h",pic_RAM[3]);
$fwrite(file,"%h",pic_RAM[4]);
$fwrite(file,"%h",pic_RAM[5]);
$fwrite(file,"%h",pic_RAM[6]);
$fwrite(file,"%h",pic_RAM[7]);
$fwrite(file,"%h",pic_RAM[8]);
$fwrite(file,"%h",pic_RAM[9]);
$fwrite(file,"%h",pic_RAM[10]);
$fwrite(file,"%h",pic_RAM[11]);
$fwrite(file,"%h",pic_RAM[12]);
$fwrite(file,"%h",pic_RAM[13]);
$fwrite(file,"%h",pic_RAM[14]);
$fwrite(file,"%h",pic_RAM[15]);
$fwrite(file,"%h",pic_RAM[16]);
$fwrite(file,"%h",pic_RAM[17]);
end

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1128

  • 2-24092512042E08.doc
    下载

相关推荐