二、四选一逻辑
所需软件
Verilog编程软件:Lattice Diamond(3.11.0.396.4_Diamond_x64)
Verilog仿真软件:ModelSim SE-64 10.2c(modelsim-win64-10.2c-se)
方法:用case语句实现多路选择逻辑
符号图:
Verilog代码:
Part1:fn_sw_4.v文件(Verilog工程文件)
//2020-05-24
//四选一逻辑
module fn_sw_4(
a,
b,
sel,
y
);
input a,b;
input[1:0] sel; //sel为两位的变量
output y; //y为1位形式输出变量,因此不需将y定为两位的变量形式
reg y; //需用always语句对变量y赋值,因此需要将变量y定义为reg型变量
always@(a or b or sel) //本always语句中的敏感变量为a、b、sel
begin
case(sel) //case语句中变量为sel
2'b00:begin y<=a&b;end //用2'b表示位数为两位的变量sel,变量sel的具体数值为2'b后的二进制数据
2'b01:begin y<=a|b;end
2'b10:begin y<=a^b;end
2'b11:begin y<=~(a^b);end //用~(a^b)表示同或(异或非门)
endcase //case要和endcase搭配
end //begin要和end搭配
endmodule //module要和endmodule搭配
Part2:fn_sw_4_tb.v文件(Verilog仿真文件)
//2020-05-24
//四选一逻辑-testbench
`timescale 1ns/10ps //时间尺度预编译指令(`timescale 时间尺度/时间精度)
//将时间尺度预编译指令放在testbench(仿真)代码文件里
module fn_sw_4_tb();
reg[3:0] absel; //定义4位的变量absel,用于给a、b、sel赋值
wire y;
fn_sw_4 fn_sw_4( //采用异名裂化的方法
.a(absel[0]), //将absel[0]的值连接到a,即把absel[3:0]的第0位的值赋给a
.b(absel[1]), //将absel[1]的值连接到b,即把absel[3:0]的第1位的值赋给b
.sel(absel[3:2]), //将absel[3:2]的值连接到sel,即把absel[3:0]的第3位和第2位的值赋给sel
.y(y) //将wire型变量y的值赋给y,用作四选一逻辑代码的输出。
);
initial //用initial语句块给absel赋值
begin
absel<=0; //对absel语句块赋初值
#200 $stop; //设置仿真时长为200ns(每10ns变化一次数据,变化20次)。
//注:四位二进制可组成16种数据,令absel每过10ns加1,因此仿真时长大于160ns就可完成一轮仿真。
end //勿忘记initial begin后的end
always #10 absel<=absel+1; //每过10ns,absel+1
//always后不需要end。只有begin需要单独的end
endmodule
仿真波形:
注意事项
1、对1位形式输出的变量,不需将其定义为两位的变量形式,比如fn_sw_4.v文件中的“output y; ”;
2、用2'b表示位数为两位的变量sel,变量sel的具体数值为2'b后的二进制数据,比如fn_sw_4.v文件中的“2'b00”;
3、case语句要和endcase搭配;begin要和end搭配;module要和endmodule搭配。always语句块后无自己的end;
4、时间尺度预编译指令(`timescale 时间尺度/时间精度),需放在testbench(仿真)代码文件里,如fn_sw_4_tb.v文件首行代码所示;
5、四位二进制可组成16种数据,令absel每过10ns加1,因此仿真时长大于160ns就可遍历完成一轮仿真。