练习五用always块实现较复杂的组合逻辑电路 实验目的:
(1)掌握用always实现较大组合逻辑电路的方法;
(2)进一步了解assign与always两种组合电路实现方法的区别和注意点; (3)学习测试模块中随机数的产生和应用; (4)学习综合不同层次的仿真,并比较结果。
实验原理:
(1)自触发always块:
例:采用非阻塞赋值的自触发振荡器 module osc2(clk); outputclk; regclk;
initial #10 clk=0;
always @(clk) #10 clk<=~clk; endmodule
@(clk)的第一次触发之后,非阻塞赋值的RHS表达式便计算出来,并把值赋给LHS的时间并安排在更新事件队列中。在非阻塞赋值更新事件队列被激活之前,又遇到了@(clk)触发语句,并且always块再次对clk的值变化产生反应。当非阻塞LHS的值在同一时刻被更新时,@(clk)再一次触发。
本实验示例中使用了电平敏感的always块,所谓电平敏感的触发条件:@后的括号内电平里表中的任何一个电平发生变化(与时序逻辑不同,它在@后的括号内没有沿敏感关键词,如posedge或negedge),就能触发always块的动作。
(2)assign与always
使用assign结构来实现组合逻辑电路,如果逻辑关系比较复杂,不容易理解语句的功能,而适当采用always来设计组合逻辑,使源代码语句的功能容易理解。
同一组合逻辑电路分别用always块和连续赋值语句assign描述时,代码的形式大相径庭,但在always中,若适当运用default(在case结构中)和else(在if?else结构中)语句时,通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型;若不使用default或else对默认项进行说明,则易生成意想不到的锁存器,这一点一定注意!
实验内容:
运用always块设计一个8路数据选择器。要求:每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据变化时,输出数据也相应的变化。
13
实验代码:
module choice(a,b,c,d,e,f,g,h,n,out); input[2:0] n; input[3:0] a,b,c,d,e,f,g,h; output[3:0] out; reg[3:0] out;
always @(n,a,b,c,d,e,f,g,h) begin
case(n)
0: out = a; 1: out = b; 2: out = c; 3: out = d; 4: out = e; 5: out = f; 6: out = g; 7: out = h;
default: out=4'hx;//未收到指令时,输出任意态。
endcase end
endmodule
`timescale 1ns/100ps module five; wire [3:0] out; reg [2:0] n; reg [3:0] a,b,c,d,e,f,g,h;
initial begin a={$random,$random,$random,$random}; b={$random,$random,$random,$random}; c={$random,$random,$random,$random}; d={$random,$random,$random,$random}; e={$random,$random,$random,$random}; f={$random,$random,$random,$random}; g={$random,$random,$random,$random};
14
h={$random,$random,$random,$random};
#50 n =3'b000; #50 n =3'b001; #50 n =3'b010; #50 n =3'b011; #50 n =3'b100; #50 n =3'b101; #50 n =3'b110; #50 n =3'b111; #50 $stop; end choice m (a,b,c,d,e,f,g,h,n,out);
endmodule
实验仿真:
15
练习六在Verilog HDL中使用函数
实验目的:
(1)了解函数的定义和在模块设计中的使用; (2)了解函数的综合性问题;
(3)了解许多综合器不能综合复杂的算术运算。
实验原理:
与一般的程序设计语言一样,Verilog HDL中也可使用函数以适应对不同变量采取同一种运算的操作。Verilog HDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果。函数的目的是返回一个用于表达式的值。
(1)函数定义
Function<返回值的类型或范围>(函数名); <端口说明语句> <变量类型说明语句> Begin
<语句> …… End
Endfuction
(2)函数调用
<函数名>(<表达式>,?<表达式>)
实验内容:
设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和最大数为5的阶乘的运算,要求可综合。编写测试模块,并给出各种层次的仿真波形,比较它们的不同。
实验代码:
module funct(clk,data,n,result,reset);
output[8:0] result; input[3:0] n; input[3:0] data; input reset,clk; reg[8:0] result;
16