教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 基础教育 >

Verilog HDL语言设计实验指导书(2004)(5)

来源:网络收集 时间:2026-05-01
导读: 实验三 函数和任务的应用设计 一 、实验目的 1、掌握函数在模块设计中的使用; 2、掌握任务在结构化Verilog HDL设计中的应用。 二、实验原理、内容及步骤 1、 函数在模块设计中的使用 函数可以在模块不同位置执行共

实验三 函数和任务的应用设计

一 、实验目的

1、掌握函数在模块设计中的使用;

2、掌握任务在结构化Verilog HDL设计中的应用。

二、实验原理、内容及步骤

1、 函数在模块设计中的使用

函数可以在模块不同位置执行共同代码。函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其它的任务。

函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函数。 函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定。如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为1位二进制数。函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值必须出现在函数定义中。

函数调用是表达式的一部分。与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在函数的多个调用之间保持它们的值。

下例是函数调用的一个简单示范,采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算。并且在测试模块中,通过调用系统任务$display在时钟的下降沿显示每次计算的结果。

模块源代码:

module tryfunct(clk,n,result,reset);

output[31:0] result; input[3:0] n; input reset,clk; reg[31:0] result;

always @(posedge clk) //clk的上沿触发同步运算。

begin

if(!reset) //reset为低时复位。

result<=0;

else

14

begin end

result <= n * factorial(n)/((n*2)+1);

end

function [31:0] factorial; //函数定义。

input [3:0] operand; reg [3:0] index; begin end

factorial = operand ? 1 : 0;

for(index = 2; index <= operand; index = index + 1) factorial = index * factorial;

endfunction

endmodule

测试模块源代码: `include \`timescale 1ns/100ps `define clk_cycle 50 module tryfuctTop;

reg[3:0] n,i; reg reset,clk; wire[31:0] result; initial

begin end

n=0; reset=1; clk=0; #100 reset=0; #100 reset=1; for(i=0;i<=15;i=i+1)

begin end

#200 n=i;

#100 $stop;

always #`clk_cycle clk=~clk;

15

tryfunct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset)); endmodule

上例中函数factorial(n)实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计中,我们不希望设计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是,我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。

仿真波形(部分):

2、 任务在结构化设计中的应用

一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以包含时序控制,即时延控制,并且任务也能调用其它任务和函数。

任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义在模块说明部分中编写。

任务调用:

? 一个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变量值; ? 任务调用语句是过程性语句,可以在always 语句或initial 语句中使用;

? 任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序匹配。

此外,参数要按值传递,不能按地址传递;

? 任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值;

? 任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器类型的; ? 任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出时才传

递给调用参数。

实例应用:利用task和电平敏感的always块设计比较后重组信号的组合逻辑。可以看到,利用task非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余逻辑等问题。

模块源代码:

//----------------- sort4.v ------------------ module sort4(ra,rb,rc,rd,a,b,c,d);

output[3:0] ra,rb,rc,rd; input[3:0] a,b,c,d; reg[3:0] ra,rb,rc,rd; reg[3:0] va,vb,vc,vd;

16

always @ (a or b or c or d)

begin end

{va,vb,vc,vd}={a,b,c,d};

sort2(va,vc); //va 与vc互换。 sort2(vb,vd); //vb 与vd互换。 sort2(va,vb); //va 与vb互换。 sort2(vc,vd); //vc 与vd互换。 sort2(vb,vc); //vb 与vc互换。 {ra,rb,rc,rd}={va,vb,vc,vd};

task sort2;

inout[3:0] x,y; reg[3:0] tmp; if(x>y)

begin end

tmp=x; //x与y变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。 x=y; y=tmp;

endtask

endmodule

值得注意的是task中的变量定义与模块中的变量定义不尽相同,它们并不受输入输出类型的限制。如此例,x与y对于task sort2来说虽然是inout型,但实际上它们对应的是always块中变量,都是reg型变量。

测试模块源代码: `timescale 1ns/100ps `include \module task_Top;

reg[3:0] a,b,c,d;

wire[3:0] ra,rb,rc,rd; initial

begin

a=0;b=0;c=0;d=0; repeat(5) begin

#100 a ={$random};

17

end

b ={$random}; c ={$random}; d ={$random};

#100 $stop;

sort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd));

endmodule

仿真波形(部分):

三、 实验设备及实验注意事项

1.Modelsim6.0和Sypnify Pro7.3及以上版本EDA软件

Modelsim是美国Mentor Graphics公司的子公司Model Technology的产品,属于编译型的Verilog/VHDL混合型仿真 …… 此处隐藏:2199字,全部文档内容请下载后查看。喜欢就下载吧 ……

Verilog HDL语言设计实验指导书(2004)(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/565706.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)