




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 例题 例如:if(ab) out1 = int1; else out1 = int2;例如: always ( some_event) /虚的字体表示块语句 beginif(ab) out1 = int1; else if (a=b) out1 = int2; else out1 = int3; endif(ab)begin out1=int1; out2=int2;endelsebegin out1=int2; out20)for(scani=0;scani0)begin$display(.);memoryscani=0;endelse/*WRONG*/$display(error-
2、indexiszero);尽管程序设计者把else写在与第一个if(外层if)同一列上,希望与第一个if对应,但实际上else是与第二个if对应,因为它们相距最近。正确的写法应当是这样的:if(index0)beginfor(scani=0;scani0)begin$display(.);memoryscani=0;endendelse /*WRONG*/$display(error-indexiszero);/定义寄存器和参数。reg 31:0 instruction, segment_area255:0;reg 7:0 index;reg 5:0 modify_seg1, modify_s
3、eg2, modify_seg3;parametersegment1=0, inc_seg1=1,segment2=20, inc_seg2=2,segment3=64, inc_seg3=4,data=128;/检测寄存器index的值if(indexsegment2)begininstruction = segment_areaindex + modify_seg1;index = index + inc_seg1;endelse if(indexsegment3)begininstruction = segment_areaindex + modify_seg2;index = inde
4、x + inc_seg2;endelse if (indexdata)begininstruction = segment_areaindex + modify_seg3;index = index + inc_seg3;endelseinstruction = segment_areaindex;reg 15:0 rega;reg 9:0 result;case(rega)16 d0: result = 10 b0111111111;16 d1: result = 10 b1011111111;16 d2: result = 10 b1101111111;16 d3: result = 10
5、 b1110111111;16 d4: result = 10 b1111011111;16 d5: result = 10 b1111101111;16 d6: result = 10 b1111110111;16 d7: result = 10 b1111111011;16 d8: result = 10 b1111111101;16 d9: result = 10 b1111111110;default: result =10 bx;endcase例1: case ( select1:2 )2 b00: result = 0;2 b01: result = flaga;2 b0x,2 b
6、0z: result = flaga? bx : 0;2 b10: result = flagb;2 bx0,2 bz0: result = flagb? bx : 0;default: result = bx;endcase例2: case(sig)1 bz: $display(signal is floating);1 bx: $display(signal is unknown);default: $display(signal is %b, sig);endcase 例3: reg7:0 ir;casez(ir) 8 b1?: instruction1(ir); 8 b01?: ins
7、truction2(ir); 8 b00010?: instruction3(ir); 8 b000001?: instruction4(ir);endcase例4: reg7:0 r, mask;mask = 8bx0x0x0x0;casex(rmask) 8 b001100xx: stat1; 8 b1100xx00: stat2; 8 b00xx0011: stat3; 8 bxx001100: stat4;endcase例: always (al or d ) / 有锁存器begin if ( al ) q = d;endalways (al or d ) / 无锁存器begin if
8、 ( al ) q = d; else q = 0;end例5: 条件语句举例/第一类条件语句if ( !lock ) buffer = data ;if ( enable ) out = in ;/第二类条件语句if (number_queued MAX_Q_DEPTH)begin data_queue = data ; number_queued = number_queued + 1 ;endelse $display ( Queue Full. Try again ) ;/第三类条件语句/根据不同的算术逻辑单元的控制信号 alu_control 执行不同的算术运算操作if ( alu_
9、control = = 0 ) y = x + z ;else if ( alu_control = = 1 ) y = x - z ;else if ( alu_control = = 2 ) y = x * z ;else $ display ( Invalid ALU control signal );reg 1: 0 alu_control ;.case (alu_control) 2 d 0 : y = x + z ; 2 d 1 : y = x - z ; 2 d 2 : y = x * z ;default : $display ( Invalid ALU control sig
10、nal ) ;endcase 例6:使用case语句实现四选一多路选择器module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);/ 根据输入/输出图的端口声明output out;input i0, i1, i2, i3;input s1, s0;/把输出变量声明为寄存器类型 reg out;/任何输入信号改变,都会引起输出信号的重新计算/使输出out 重新计算的所有输入信号必须写入 always (.)的变量列表中 always (s1 or s0 or i0 or i1 or i2 or i3)begincase (s1, s0) 2b00: out
11、= i0; 2b01: out = i1; 2b10: out = i2; 2b11: out = i3; default: out = 1bx;endcaseendendmoduleparameter size=8,longsize=16;reg size:1 opa, opb;reg longsize:1 result;begin: multreg longsize:1 shift_opa, shift_opb;shift_opa = opa;shift_opb = opb;result = 0;repeat(size)beginif(shift_opb1)result = result
12、+ shift_opa;shift_opa = shift_opa 1;endend begin:count1sreg7:0 tempreg;count=0;tempreg = rega;while(tempreg)beginif(tempreg0) count = count + 1;tempreg = tempreg1;endend 例7:begin:init_memreg7:0 tempi;for(tempi=0;tempimemsize;tempi=tempi+1)memorytempi=0;end例8:parameter size = 8, longsize = 16;regsize
13、:1 opa, opb;reglongsize:1 result;begin:multinteger bindex;result=0;for( bindex=1; bindex=size; bindex=bindex+1 )if(opbbindex)result = result + (opa1 )if(tempreg0) count=count+1;end例9顺序块/说明1reg x, y;reg 1:0 z, w; initialbegin x = 1b0; y = 1b1; z = x, y; w = y, x; end/说明 2: 带延迟的顺序块 reg x, y;reg 1:0 z,
14、 w;initialbegin x = 1b0; /在仿真时刻0 完成 #5 y = 1b1; /在仿真时刻5 完成 #10 z = x, y; / 在仿真时刻15 完成 #20 w = y, x; / 在仿真时刻35 完成 end例10 并行块 /举例 1: 带延迟的并行块 reg x, y;reg 1:0 z, w; initialfork x = 1b0; / 在仿真时刻0 完成 #5 y = 1b1; / 在仿真时刻5 完成 #10 z = x, y; / 在仿真时刻10 完成 #20 w = y, x; / 在仿真时刻20 完成join/故意引入竞争条件的并行块 reg x, y;r
15、eg 1:0 z, w; initialfork x = 1b0; y = 1b1; z = x, y; w = y, x; join我们可以将并行块的关键字fork看成是将一个执行流分成多个独立的执行流;而关键字join则是将多个独立的执行流合并为一个执行流。每个独立的执行流之间是并发执行的。例11 嵌套块/嵌套块initialbegin x = 1b0; fork #5 y = 1b1; #10 z = x, y; join #20 w = y, x;endendmodule例12 命名块/命名块module top ;initialbegin : block1 /名字为block1的顺序
16、命名块integer i ; /整型变量 i 是block1命名块的静态本地变量 /可以用层次名top.block1.i 被其他模块访问.endinitialfork : block2 /名字为block2的并行命名块reg i ; /寄存器变量 i 是block2命名块的静态本地变量 /可以用层次名top.block2.i 被其他模块访问.join例13 命名块的禁用/在(矢量)标志寄存器的各个位中从低有效位开始找寻第一个值为1的位 /从矢量标志寄存器的低有效位开始查找第一个值为1的位reg 15:0 flag;integer i; /用于计数的整数 initialbegin flag =
17、16b 0010_0000_0000_0000; i = 0; begin: block1 /while循环声明中的主模块是命名块block1 while(i 16) begin if (flagi) begin $display(Encountered a TRUE bit at element number %d, i); disable block1; / 在标志寄存器中找到了值为真(1)的位,禁用block1 end i = i + 1;end endend 例14 对两个N位总线变量进行按位异或/本模块生成两条N位总线变量的按位异或module bitwise_xor ( out ,
18、 i0 , i1 ) ;/参数声明语句。参数可以重新定义parameter N = 32 ; / 缺省的总线位宽为32位/端口声明语句output N-1 : 0 out ;input N-1 : 0 i0 , i1 ;/声明一个临时循环变量。/该变量只用于生成块的循环计算。/Verilog仿真时该变量在设计中并不存在genvar j ;/用一个单循环生成按位异或的异或门(xor)generate for ( j = 0 ; j N ; j = j + 1 ) begin : xor_loopxor g1 (out j , i0 j , i1 j ) ; end / 在生成块内部结束循环end
19、generate /结束生成块/另外一种编写形式/异或门可以用always块来替代/ reg N-1 : 0 out ;/ generate / for ( j = 0 ; j N ; j = j + 1 ) / begin : bit/ always ( i0 j or i1 j ) out j = i0 j i0 j ; / end / endgenerate endmodule例15 用循环生成语句描述的脉动加法器/本模块生成一个门级脉动加法器module ripple_adder ( co , sum , a0 , a1 , ci ) ;/参数声明语句,参数可以重新定义。paramet
20、er N = 4 ; / 缺省的总线位宽为4/端口声明语句output N-1 : 0 sum ;output co ;input N-1 : 0 a0 , a1 ;input ci ;/本地线网声明语句wire N-1 : 0 carry ;/指定进位变量的第0位等于进位的输入assign carry 0 = ci ;/声明临时循环变量。该变量只用于生成块的计算。/由于在仿真前,循环生成已经展平,所以用Verilog对/设计进行仿真时,该变量已经不再存在。genvar i ;/用一个单循环生成按位异或门等逻辑generate for ( i = 0 ; i N ; i = i + 1 ) b
21、egin : r_loopwire t1 , t2 , t3 ;xor g1 ( t1 , a0 i , a1 i ) ;xor g2 ( sum i , t1 , carry i ) ;and g3 ( t2 , a0 i , a1 i ) ;and g4 ( t3 , t1 , carry i ) ;or g5 (carry i + 1 , t2 , t3 ) ;end / 生成块内部循环的结束 endgenerate /生成块的结束/ 根据上面的循环生成,Verilog编译器会自动生成以下相对层次实例名/ xor : r_loop0.g1 , r_loop1.g1 , r_loop2.g
22、1 , r_loop3.g1 ,/ r_loop0.g2 , r_loop1.g2 , r_loop2.g2 , r_loop3.g2 ,/ and : r_loop0.g3 , r_loop1.g3 , r_loop2.g3 , r_loop3.g3 ,/ r_loop0.g4 , r_loop1.g4 , r_loop2.g4 , r_loop3.g4 ,/ or : r_loop0.g5 , r_loop1.g5 , r_loop2.g5 , r_loop3.g5 / 上面生成的实例用下面这些生成的线网连接起来/ Nets : r_loop0.t1 , r_loop0.t2 , r_lo
23、op0.t3 / r_loop1.t1 , r_loop1.t2 , r_loop1.t3 / r_loop2.t1 , r_loop2.t2 , r_loop2.t3 / r_loop3.t1 , r_loop3.t2 , r_loop3.t3 assign co = carry N ;endmodule 例16 使用条件生成语句实现参数化乘法器/ 本模块实现一个参数化乘法器module multiplier ( product , a0 , a1 ) ;/参数声明,该参数可以重新定义parameter a0_width = 8 ; parameter a1_width = 8 ; /本地参
24、数声明/本地参数不能用参数重新定义(defparam)修改 , /也不能在实例引用时通过传递参数语句,即 #(参数1,参数2,.)的方法修改localparam product_width = a0_width + a1_width ;/端口声明语句output product_width - 1 : 0 product ;input a0_width - 1 : 0 a0 ;input a1_width - 1 : 0 a1 ;/有条件地调用(实例引用)不同类型的乘法器/根据参数a0_width 和 a1_width的值,在调用时/引用相对应的乘法器实例。generate if ( a0_w
25、idth 8 ) | | ( a1_width 8 ) cal_multiplier # ( a0_width , a1_width ) m0 ( product , a0 , a1 ) ;else tree_multiplier # ( a0_width , a1_width ) m0 ( product , a0 , a1 ) ;endgenerate /生成块的结束endmodule例17 CASE生成语句举例/本模块生成N位的加法器module adder ( co , sum , a0 , a1 , ci );/参数声明,本参数可以重新定义parameter N = 4 ; / 缺省
26、的总线位宽为4/端口声明output N-1 : 0 sum ;output co ;input N-1 : 0 a0 , a1 ;input ci ;/ 根据总线的位宽,调用(实例引用)相应的加法器/ 参数N在调用(实例引用)时可以重新定义,调用(实例引用)/ 不同位宽的加法器是根据不同的N来决定的。generate case ( N )/ 当N=1, 或2 时分别选用位宽为1位或2位的加法器1 : adder_1bit adder1 ( co , sum , a0 , a1 , ci ) ; / 1位的加法器2 : adder_2bit adder2 ( co , sum , a0 , a1 , ci ) ; / 2位的加法器/ 缺省的情况下选用位宽为N位的超前进位加法器default : adder_cla # ( N ) adder3 ( co , sum , a0 , a1 , ci ) ; endcaseendgenerate /生成块的结束endmodule例18 行为级描述的四选一多路选择器/ 四选一多路器,其端口列表完全根据输入/输出图编写 module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);/ 根据输入/输出图的端口声明outpu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电玩竞技桌与座椅出租考核试卷
- 游戏美术风格与视觉传达考核试卷
- 砖瓦制造机械的能效优化考核试卷
- 砼结构构件的预制与现浇结合技术考核试卷
- 窗帘行业法律法规与标准考核试卷
- 温州大学《美术教师职业技能训练》2023-2024学年第二学期期末试卷
- 辽宁省辽阳市2024-2025学年高三第二学期3月第一次测试化学试题含解析
- 山东省聊城市莘县第一中学2025届全国新高三下学期开学大联考试题生物试题含解析
- 辽宁省鞍山市第二十六中学2025年初三模拟检测试题(一)物理试题含解析
- 南宁师范大学师园学院《Hadoop+spark大数据分析技术课程设计》2023-2024学年第一学期期末试卷
- 食堂改造与装修设计方案
- 关于公司企业进行人员总量控制的实施方案
- 物流运输托运单模板
- 防止电力生产重大事故地二十五项反措
- 油田结垢机理及防治技术
- 苏教版五年级数学下册第三单元测试题及答案一
- 天然气管道工程施工设计方案方案
- 变电站第二种工作票(范本)
- 抗滑桩设计计算(验算)Word版
- DCP决策评审要素
- 全球价值链与中国贸易增加值核算报告
评论
0/150
提交评论