verilog语言学习(精选6篇)
verilog语言学习 第1篇
1.解决xilinx的仿真库的编辑问题
2.模块的做法和调用方法,带参数模块的应用:两种方法modelname #(value)madelcase();
二、用defparam 改变参数。
3.Begin ……end之间是串行执行的语句。在实际的电路中各条语句并不是完全串行的。4.Fork……join之间是并行执行的语句,但是不可综合;
5.表征过程模块的四种工程模块:initial模块,always模块,task模块,function模块;一个程序中可以有多个initial模块和always模块,但是initial模块只执行一次,不可综合,而always模块是不断重复执行的,可以综合。6.数据类型两大类:线网类型和寄存器类型
7.线网类型:结构化原件之间的物理连接,默认值高阻z;寄存器表示数据的存储单元,默认值为x;寄存器类型数据保持最后一次赋值,而线型数据需要持续的驱动; 8.线网数据场用来以关键字assign指定组合逻辑信号。模块中输入输出默认为wire类型,可综合的线网类型有wire,tri,supply0,supply1;线网类型的变量赋值只能通过assign来完成,不能用于always语句。
9.寄存器类型的数据没有强弱之分,且所有的寄存器类型变量都必须明确给出类型说明(无默认状态)。10.If语句指定了一个有限编码逻辑,case结果是并行的,没有优先级,if……else占用面积小但速度较慢,case语句占用面积大,但速度较快。11.如果if……else语句块为单句则直接写就可以,如果不只一句则要用begin……end括起来。12.循环语句for,while,repeat可以综合,forever不可综合。13.对于reg型数据不能用assign赋值。
14.拼接数据时最好将数据的进制形式都写详细,否则仿真出错,不知为何?例如:parameter a = 8;b = {{a{1’b0}},c};
15.module mult_8b_for(16.a,b,q 17.);18.parameter bsize = 8;19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.input [bsize1:0] b_t;reg [bsize1)begin
if(b_t[0])
begin
q = q + a_t;//一定要使用阻塞赋值
end else 36.37.38.39.40.begin
q = q;//一定要使用阻塞赋值
end
a_t = a_t <<1;//一定要使用阻塞赋值 b_t = b_t >>1;//一定要使用阻塞赋值
41.42.end end
43.Endmodule
44.Always语句中使用非阻塞赋值“<=”时,只有在always结束后才会把右端的赋值给左边的寄存器,如果采用非阻塞赋值,则会造成循环语句只执行一次。虽然模块整体是时序逻辑,但是循环部分却是组合逻辑。
45.Task和function是综合的,不过综合出来都是组合电路。46.在第一行Task语句中不能列出端口名称。
47.Task中可以调用其他的任务或函数,也可以调用自身;
48.任务定义的结构体内部能出现always或initial过程块(可能是因为其只能综合成组合电路的缘故吧)。但是可以在always或initial中调用。调用时要与声明的端口顺序相同。且只能在过程块中调用。
49.任务的输出端口必须和寄存器类型的数据变量对应。50.Function不允许有输出端口的声明,函数定义在函数内部会隐式的定义一个寄存器变量,该寄存器变量和函数同名并且位宽也一致。函数内部不能调用任务。
51.触摸板如何禁止:下载一个UltraNav驱动按上,到控制面板鼠标里面就可以禁止触摸板了。Win7下可以直接去禁止,不用安装驱动程序。
52.保证敏感信号列表的完备性。不要在组合逻辑中引入环路。
53.同步时序电路的准则:
1、单时钟策略,单时钟沿策略。
2、避免使用门控时钟。
3、不要再子模块内部使用计数器分频产生所需时钟。推荐的方式是有一个专门的子模块来管理系统时钟。
54.同步电路在目前数字电路系统中占绝对优势,和异步电路相比有下列优势:对温度、电压、生产过程等外部参数的适应性强;可以消除毛刺和内部的歪斜的数据,能将设计频率提高的吉赫兹。但是需要更多的资源,而且其时钟翻转频率高,功耗也比较大。55.关键路径:最大的可能时钟频率是由电路中最慢的逻辑路径决定的。一种消除这种限制的方法是将复杂的运算分开成为数个简单的运算,这种技术称为pipelining。56.要输就输给追求,要嫁就嫁给幸福。
57.第九章的二级流水线仿真时结果中显示不对,不知道为何,可能是testbench写的不好,有时间一定要搞明白。58.提高工作速度的两种方式:并行方式和流水线方式。核心思想是面积换速度。59.‘timescale 1ns / 1ps 代表时延单位为1ns,时延精度为1ps。
60.亚稳态:多时钟设计中,必然存在亚稳态,当触发器的建立时间和保持时间没有达到要求是,触发器就会处于逻辑1和逻辑0之间的第3中状态。及亚稳态。
61.状态机不仅仅是一种电路,而且是一种设计思想,他可以说是一个广义时序电路,状态机是数字设计的“大脑”。
62.状态机开发流程:首先要抽象出事物的状态,再次明确状态和输入输出之间的关系,让后得到系统的状态转移图,并用verilog实现。
63.Moore状态机输出仅仅依赖于当前状态,与输入无关,下一个状态与输入和当前状态有关,64.Mealy状态机的输出与输入和当前状态有关,65.状态机的容错处理:对剩余状态进行处理。方法:转入空闲状态、转入特定状态、转入预定义的专门处理错误的状态,如报警。66.状态机设计原则:单独用一个verilog模块来描述一个有限状态机。使用代表状态名的参数parameter来给状态赋值,而不是用宏定义。在组合always块中使用阻塞赋值,在时序always块中使用非阻塞赋值,67.利用三段式设计状态机。第一段处理当前状态的赋值。第二段处理下一个状态的赋值。第三段处理输出的赋值。
68.Case后面没有begin 结尾处加endcase;
69.利用stateCAD做状态机,注意填写条件是没有标点符号,而在写输出时有标点;ise软件在10版本以后就没有自带的CAD软件了,下了一个单独运行的一样可以用。70.同步整形电路:同步电路具备最稳定的工作状态和工作能力因此经常需要将外部输入的异步信号进行同步处理(与系统时钟同步)和整形(经输入信号由不规则的波形提取为具有一个时钟周期长的脉冲信号)。313页。71.Assign只能用来给wire和output赋值,不能用来给reg类型赋值;
72.Xst:528-Multi-source in Unit
75.综合synthesize:查看综合报告、查看RTL级原理图、检查语法。实现:implement,翻译、映射、布局布线,实现之前要进行约束条件的编辑。76.
verilog语言学习 第2篇
在现代数字系统设计中,EDA技术已经成为一种普遍的工具。EDA技术,即电子设计自动化技术,对于EDA技术并没有一个精准的定义,我们可以认为,所谓的EDA技术就是以计算机为工作平台,以EDA软件工具为开发环境,以PLD器件或者ASIS专用集成电路为目标器件设计实现电路系统的一种技术。
现代EDA技术和EDA工具呈现出采用硬件描述语言(HDL)进行电路设计、逻辑综合与优化、开放性和标准型、更完备的库的特点。
其中,利用HDL(硬件描述语言)进行电路与系统的描述是当前EDA设计技术的另一个特征。与传统的原理图设计方法相比,HDL语言更适合于描述规模大、功能复杂的数字系统,它能够使设计者在比较抽象的层次上对所设计系统的结构和逻辑功能进行描述。采用HDL语言进行设计的突出优点是:语言的标准化,便于设计的复用、交流、保存和修改;设计与工艺的无关性,宽范围的描述能力,便于组织大规模、模块化的设计。常用的硬件描述语是VerilogHDL。
通过学习了解到Verilog程序的基本设计单元是“模块”。一个模块由几个部分组成。例如一个简单的“与—或—非”门电路程序:
module aoi(a,b,c,d,f);
/*模块名为aoi,端口列表a,b,c,d,f*/ input a,b,c,d,f;
//模块的输入端口为a,b,c,d output f;
//模块的输出端口为f wire a,b,c,d,f;
//定义信号的数据类型 assign f = ~((a&b)|(~(c&d)));//逻辑功能描述 endmodule
通过简单地Verilog程序学习,认识到Verilog程序的特点:
1、Verilog程序是由模块构成的,每个模块的内容都嵌在module和endmodule两个关键字之间,同时模块名必须与文件名相同;每个模块实现特定的功能。
2、每个模块首先要进行端口定义,并说明输入和输出口然后对模块的功能进行定义。
3、Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分成几行书写。
4、除了endmodule等少数关键字之外每个语句后必须有分号。
5、可以用/*„„*/和//„„对Verilog程序注释。好的源程序都应加上注释,以增强程序的可读性和可维护性。
verilog语言学习 第3篇
数字图像经过转换和传输后, 难免产生模糊。图像锐化的主要目的在于补偿图像轮廓、突出图像的边缘信息以使图像显得更为清晰, 从而符合人类的观察习惯。图像锐化的实质是增强原图像的高频分量[1]。
数字图像处理可在频域和空域进行, 在空间域中, 图像信号是二维空间的信号, 其特点是:它是一个以平面上的点作为独立变量的函数。例如黑白与灰度图像是用二维平面情况下的浓淡变化函数来表示的, 记作f (x, y) , 它表示一副图像在水平和垂直两个方向上的光照强度。这里我们选择256256256的灰度图进行处理。
彩色图像的每个像素点用RGB三个分量表示, 需要三个字节;而灰度图则不同, 这里我们选择的灰度图像有256256个像素点, 每个像素点用一个字节, 指示从0到255的光照强度值。为0时表示黑, 为255时表示白。
锐化是数字图像处理一种常见的方式, 为了使一幅图像的边缘更为鲜明, 常常采用锐化技术使图像的边缘增强。
1 图像锐化方法
微分可以使图像边缘更加清晰, 而最常用的微分锐化的处理方法是梯度法[2]。给定函数f (x, y) , 对于数字图像, 其导数可以用差分来近似, 则
G[F (x, y) ]≅{[f (x, y) - f (x+1, y) ]2 +
[f (x, y) - f (x, y+1) ]2}1/2 (1)
取绝对值得到如下结果:
G[F (x, y) ]≈| f (x, y) - f (x+1, y) | +
| f (x, y) - f (x, y+1) | (2)
上述梯度的近似处理方法不是唯一的方法, 另有一种有用的近似法 (罗伯特梯度法) 是用交叉差分替代微分的方法, 该方法的近似值如 (3) 式所示。
G[f (x, y) ]≅{[f (x, y) - f (x+1, y+1) ]2 +
[f (x+1, y) - f (x, y+1) ]2}1/2 (3)
取绝对值得到如下结果:
Gf (x, y) ]≈| f (x, y) - f (x+1, y+1) |+
| f (x+1, y) - f (x, y+1) | (4)
所有梯度近似值都和相邻像素间的灰度差成正比。这样, 对一幅图像中突出的边缘区, 其梯度有较大的值;对于完全平滑区, 梯度有较小的值;灰度变化很小的区域, 梯度则几乎为零。
为了产生梯度图像g (x, y) , 有多种方法, 最简单的就是让坐标 (x, y) 处的值g等于该点f的梯度, 即
这种方法的主要缺点是, f (x, y) 中所有的平滑区域在g (x, y) 中将变成暗区。解决这个问题的一种方法是给出一个梯度门限值, 如 (6) 式所示。
假如只对边缘的位置感兴趣, 则可锐化处理为如 (7) 式所示。
2 基于Verilog的图像锐化
2.1 锐化思想
用Verilog[3]硬件描述语言不能对bmp图像直接处理[3], 所以需要将bmp图像每个像素的灰度值按顺序 (左下角->右上角) 保存到txt文件中, 再映射到Verilog定义的存储器上进行处理;处理完的数据按顺序保存到txt文件中, 再转化为图像。从bmp到txt、从txt到bmp这里用到了VC++编写的程序。
从txtbmp转化首先需要将读取的txt文件中的字符数据转化为int格式的16进制数, 作为ImageData部分, 然后设置位图信息头并显示图像。bmp图像与txt格式的转换:以bmp为后缀的图像格式如图2所示。
图2中“实际的位图数据ImageData”就是二维图像的像素值, 顺序从最后一行到第一行按行排列。
位图文件头、信息头、调色板部分都具有固定的格式和字节数, bmptxt转化的主要程序语句如下:
从txtbmp转化首先需要将读取的txt文件中的字符数据转化为int格式的16进制数, 作为ImageData部分, 然后设置位图信息头并显示图像。位图信息头设置语句如下:
Verilog程序有四个模块, 分别是top.v (总体模块) 、data_import.v (导入txt文件数据) 、process.v (图像处理主程序) 、data_export.v (结果输出到txt文件) 、clk_creat (产生时钟和复位的仿真文件) 。
2.2 仿真后的效果图
以下为原始图象Lily.bmp和经不同程度处理后的4幅图象lily1_4.bmp。
2.3 锐化效果评估
以上4幅图象在处理中所用门限值d相同且d=255。其中lily1.bmp、lily2.bmp的倍乘系数相同且s=1, lily1.bmp处理结果为黑白二值图象 (即Q≥=d, 像素新值赋d, 否则赋0) , 而lily2.bmp在处理时, 当Q<d, 像素新值赋Q。所以二者的效果不同, 后者保留了更多的原图信息。Lily3.bmp、lily4.bmp的象素赋值方法与lily2.bmp相同, 但其倍乘系数分别为s=1/2, s=3/4。从视觉效果上看, lily3.bmp偏淡, 但脉络清晰, 而lily4.bmp信息量相对要多些。
参考文献
[1]曾嘉亮.基于边缘检测的图像锐化算法.现代电子技术, 2006, (12)
[2]李俊山.数字图像处理.北京:清华大学出版社, 2007
verilog语言学习 第4篇
摘 要:介绍了VGA的基本概念和有關协议,给出了VGA行场扫描的时序图。基于verilog语言实现了VGA视频编码芯片ADV7123的控制器。测试表明,该控制器是有效的。
关键词:Verilog;VGA;控制器
中图分类号:TN911
1 VGA时序
VGA(Video Graphics Array)是一种视频传输标准,是彩色显示器的主要接口。ADV7123是一款VGA视频编码芯片。VGA控制器就是根据VGA时序控制ADV7123输出的视频信号。VGA时序包括行扫描和场扫描时序,如图1和图2所示。
其中,扫描周期 Te = Tc + Td + Ta + Tb。Tc为行/场同步头,Td为行/场消隐藏后肩,Ta为行/场图像,Tb为行/场消隐前肩。以分辨率为 640*480,场频为60HZ为例,各参数的值如表1所示。
每一场像素计数: 640*480 = 419200,每秒60场图像,总共像素计数为:419200*60 = 25152000。由此计算得时钟频率 f = 25152000/1000000 = 25.152 MHZ,最终确定系统时钟频率为25 MHZ。
2 视频编码
ADV7123支持30bit编码,也就是RGB各分量都取10个bit。考虑到FPGA的引脚限制,一般取16bit编码,也就是RGB565,绿色分量取6位,红、黄色分量各取5位编码。
3 VGA控制器Verilog核心程序
行计数器启动行扫描,代码如下:
行列计数器值计数到有效图像数据(640*480)区域时候,控制器输出有效的16bit信号,驱动ADV7123。同时,输出有效的x、y坐标,读取该坐标对应的存储器中的二维图像信息。
4 VGA控制器验证
通过控制器控制可以在LCD显示屏上显示字符、RGB彩色图像、视频图像。显示字符时,在ROM中加载字模的mif文件。显示彩色图像时,先要提取彩色图像的R、G、B各分量,制成mif文件,然后,在ROM中分别加载各个分量的mif文件。视频图像的显示方法是把采集的视频按帧显示图像即可。如图3所示,为了验证设计,生成了两个模块,一个是提供时钟的PLL,PLL输出时钟为25MHZ。一个是控制存储字模数据ROM的模块lcd_display。Lcd_display读取两个ROM,ROM1中存放字符为:Hello World*^_^*,ROM2中存放的字符为:电子设计自动化。其中,英文字符的的尺寸为32*64,中文字符的宽度要求为英文字符的两倍,因此,中文字符的尺寸为64*64。为了简单起见,取两个ROM的宽度为64,深度都为512。字符在显示器水平方向的起始位置为64,英文字符竖直方向的起始位置为128,中文字符的竖直方向的起始位置为256。以中文字符为例,读取字符代码如下:
4 结束语
本文设计的控制器适用于VGA字符、图像和视频的显示控制,仿真和试验表明该设计是可靠的,控制器性能是稳定的。
参考文献:
[1]刘威,石彦杰,高博.基于FPGA的VGA显示模式识别[J].计算机工程与科学,2008(04):152-155.
[2]廖永清,丁旭昌.基于FPGA的VGA图像动态显示控制器的设计与实现[J].电视技术,2011(17):52-54.
[3]夏宇闻.Verilog数字系统设计教程[M].北京航空航天大学出版社,2008.
[4]姜世杰出,余红英.基于FPGA的VGA接口驱动技术[J].电子测试,2012 (12):42-45,29-32.
[5]袁堂青,张玉璘.基于FPGA的VGA汉字显示系统设计与实现[J].济南大学学报(自然科学版),2011(01).
作者简介:惠为君(1969.03-),男,硕士,信息学院讲师,主要从事电子信息方面的教学工。
verilog作业题 第5篇
F=AB+ACD(CD的非)
2、以连续赋值语句设计8位总线驱动器。
3、以always语句设计8位总线驱动器。
4、以always语句设计8位双向总线驱动器。
1、设计一个具有低电平使能端和高电平使能端的2-4译码器。
2、设计一个JK触发器。
3、设计一个24分频期,要求输出信号占空比为1:1。
4、一个挂在总线上的16位寄存器。
5、设计一个8位线编码器,输入为D7 - D0,D7优先级最高,D0最低。当Di为高电平输入时,F=1,OUT为其编码,否则F=0。
1、以结构描述方式实现下列逻辑:
Y=ABC(BC的非)+DE+ CFG(CFG的非)
2、试设计一个具有使能端ncs的2-4译码器。
3、试设计一个4位加减运算器,输入为A、B、CIN、M,输出为OUT和COUT。当M=0时执行加法运算,M=1时,执行减法运算。
4、试设计一个14分频器,要求占空比1:1。
5、试设计一个具有三态输出缓冲的8位数据寄存器。
6、试设计一个具有清0和置数功能的8位二进制加1计数器。
7、设计一个16位移位寄存器。
8、设计一个16位双向移位寄存器,当d=0时右移, d=1时左移。
1设中断请求有效电平为高电平,中断请求输入线INTR0—INTR15中INTR15优先权最高。试设计一个中断优先权编码器。当有中断请求时,INT=1,同时输出中断请求输入线的编码V;否则INT=0,V的输出任意。
2试设计一个具有同步清0和同步置数功能的8位二进制加1计数器。
3试设计一个“11010100”序列检测器.4设计一个8位双向移位寄存器。其I/O端口和控制端口包括d(移位方向控制,当d=0时右移, d=1时左移)、数据串行输入din、数据并行输入data(8位)、dout数据串行输出、数据并行输出q(8位)、同步时钟clk、并行置数load等。
5设计每周期8个采样点的锯齿波信号发生器。
verilog语言学习 第6篇
系名信息工程系 专业电子科学与技术 6010202036-李贝 6010202043-王玉斌 6010202034-解海洋 6010202035-冷健 指导教师史再峰
2012年 10 月 27 日
BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图 像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。组成
典型的BMP图像文件由四部分组成:
1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。对应的数据结构
1:BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
图像文件头
1)1-2:(这里的数字代表的是“字”,即两个字节,下同)图像文件头。
0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType 为两个字节,B为low字节,M为high字节所以bfType=0x4D42,而不
是0x424D,但注意)2)3-6:整个文件大小。4690 0000,为00009046h=36934。
3)7-8:保留,必须设置为0。4)9-10:保留,必须设置为0。
5)11-14:从文件开始到位图数据之间的偏移量(14+40+4*(2^biBitCount))。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
位图信息头
6)15-18:位图图信息头长度。
7)19-22:位图宽度,以像素为单位。8000 0000,为00000080h=128。
8)23-26:位图高度,以像素为单位。9000 0000,为00000090h=144。
9)27-28:位图的位面数,该值
总是1。0100,为0001h=1。
10)29-30:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
11)31-34:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。12)35-38:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于(≥位图宽度的最小的4的倍数)×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。
13)39-42:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
14)43-46:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
15)47-50:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
16)51-54:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。彩色板
17)(55+0)到(50-1+2^biBitCount):彩色板规范。对于调色板中的每个表项,用下述方法
来描述RGB的值: 1字节用于蓝色分量 1字节用于绿色分量 1字节用于红色分量
1字节用于填充符(设置为0)对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00F8为F800h = 1111 1000 0000 0000(二进制),是蓝色分量的掩码。
E007 为 07E0h = 0000 0111 1110 0000(二进制),是绿色分量的掩码。
1F00为001Fh = 0000 0000 0001 1111(二进制),是红色分量的掩码。
0000 总设置为0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式
了。图像数据阵列
18)55(无调色板)-bfSize:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
存储算法
BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其它低速或者有容量限制的媒介上进行传输。根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。n位2n种颜色的位图近似字节数可以用下面的公式计算:BMP文件大小约等于 54+4*2的n次方+(w*h*n)/8,其中高度和宽度都是像素数。需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,3 [1] 尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。如果想知道这些值是如何得到的,请参考下面文件格式的部分。由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。源代码:
`timescale 1ns/100ps module transport;parameter longsize=65554;reg [24:1] meme[longsize:1],b;
integer e,m,n,i,j,w,clk;
always@(*)begin initial fork begin w=$fopen(“lena.bmp”,“rb”);
e=$fread(meme,w);
$fclose(w);end always #50 clk=~clk;
join always begin
m=$fopen(“lena.txt”);
n=0;
always@(posedge clk)
begin repeat(18)begin
n=n+1;b=meme[n];
$fwrite(m,“%h”,b);
end end
always@(posedge clk)
begin
for(j=0;j<=255;j=j+1)for(i=1;i<=256;i=i+1)
begin n=18+256*i-j;b=meme[n];
$fwrite(m,“%h”,b);end end
$fclose(m);
end
end endmodule
仿真后Objects中的数值:
仿真后波型:
转换后在lena.txt中的数值:
使用到的软件:
在winhex中的数值:
原图
经verilog转换后的图:
设计说明书: 首先用$fread系统任务将BMP图片的二进制代码读入存储器meme中;由initial子语句产生clk时钟信号;由于读出的二进制代码的前54个字节是BMP位图的基本代码,因此在对图片进行翻转时前54个字节的位置不变。由于文件格式为256*256*24bit文件,所以后面为256*256个像素,每24位代表一个像素,因为BMP文件的数据是从左到右,从下到上的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素??接下来是倒数第二行左边第一个象素,左边第二个象素??依次类推,最后得到的是最上面一行的最右一个象素。所以要实现图片的顺时针旋转应该把meme中像素逆时针旋转90
度。
其次,在always子语句中用repeat语句在每一个clk上升沿把meme中的前十八个单元经缓存器b依次读入lena.txt中。然后用for语句在每一个clk信号上升沿来临时把翻转后256*256
个像素经缓存器b依次读入lena.txt中。
最后用WinHex软件把得到的lena.txt文件转换成二进制数据另存为.Bmp文件即可得到翻转
后的图片。李贝大作业工作总结
这次的大作业对我们每一个人都是一个挑战,以前,我们学得知识很死,总不会学以致用,每天都感觉无所事事。通过这次大作业的完成,锻炼了自己的解决问题能力。
刚接触这个大作业的时候,给人一种很高端的感觉,但也意味着一切都待从头开始,首先就是对BMP文件的理解,经过大量的查阅资料,知道了BMP文件的构成,了解了对于256*256*24bit文件,其大小应该为256*256*3+54=196662字节;自此豁然开朗;对于bmp文件和2进制之间转化的问题,经过许多曲折,终于得到了winhex,经过亲手应用,逐渐掌握了这个软件,完成了2进制与bmp文件之间的转化;在编写程序时,同样遇到了很大的阻力,感觉课堂上学的东西完全不够用,通过自己以及团队对verilog语言的进一步学习,知道了其系统函数$fread可以从bmp文件中读取二进制数字,在对时钟信号处理时,对周期的大小也进行了考虑,通过这次大作业,使我更加熟悉了硬件描述语言,对modelsim这款软件的操作也更加熟练啦,懂得了团队合作的重要性!总之,收获很大!
冷健大作业工作总结
终于完成了这次verilog大作业。在完成大作业的过程中,我们小组遇见了不少的难题。遇到很多不会的东西,但是通过我与小组队员的通力合作,通过请教专业的同学,通过上网 7 搜索资料。我们还是完成了。虽然有点不尽如人意。通过这次的大作业,让我们更加深刻的了解了合作的意义。组员之间相互合作,那就无论什么困难都可以解决。这就是团队力量的重要性。还有一点感想就是打铁还需自身硬。自己没有点真功夫是不行的。所以平时一定要多积累,多看书,平时多看书,那么实际生活中就多一条解决途径。就可以少走些弯路,少吃些苦。?还有一点,我们需要仔细和耐性,由于在编写程序的过程中,有一些疏忽和遗漏,总是个别字符出错或者符号出错。回头又得花时间去检查去纠正。所以就必须特别强调细心
和耐心。以上就是我的心得。解海洋大作业工作总结
在这次的大作业,使我懂得了,知识与实践动手能力的不同,虽然经过一段时间的verilog的学习,对语法知识有一定的了解,但真正要自己动手还是有所能力的欠缺。而且还不知道从何入手,还是参考了前辈一些经验,知道了怎么做,按什么顺序做。首先了解BMP位图的格式,还要想到怎么把图读进去等等很多的问题。不过在这次的锻炼中,我对verilog语言有了更深的理解,同时也学到小组合作的精神。
王玉斌大作业工作总结
这次verilog大作业是四个人一起完成的作品,在这次大作业中学到了很多,虽然有些地方和老师的要求,但是在考试的紧张复习中还是完成了大作业。让我学到了很多关于verilog图像相位的知识,对于以后的学习有很大帮助。
在完成作业过程中遇到了很多困难:
首先,我们不知道BMP图片能直接转换为二进制代码,后来跟同学交流了解了可以直接转换为二进制代码,BMP图片输入的时候出现了输入不进去的问题。还有在处理256*256的图片时,我们误认为把一张图片压缩成256*256就可以,后来才发现是剪切,二不是压缩,这样导致后来读出的文件中含有不确定值X。
其次是起初我们仿真不出波形,开始不知道从何下手,通过我们共同努力,从网上,课本,资料查找,发现我们的仿真时间选择过小。导致波形无法显示,最后增大了仿真时间,得到
了波形。
最后,个人觉得有些地方用matlab可以更简便,比如把程序直接导入matlab函数中,方便以后调用。总之,大作业的成功是我们四个人共同努力的成果,让我们学到了很多课堂上没学到的东西,同时也遇到了很多困难,也有很多分歧,但是最终在一起的努力下我们完成大