verilog数字系统设计教程第6章例题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章例题
[例1]:用initial 块对存储器变量赋初始值
initial
begin
areg=0; //初始化寄存器areg
for(index=0;index memory[index]=0; //初始化一个memory end [例2]:用initial语句来生成激励波形 initial begin inputs = 'b000000; //初始时刻为0 #10 inputs = 'b011001; (’是英文输入法中的标号) #10 inputs = 'b011011; #10 inputs = 'b011000; #10 inputs = 'b001000; end //always语句由于其不断活动的特性,只有和一定的时序控制结合在一起才有用。 //如果一个always语句没有时序控制,则这个always语句将会使仿真器产生死锁。 //见下例: [例3]:always areg = ~areg; //但如果加上时序控制,则这个always语句将变为一条非常有用的描述语句。见下例:[例4]:always #half_period areg = ~areg; //这个例子生成了一个周期为:period(=2*half_period) 的无限延续的信号波形, //常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。 [例5]:reg[7:0] counter; reg tick; always @(posedge areg) begin tick = ~tick; counter = counter + 1; end [例6] OR事件控制(敏感列表) //有异步复位的电平敏感锁存器 always @ ( reset or clock or d ) //等待复位信号reset 或时钟信号clock 或输入信号d 的改变 begin if ( reset ) //若reset 信号为高,把q置零 q = 1 'b0 ; else if ( clock ) //若clock 信号为高,锁存输入信号d q = d ; end /* Verilog1364-2001版本的语法中,对于原来的规定作了补充:关键词“or”也可以使用“,”来代替。例7 给出了使用逗号的例子。使用“,”来代替关键词“or”也适用于跳变沿敏感的触发器。*/ [例7] 使用逗号的敏感列表 //有异步复位的电平敏感锁存器 always @ ( reset , clock , d ) //等待复位信号reset 或时钟信号clock 或输入信号d的改变 begin if ( reset ) // 若reset 信号为高,把q置零 q = 1 'b0 ; else if ( clock ) // 若clock 信号为高,锁存输入信号d q = d ; end //用reset异步下降沿复位,clk正跳变沿触发的D寄存器 always @ ( posedge clk , negedge reset ) //注意:使用逗号来代替关键字or if (! reset ) q <= 0 ; else q <= d ; [例8]@*操作符的使用 //用or 操作符的组合逻辑块 //编写敏感列表很繁琐并且容易漏掉一个输入 always @ ( a or b or c or d or e or f or g or h or p or m ) begin out1 = a ? b + c : d + e ; out2 = f ? g + h : p + m ; end //不用上述方法,用符号@(*)来代替,可以把所有输入变量都自动包括进敏感列表。always @ ( * ) begin out1 = a ? b + c : d + e ; out2 = f ? g + h : p + m ; end always wait (count_enable) #20 count = count + 1; switch_bytes(old_word,new_word); new_word = switch_bytes(old_word); task my_task; input a, b; inout c; output d, e; … <语句> //执行任务工作相应的语句 … c = foo1; //赋初始值 d = foo2; //对任务的输出变量赋值 e = foo3; endtask 任务调用: my_task(v,w,x,y,z); [例9] 描述红绿黄交通灯行为的Verilog模块,其中使用了任务。 module traffic_lights; reg clock, red, amber, green; parameter on=1, off=0, red_tics=350, amber_tics=30,green_tics=200; //交通灯初始化 initial red=off; initial amber=off; initial green=off; //交通灯控制时序 always begin red=on; //开红灯 light(red,red_tics); //调用等待任务 green=on; //开绿灯 light(green,green_tics); //等待 amber=on; //开黄灯 light(amber,amber_tics); //等待 end //定义交通灯开启时间的任务 task light; output color; input[31:0] tics; begin repeat(tics) @(posedge clock);//等待tics个时钟的上升沿color=off;//关灯 end endtask //产生时钟脉冲的always块 always begin #100 clock=0; #100 clock=1; end endmodule //用例子说明: function [7:0] getbyte; input [15:0] address; begin <说明语句> //从地址字中提取低字节的程序