.b(data[2]), .a(out[2]) );
dffr dffr2 (.q(out[2]), .d(n1[2]), .clk(clk), .rst_(rst_) );
mux mux1 (.out(n1[1]), .sel(load), .b(data[1]), .a(out[1]) );
dffr dffr1 (.q(out[1]), .d(n1[1]), .clk(clk), .rst_(rst_) );
mux mux0 (.out(n1[0]), .sel(load), .b(data[0]), .a(out[0]) );
dffr dffr0 (.q(out[0]), .d(n1[0]), .clk(clk), .rst_(rst_) );
例化寄存器
register r1 (
.data(data), .out(out), .load(load), .clk(clk), .rst_(rst_) );
例化时钟
clock c1 (
.clk(clk) );
添加检测信号 initial begin
$timeformat(-9,1,\
$monitor(\$stime,clk,data,load,out); $dumpvars(2,register_test); end
四、 仿真结果与波形
LAB 4:用always块实现较复杂的组合逻辑电路
一、
实验目的
掌握用always实现组合逻辑电路的方法;
了解assign与always两种组合逻辑电路实现方法之间的区别。
二、 实验原理
仅使用assign结构来实现组合逻辑电路,在设计中会发现很多地方显得冗长且效率低下。适当地使用always来设计组合逻辑,会更具实效。
本实验描述的是一个简单的ALU指令译码电路的设计示例。它通过对指令的判断,对输入数据执行相应的操作,包括加、减、或和传数据,并且无论是指令作用的数据还是指令本身发生变化,结果都要做出及时的反应。
示例中使用了电平敏感的always块,电平敏感的触发条件是指在@后括号内电平列表的任何一个电平发生变化就能触发always块的动作,并且运用了case结构来进行分支判断。
在always中适当运用default(在case结构中)和else(子if…else结构中),通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型。如果不使用default或else对缺省项进行说明,易产生意想不到的锁存器。
三、 源代码
电路描述
always@(opcode or data or accum) begin
if(accum==8'b00000000) #1.2 zero=1; else
#1.2 zero=0;
case(opcode)
PASS0: #3.5 out =accum; PASS1: #3.5 out =accum;
ADD: #3.5 out = data + accum; AND: #3.5 out =data&accum; XOR: #3.5 out =data^accum; PASSD: #3.5 out=data; PASS6:#3.5 out=accum; PASS7:#3.5 out=accum; default:#3.5 out=8'bx; endcase end
四、 仿真结果与波形