版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/7/29,第3章 Verilog硬件描述语言(四),3.5 Verilog HDL设计举例,3.5.1 组合电路设计 常用的设计方法 1、用assign语句对wire型变量进行赋值,综合后的结果是组合逻辑电路。 2、用always (敏感信号表) 注意: always块内赋值语句左边的变量是reg或integer型 在生成组合逻辑的always块中被赋值的所有信号必须都在always (敏感信号表) 的敏感电平列表中列出,2020/7/29,1.编码器和译码器,例3-56:BCD码将十进制的数字转化为二进制,module bin2bcd (data_in ,EN ,data_out
2、); input 3:0 data_in ; input EN ; output 6:0 data_out ; reg 6:0 data_out ; always (data_in or EN ) begin data_out = 71b0; if (EN = 1) begin case (data_in) /根据共阳接法译码 4b0000 : data_out 6:0 = 7b1000000; 4b0001 : data_out 6:0 = 7b1111001; 4b0010 : data_out 6:0 = 7b0100100; 4b0011 : data_out 6:0 = 7b0110
3、000; 4b0100 : data_out 6:0 = 7b0011001; 4b0101 : data_out 6:0 = 7b0010010; 4b0110 : data_out 6:0 = 7b0000010; 4b0111 : data_out 6:0 = 7b1111000; 4b1000 : data_out 6:0 = 7b0000000; 4b1001 : data_out 6:0 = 7b0011000; default : data_out 6:0 = 71b0; endcase end end endmodule,数据选择器,例3-57:设计一个数据选择器,实现在选择信
4、号SEL,使能信号EN的控制下,从输入信号IN0,IN1,IN2,IN3中选择一个赋值到输出端口OUT。,define width 8 module mux(EN ,IN0 ,IN1 ,IN2 ,IN3 ,SEL ,OUT ); input EN ; input width-1:0 IN0 ,IN1 ,IN2 ,IN3 ; input 1:0 SEL ; output width-1:0 OUT ; reg width-1:0 OUT ; always (SEL or EN or IN0 or IN1 or IN2 or IN3 ) begin if (EN=0) OUT = 81b0; el
5、se case (SEL ) 2b00: OUT=IN0 ; 2b01: OUT=IN1 ; 2b10: OUT=IN2 ; 2b11 : OUT=IN3 ; default : OUT=81b0; endcase end endmodule,wirewidth-1 :0 OUT; assign OUT= (EN=0)?8b0 :(SEL=2b00) ? IN0 :(SEL=2b01) ? IN1 :(SEL=2b10) ? IN2 :(SEL=2b11) ? IN3 : 8b0;,3. 数值比较器,例3-58:设计比较器电路,实现两个多位数的比较,并将结果显示如下: 当ab 置a_great
6、为1,其余输出端为0 当a=b 置a_equle_b为1,其余输出端为0 当ab 置b_great为1,其余输出端为0,define width 8 module compare(a,b,a_great,a_equel_b,b_great); inputwidth-1:0 a,b; output a_great,a_equel_b,b_great; reg a_great,a_equel_b,b_great; always (a or b ) begin if(a b) a_great = 1; else a_great = 0; if(a = b) a_equel_b = 1; else a
7、_equel_b = 0; if(a b) b_great = 1; else b_great = 0; end endmodule,3.5.2 时序电路设计,1. 移位寄存器 当寄存器存储的代码能够在移位脉冲的作用下依次左移或右移,就构成了移位寄存器。 移位寄存器不仅可以存储代码,而且可以用来实现数据的串行并行的转换,数值的运算以及数据的处理等,例3-59:设计边沿触发结构的D触发器组成的4位移位寄存器,module shift_flop(D,CLK,Q); input D; input CLK; output 3:0 Q; reg 3:0 Q; always (posedge clk) b
8、egin Q0 = D; Q1 = Q0; Q2 = Q1; Q3 = Q2; end endmodule,2. 计数器,例3-60:设计一个带异步复位的十六进制计数器,module counter_16(clk,reset,counter_data); input clk,reset; output 3:0 counter_data; reg 3:0 counter_data; always (posedge clk or posedge reset); if(reset=1) counter_data = 4b0000; else counter_data = counter_data +
9、 1; endmodule,3. 分频器,例3-61:设有一个50MHz的时钟源,设计分频电路得到秒脉冲时钟信号。,module divider50m(inclk,outclk); input inclk; output outclk; reg outclk; reg 25:0 counter; always ( posedge inclk ) begin if ( count = 49999999 )count = 0; else count = count + 1; end always ( count ) begin if ( count = 49999999 )outclk = 1;
10、else outclk = 0; end endmodule,在Verilog HDL 中使用函数,Veirlog HDL 也可使用函数以适应对不同变量采取同一运算的操作。 Veirlog HDL 函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果,module tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) begin if(!reset) result=0;
11、 else begin result = n * factorial(n)/(n*2)+1); end end,function 31:0 factorial; input 3:0 operand; reg 3:0 index; begin factorial = operand ? 1 : 0; for(index = 2; index = operand; index = index + 1) factorial = index * factorial; end endfunction endmodule,函数factorial(n) 实现了:,阶乘运算,在实际的设计中,不希望设计中的运算
12、过于复杂,以免在综合后带来不可预测的后果。 经常的情况是,把复杂的运算分成几个步骤,分别在不同的时钟周期完成。,在Verilog HDL 中使用任务(task),当希望能够将一些信号进行运算并输出多个结果时,任务结构在这方面的优势则十分突出。 任务本身并不返回计算值,但是它通过类似C 语言中形参与实参的数据交换,非常快捷地实现运算结果的调用。 可以常常利用任务来帮助实现结构化的模块设计,将批量的操作以任务的形式独立出来,这样设计的目的通常一眼看过去就很明了。,module sort4(ra,rb,rc,rd,a,b,c,d); output3:0 ra,rb,rc,rd; input3:0 a
13、,b,c,d; reg3:0 ra,rb,rc,rd; reg3:0 va,vb,vc,vd; always (a or b or c or d) begin va,vb,vc,vd=a,b,c,d; sort2(va,vc); sort2(vb,vd); sort2(va,vb); sort2(vc,vd); sort2(vb,vc); ra,rb,rc,rd=va,vb,vc,vd; end,task sort2; inout3:0 x,y; reg3:0 tmp; /x 与y 变量的内容互换,要求顺序 /执行,所以采用阻塞赋值方式。 if(xy) begin tmp=x; x=y; y=
14、tmp; end endtask endmodule,注意:task 中的变量定义与模块中的变量定义不尽相同,它们并不受输入输出类型的限制。如此例,x 与y 对于task sort2 来说虽然是inout 型,但实际上它们对应的是always块中变量,都是reg 型变量。,模块实现了什么功能?,3.5.3 数字系统设计,有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态与各个输入值,当前所在状态有关。 在Verilog HDL中可以用许多种方法来
15、描述有限状态机,最常用的方法是用always语句和case语句。,有限状态机根据其输出的逻辑关系可分为两类, 当时序逻辑的输出是输入信号和当前状态的函数,且当前状态和输入信号决定了下一状态,称为Mealy状态机; 当系统的输出只是当前状态的函数,称为Moore状态机。,Mealy状态机结构图,Moore状态机结构图,常用的编码方式有以下几种:二进制顺序编码、格雷码、随机码、一位有效(one-hot)编码等,例3-62: Mealy型状态机 always (posedge clk) state = next_state; always (state or in1 or in2) begin ca
16、se (state) 2d0: begin out = in1 end endcase end,例3-63:Moore型状态机 always (posedge clk) begin state = next_state; case (state) 2d0: begin out = 1;/ 输出 if (in1) next_state = 1;/ 下一状态确定 else next_state = 2; end 2d1: begin if (in2) next_state = 0; else next_state = 3; end endcase end,思考:,module fsm (Clock
17、, Reset, A, F, G); input Clock, Reset, A; output F,G; reg F,G; reg 1:0 state ; parameter Idle = 2b00, Start = 2b01, Stop = 2b10, Clear = 2b11; always (posedge Clock) if (!Reset) begin state = Idle; F=0; G=0; end else case (state) idle: begin if (A) begin state = Start; G=0; end else state = idle; en
18、d,start: if (!A) state = Stop; else state = start; Stop: begin if (A) begin state = Clear; F = 1; end else state = Stop; end Clear: begin if (!A) begin state =Idle; F=0; G=1; end else state = Clear; end endcase endmodule,还可以写成:,module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; r
19、eg 1:0 state ; wire 1:0 Nextstate; parameter Idle = 2b00, Start = 2b01, Stop = 2b10, Clear = 2b11; always (posedge Clock) if (!Reset) begin state = Idle; end else state = Nextstate; assign Nextstate = ( state = Idle ) ? ( A ? Start : Idle ) : ( state=Start ) ? ( !A ? Stop : Start ) : ( state= Stop )
20、 ? ( A ? Clear : Stop ) : ( state= Clear) ? ( !A ? Idle : Clear) : Idle; assign F = ( state = Stop) endmodule,有限状态机设计的一般步骤:,逻辑抽象,得出状态转换图 就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述。这就需要: 分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条件)作为输入变量,取结果作为输出变量。 定义输入、输出逻辑状态的含意,并将电路状态顺序编号。 按照要求列出电路的状态转换表或画出状态转换图
21、。 把给定的逻辑问题抽象到一个时序逻辑函数了。,2) 状态分配:编码方案选择得当,设计的电路可以简单,反之,选得不好,则设计的电路就会复杂许多,这需综合考虑电路复杂度与电路性能之间的折衷。 3) 选定触发器的类型并求出状态方程、驱动方程和输出方程。 4) 按照方程得出逻辑图,3.6 Testbench文件与设计,仿真过程一般包括以下的工作: (1)产生仿真激励(波形); (2)将仿真的输入激励加入到被测试模块端口并观测其输出响应; (3)将被测模块的输出与期望值进行比较,验证设计的正确性。,2020/7/29,1测试平台的搭建,(1)测试模块是顶层模块,它直接调用待测的功能模块,并生成测试激励
22、信号添加,例3-65:用图3.16的测试平台对例3-1的半加器进行测试。 timescale 1ns/100ps module testbench; reg a,b; wire co,s; halfadder u1 ( .A(a),.B(b), .CO(co), .S(s); initial begin a = 0; b = 0; #10 begin a=1;b=1;end #10 begin a=1;b=0;end #10 begin a=0;b=1;end #10 begin a=0;b=0;end #10 $stop; end endmodule,(2)将测试模块和设计模块分别设计完成,
23、然后在一个虚拟的顶层模块中进行调用,将相应端口进行连接。,例3-66:用图3.17的测试平台对例3-1描述的半加器进行测试。 第一步:编写针对半加器的测试模块 timescale 1ns/100ps module testhalfadder(a,b,co,s); input co,s; output a,b; reg a,b; / 输出 wire s,co; initial begin a = 0; b = 0; #10 begin a=1;b=1;end #10 begin a=1;b=0;end #10 begin a=0;b=1;end #10 begin a=0;b=0;end #10
24、 $stop; end endmodule,第二步:实例化半加器及测试模块,建立两个模块在同一个层次上的连接。 module testbench; testhalfadder u1 (.co(co),.s(s),.a(a),.b(b); halfadder u2 (.A(a),.B(b),.S(s),.CO(co); endmodule,2Testbench的时钟产生方法,测试文件中时钟波形的设计是最基本的设计,常利用initial、always、forever、assign等语句产生时钟信号,(1)要产生周期性的时钟方波, 例3-67:产生周期为20ns的时钟 timescale 1ns/1
25、00ps module Gen_clock1 (clock1) ; output clock1; reg clock1; parameter T=20; initialclock1 =0; always# (T/2) clock1=clock1; endmodule,例3-68: timescale 1ns/100ps initial begin clock = 0; forever #10 clock2=clock2; end endmodule,(2)采用always语句产生高低电平持续时间不同的时钟: 例3-69: module Gen_clock3 (clock3); output c
26、lock3; reg clock3; always begin # 4 clock3=0; /时延4个单位时间后后,clock3赋值0 # 6 clock3=1; /时延4个单位时间后后,clock3赋值1 end endmodule,例3-70:利用forever也能产生如图3.20的时钟波形 forever begin # 4 clock4=1; # 6 clock4=0; end endmodule,(3)产生具有相移的时钟。 例3-71:module Gen_clock1 (clock_pshift,clock1) ; output clock_pshift,clock1; reg clock1; wire clock_pshift; parameter T=20; parameter pshift=2; initial clock1 =0; always # (T/2) clock1=clock1; assign
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆出租合同个人10篇
- 车辆保险委托书(28篇)
- 超市五一活动宣传方案
- 3.栀子病虫害绿色防控技术规程
- 2025 《永遇乐 京口北固亭怀古》诗歌用典的情感渲染的情感层次的精准把握课件
- 中考黄石地理试题及答案
- 小学体育考试内容及答案
- 药品类易制毒化学品试题及答案
- 药品医疗器械化妆品专项整治迎检培训试题及答案
- 医疗广告管理办法培训试题及答案
- 西部机场集团招聘笔试题目
- 2025年CATTI三级笔译实务真题
- 2026年南京铁道职业技术学院单招职业技能测试题库附答案详解(综合题)
- 2026年六安职业技术学院单招职业倾向性考试题库及完整答案详解
- 2025年侍茄师初级笔试及答案
- 车辆生产一致性管理制度
- 煤气柜安全制度规范
- 2026年山西青年职业学院单招职业技能考试备考试题带答案解析
- 岗位安全风险管控培训课件
- 《创新创业基础》教学大纲
- 雨课堂学堂在线学堂云《课程与教学论( 华师)》单元测试考核答案
评论
0/150
提交评论