verilog数字系统设计教程第6章例题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

<说明语句> //从地址字中提取低字节的程序

相关文档
最新文档