Verilog上机实验报告
实验六 在Verilog HDL中使用函数
一、 实验目的
1. 了解函数的定义和在模块设计中的使用;
2. 了解函数的可综合性问题;
3. 了解许多综合器不能综合复杂的算术运算。
二、 实验内容
设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和最大数为5的阶乘的运算,要求可综合。编写测试模块,并给出各种层次的仿真波形,比较它们的不同。
三、 对任务的理解
本题要求完成一个带控制端的逻辑运算电路。当控制端的控制信号不同的时候,输出与输入之间的函数关系不同,分别为平方、立方和阶乘。
四、 实现思路
1. 首先这个逻辑运算电路应当有3个对外的端口,分别是:一个数据输入端口;
一个2位的功能控制端口;一个结果的输出端口。
2. 由于阶乘的最大数为5,因此输入最大数据为5,输出最大数据为5!=120设输
入数据为3位,输出数据为8位。
3. 通过条件分置于句来选择不同的函数功能。而每个函数功能分别编写来提高程
序的可读性和可移植性。
4. 测试模块产生随机的输入数据以及控制信号,因此利用系统任务$random来实
现。通过一个时钟信号,每隔一段时间产生新的随机数。
五、 代码
1. 主程序
---------------------------------------文件名 func.v--------------------------------------------
module func(in,out,s);
26
Verilog上机实验报告
input [2:0] in; output [7:0] out; input [1:0] s;
reg [7:0] out;
always @ (*) begin case (s)
2'b00: out<=square(in); 2'b01: out<=cube(in); 2'b10: out<=factorial(in); default: out<=out; endcase end
function [7:0] square; input [2:0] a;
assign square=a*a; endfunction
function [7:0] cube; input [2:0] b;
assign cube=b*b*b; endfunction
function [7:0] factorial; input [2:0] c; reg [2:0] index; begin
factorial=c?1:0;
for(index =2;index<=c;index=index+1) factorial=index*factorial; end
endfunction
endmodule
2. 测试模块
----------------------------------------文件名 func_tb.v----------------------------------- `timescale 1ns/1ns
27
Verilog上机实验报告
module t; reg [2:0] in; reg [1:0] s; wire[7:0] out;
reg clk;
initial begin in=0; s=0; clk=0;
#10000 $stop; end
always #50 clk=~clk; always @ (posedge clk) begin
in<={$random}%8; s<={$random}%4; end
func m (in,out,s);
endmodule
六、 仿真波形
七、 总结及对波形的说明
1. 实验结论
从波形中可以看出
当s=00时,in=101=5时,out=00011001=25。即完成了平方的功能。out与前一个
28
Verilog上机实验报告
时刻的out相同,即输出维持不变。
当s=01时,in=100=4时,out=01000000=64,;in=001=1时,out=00000001=1。即完成了立方的功能。
当s=10时,in=101=5,out=01111000=120。即完成了阶乘的功能。 当s=11时,out与前一个时刻的out相同,即输出维持不变。
可见,随着s和输入的变化,out都发生了相应的变化,满足题目的要求。
2. 实验总结
本次实验是Verilog上机的第五个实验,是一个较为复杂的组合逻辑电路。其中运用了函数来实现一些模块化的功能,增强了程序的可读性和可移植性。在今后进行Verilog程序设计的时候,也应当多用这样的写法。
3. Verilog 可综合的总结
1) 所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,
supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。
2) 所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,
delays,UDP,wait。
3) 有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,
real,disable,forever,arrays,memories,repeat,task,while。
29
Verilog上机实验报告
实验七 在Verilog HDL中使用任务(task)
一、 实验目的
1. 掌握任务在Verilog模块设计中的使用;
2. 学会在点评敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。
二、 实验内容
用两种不同方法设计一个功能相同的模块,该模块能完成四个8位2进制数据的冒泡排序。第一种,模仿上面的例子用纯组合逻辑实现;第二种,假设8位数据是按照时钟节拍串行输入的,要求时钟触发任务的执行法,每个时钟周期完成一次数据交换的操作。比较两种不同方法的运行速度和消耗资源的不同。
三、 对任务的理解
本题要求实现一个数据的冒泡排序。要求两种方法实现。分别是并行输入数据的情况和串行输入数据的情况。
四、 实现思路
1. 第一种方法需要8个对外端口,分别为4个8位的输入端口和4个8位的输出
端口。第二种方法需要7个对外端口,分别是1个8位数据输入端口,1个时钟,1个复位端口和4个8位输出端口。
2. 两种方法中,都要把输入的4个数据储存在内部的四个存储器中,对这四个存
储器的数据进行冒泡排序,再将这四个储存器中的已经排序完成的数据输出。不同之处在于第一种方法直接将输入的数据储存起来。而第二种方法则每进来一个数据进行一次储存和一次排序。
3. 冒泡排序的算法可以通过比较和数据对换位置实现。其中数据对换位置的功能
多次重复使用,可以由一个任务来完成。
五、 代码
1. 主程序
30