当前位置:文档之家› 实验三 verilog HDL中任务与函数的数字系统设计

实验三 verilog HDL中任务与函数的数字系统设计

实验三:verilog HDL中任务与函数的数字系统设计班级:通信二班姓名:孔晓悦学号:10082207
作业完成后,以班级为单位,班长或课代表收集齐电子版实验报告,统一提交.
文件命名规则如“通1_王五_学号”
一、实验目的
1、了解verilog HDL任务与函数的定义及格式
2、掌握函数与任务的定义与调用
3、掌握函数与任务在使用时的区别
4、掌握任务与函数的具体应用
二、预习要求
1.复习veirlogHDL行为语句。

2. 预习任务与函数的相关定义和格式要求。

3.简单电路系统设计的流程和方法。

三、实验基本概念
1、任务定义
☐任务定义格式:
task <任务名>;//注意无端口列表
端口及数据类型声明语句;
其它语句;
endtask
☐任务调用的格式为:
<任务名>(端口1,端口2,……);
☐需要注意的是:任务调用时和定义时的端口变量应是一一对应的。

☐注意事项:
●任务的定义与调用须在一个module模块内。

●定义任务时,没有端口名列表,但需要紧接着进行输入输出端口
和数据类型的说明。

●当任务被调用时,任务被激活。

任务的调用与模块调用一样通过
任务名调用实现,调用时,需列出端口名列表,端口名的排序和类
型必须与任务定义中的相一致。

●一个任务可以调用别的任务和函数,可以调用的任务和函数个数
不限。

2、函数定义
☐函数的目的是返回一个值,以用于表达式计算
☐函数的定义格式:
function <返回值位宽或类型说明> 函数名;
端口声明;
局部变量定义;
其它语句;
endfunction
☐<返回值位宽或类型说明>是一个可选项,如果缺省,则返回值为1位寄存器类型的数据。

☐注意事项:
●函数的定义与调用须在一个module模块内。

●函数只允许有输入变量且必须至少有一个输入变量,输出变量由
函数名本身担任,在定义函数时,需对函数名说明其类型和位宽。

●定义函数时,没有端口名列表,但调用函数时,需列出端口名列
表,端口名的排序和类型必须与定义时的相一致。

这一点与任务相

●函数可以出现在持续赋值assign的右端表达式中。

●函数不能调用任务,而任务可以调用别的任务和函数,且调用任
务和函数个数不受限制。

3、例题1 alutask
4、例题2 code_83
4、例题3 funct
四、实验内容
(一)典型习题的验证与仿真
设计要求:
1、指令译码器电路alutask进行调试和仿真。

2、将函数的两个例题83译码器和斐波拉切数计算的例题进行调试和仿真。

3、通过三个例题,掌握任务和函数的定义格式,使用的方法。

代码:
module alutask(opcode,a,b,c);
input [1:0] opcode;
input [7:0] a,b;
output reg [8:0] c;
always @(a or b or opcode)
begin
case(opcode)
2'b00:my_and(a,b,c);
2'b01:c=a|b;
2'b10:c=a-b;
2'b11:c=a+b;
default :c=9'bx;
endcase
end
task my_and;
input [7:0] my_a,my_b;
output [7:0] my_c;
integer i;
for(i=0;i<=7;i=i+1)
my_c[i]=my_a[i]&my_b[i];
endtask
endmodule
仿真结果:
(二)函数与任务练习1---指令译码电路设计
设计要求:
1、在“三、实验基本概念”中例题1,进行改进。

在目前4个分支的基础上增加两个分支,完成a*b的功能,利用移位相加的形式计算,两个分支分别用任务和函数设计。

2.QuartusII进行功能仿真,验证设计的正确性。

4、过程和结果(后面继续添加)
将在程序编辑、编译过程中的错误进行记录(截图或者文本),并错误指出来
(1)编译过程出现的问题总结
错误提示(系统提示)解决方法
错误1
错误2
……..
(2)代码与仿真结果(结果截图)
代码:
module code_83(din,dout);
input[7:0] din;
output [7:0] dout;
function [2:0] code;
input [7:0] din;
casex (din)
8'b1xxx_xxxx : code = 3'h7;
8'b01xx_xxxx : code = 3'h6;
8'b001x_xxxx : code = 3'h5;
8'b0001_xxxx : code = 3'h4;
8'b0000_1xxx : code = 3'h3;
8'b0000_01xx : code = 3'h2;
8'b0000_001x : code = 3'h1;
8'b0000_000x : code = 3'h0;
default :code = 3'hx;
endcase
endfunction
assign dout = code(din);
endmodule
仿真结果:
(三)任务与函数练习2---带7段管输出1位bcd码加法电路
设计要求:
1、参考例题2,设计一个数字电路完成2个1位bcd码加法,输出为七段管。

2、参考例题2和上次试验的7段管译码电路,分别用任务和函数定义7段管的译码电路实
现电路设计。

3.QuartusII进行功能仿真,验证设计的正确性。

4、过程和结果(后面继续添加)
将在程序编辑、编译过程中的错误进行记录(截图或者文本),并错误指出来
(1)编译过程出现的问题总结
错误提示(系统提示)解决方法
错误1
错误2
……..
(2)代码与仿真结果(结果截图)
代码:
module funct(clk,n,result,reset);
output [31:0] result;
input [3:0] n;
input clk,reset;
reg [31:0] result;
always @(posedge clk)
begin
if(!reset) result <=0;
else begin
result <= 2 * factorial(n);
end
end
function [31:0] factorial;
input [3:0] opa;
reg [3:0] i;
begin
factorial = opa ? 1:0;
for(i=2;i<=9;i=i+1)
factorial = i * factorial;
end
endfunction
endmodule
仿真结果:
不是很全的结果
实验要求
1、按照上面的提示完善报告
2、将程序编译过程中出现的主要错误及解决方案进行总结
3、掌握和练习数字系统的分析步骤,并将一些核心步骤进行记录
4、将编写的程序与仿真结果进行记录。

相关主题