logo资料库

verilog 图片翻转.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
大作业说明书 一、 说明 该设计说明书是由电科一班徐敏、电科二班郑芃、王刘辰、电科三班史亚峰、史向男、 宋博合作完成的 “图像旋转”的作业说明书。本文主要包括作业简述部分、设计思路、verilog 代码、、C++代码以及一些参考资料等。 二、 作业简述  用 verilog 语言描述实现把 lena 图像(也可以是其他图像)(256*256 像素)顺时针
旋转 90 度。  要求分组完成 3-6 人一组,自由组队,至少三人,不可独立完成,自行合理安排组内 每个成员的工作,工作量大致适中。抄袭判不及格  考试之前打印上交:原代码、仿真结果、设计说明书、工作报告中包括每个人的工 作总结。  原始图像如果不是 256*256*24bit 格式的 BMP 图片,首先用画图工具转成 256*256 的大小*24bit 格式。  任务提示:  了解 BMP 位图的格式,verilog 中所写的要能 testbench 中读写 BMP 文件中 的像素点阵。  了解数字集成电路的设计与验证的一般方法  进行模块划分,可以分成三个以上的模块,一个专门负责按时钟节拍读取数 据,然后数据经过缓存之后逆时针旋转 90 度输出。  多借助互联网查阅相关资料、语法等  如有必要,可以用 C 语言针对该原始图像提出二进制数据转化为文本型数据 再存储成数据文件,供 verilog 模块调用。 三、 设计思路 第一步,将 bmp 图片转换成二进制流,并且转存为 txt 文件。 对于 24bit 位深的 BMP 文件,其前 54 个字节是关于文件头信息的(具体见下面的参考 资料),之后的数据全是像素点的信息,每一个像素点 3 个字节,共计 196608 字节的像素点 信息。这个部分我们利用 C++程序进行转化。 第二步,利用 Verilog 程序对图像进行旋转。 这部分我们采用了一个算法,具体就是先从把 txt 文件里的像素信息读取到一个存储器 里,再利用重新编排像素信息的存放位置的方式,具体就是对的数据经过一定的算法转存到 另一个存储器,然后将数据写到文件里,从而实现对图像的旋转。 四、 参考资料:(摘自互联网) BMP 文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列。 一、图像文件头 1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。424Dh=’BM’, 表示是 Windows 支持的 BMP 格式。 2)2-3:整个文件大小。4690 0000,为 00009046h=36934。 3)4-5:保留,必须设置为 0。 4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为 00000046h=70,上面 的文件头就是 35 字=70 字节。 二、位图信息头 5)8-9:位图图信息头长度。 6)10-11:位图宽度,以像素为单位。8000 0000,为 00000080h=128。 7)12-13:位图高度,以像素为单位。9000 0000,为 00000090h=144。 8)14:位图的位面数,该值总是 1。0100,为 0001h=1。 9)15:每个像素的位数。有 1(单色),4(16 色),8(256 色),16(64K 色,高 彩色),24(16M 色,真彩色),32(4096M 色,增强型真彩色)。1000 为 0010h=16。 - 1 -
10)16-17:压缩说明:有 0(不压缩),1(RLE 8,8 位 RLE 压缩),2(RLE 4, 4 位 RLE 压缩,3(Bitfields,位域存放)。RLE 简单地说是采用像素数+像素值的方式进行 压缩。T408 采用的是位域存放方式,用两个字节表示一个像素,位域分配为 r5b6g5。图中 0300 0000 为 00000003h=3。 11)18-19:用字节数表示的位图数据的大小,该数必须是 4 的倍数,数值上等于 (≥位图宽度的最小的 4 的倍数)×位图高度×每个像素位数。0090 0000 为 00009000h=80 ×90×2h=36864。 12)20-21:用象素/米表示的水平分辨率。A00F 0000 为 0000 0FA0h=4000。 13)22-23:用象素/米表示的垂直分辨率。A00F 0000 为 0000 0FA0h=4000。 14)24-25:位图使用的颜色索引数。设为 0 的话,则说明使用所有调色板项。 15)26-27:对图象显示有重要影响的颜色索引的数目。如果是 0,表示都重要。 三、彩色板 16)28-....(不确定):彩色板规范。对于调色板中的每个表项,用下述方法来描述 RGB 的值: 1 字节用于蓝色分量 1 字节用于绿色分量 1 字节用于红色分量 1 字节用于填充符(设置为 0) 对于 24-位真彩色图像就不使用彩色板,因为位图中的 RGB 值就代表了每个象素 的颜色。 如,彩色板为 00F8 0000 E007 0000 1F00 0000 0000 0000,其中: 00FB 0000 为 FB00h=1111100000000000(二进制),是红色分量的掩码。 E007 0000 为 07E0h=0000011111100000(二进制),是绿色分量的掩码。 1F00 0000 为 001Fh=0000000000011111(二进制),是红色分量的掩码。 0000 0000 总设置为 0。 将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩 码,就可以明白事实上在每个像素值的两个字节 16 位中,按从高到低取 5、6、5 位分别就 是 r、g、b 分量值。取出分量值后把 r、g、b 值分别乘以 8、4、8 就可以补齐第个分量为一 个字节,再把这三个字节按 rgb 组合,放入存储器(同样要反序),就可以转换为 24 位标准 BMP 格式了。 对于 24bit 的 bmp 格式的图片,没有颜色表项。所以前 54 个字节表示一些文件的信息。 后面的信息就是像素阵列的一些东西,对于 24bit 的 bmp 图片,其每一个像素占据 3 个字节。 对于 256×256 的位图,其像素阵列占据的字节数是 196608(30000H),总共 196662(30036H)。 本作业使用的原始图像为: - 2 -
五、 源代码 1.bmp 文件转二进制文件并存入 verilog 可读的 txt 文件中 此过程中采用 c++编程将一幅.bmp 文件先去掉头文件,然后将去掉头文件 的剩余内容每个字节转变为八位二进制并存 file.txt 文件中,代码如下: #include #include void main() { short int shi1[27]; bool shi2[3]; int n=256*256; ifstream picture("file1.bmp",ios::binary); ofstream outfile("file.txt",ios::binary); picture.read((char *)shi1,sizeof(shi1)); for (int i=0;i
} for(k=0;k<8;k++)outfile<
current_position=256*(255-row)+column; @(posedge clk) ram24bit2[current_position]=ram24bit1[post_position]; end end initial begin wait (column==256) for(x=0;x<=size24;x=x+1) $fwrite(file,"%h ",ram24bit2[x]); $fclose(file); $readmemh("ram24bit2.txt",mem1); file2=$fopen("final.txt"); for(i=0;i<=size24;i=i+1) begin @(posedge clk) {mem2[i*3],mem2[i*3+1],mem2[i*3+2]}=mem1[i]; for(j=0;j<3;j=j+1) $fwrite(file2,"%d ",mem2[i*3+j]); end $fclose(file2); end endmodule ram24bit2.txt 内容如下: Final.txt 内容如下: - 5 -
3.由 txt 转换成 bmp 文件 将第一步去掉的头文件加到有第三步输出的文件前面组建 bmp 文件此过程由 c++实现,代码如下: #include #include void main() {char ch; int a[256*256],s[8]; ifstream touwenjian("file1.dat",ios::in|ios::binary); ifstream xiangsuzhi("result.txt",ios::in|ios::binary); ofstream shuchutu("tupian.bmp",ios::out|ios::binary); while(touwenjian.get(ch)) shuchutu.put(ch); for(int i=0;i<256*256;i++) { xiangsuzhi>>a[i];} for(int j=0;j<256*256;j++) { for(int k=0;k<8;k++) { s[k]=a[j]%2; a[j]=a[j]/2; - 6 -
} } for(k=0;k<8;k++)shuchutu<
分享到:
收藏