一、二选一逻辑
所需软件
Verilog编程软件:Lattice Diamond(3.11.0.396.4_Diamond_x64)
Verilog仿真软件:ModelSim SE-64 10.2c(modelsim-win64-10.2c-se)
方法一:用assign语句实现
符号图:
Verilog代码:
Part1:Test_fn_sw.v文件(Verilog工程文件)
//2022-05-23
//二选一逻辑设计-fn_sw
module fn_sw(
a,
b,
sel,
y
);
input a;
input b;
input sel;
output y;
assign y=sel?(a^b):(a&b); //方法一:通过assign语句实现二选一逻辑
endmodule
Part2:Test_fn_sw_tb.v文件(Verilog仿真文件)
//2022-05-23
//二选一逻辑设计-testbench of fn_sw
`timescale 1ns/10ps
module fn_sw_tb;
reg a,b,sel;
wire y;
fn_sw fn_sw(
.a(a),
.b(b),
.sel(sel),
.y(y)
);
initial begin
a<=0;b<=0;sel<=0;
#10 a<=0;b<=0;sel<=1;
#10 a<=0;b<=1;sel<=0;
#10 a<=0;b<=1;sel<=1;
#10 a<=1;b<=0;sel<=0;
#10 a<=1;b<=0;sel<=1;
#10 a<=1;b<=1;sel<=0;
#10 a<=1;b<=1;sel<=1;
#10 $stop;
end
endmodule
仿真波形:
方法二:用always语句块实现
符号图:
Verilog代码:
Part1:Test_fn_sw.v文件(Verilog工程文件)
//2022-05-23
//二选一逻辑设计-fn_sw
module fn_sw(
a,
b,
sel,
y
);
input a;
input b;
input sel;
output y;
reg y; //方法二:通过always语句块实现二选一逻辑
always@(a or b or sel)
begin
if(sel==1)begin
y<=a^b;
end
else begin
y<=a&b;
end
end
endmodule
Part2:Test_fn_sw_tb.v文件(Verilog仿真文件)
与方法一的Test_fn_sw_tb.v文件一样。
仿真波形:
注意事项
1、对assign语句变量赋值时,需用“=”,比如方法一中的“assign y=sel?(a^b):(a&b);”;
2、在always语句块里赋值的变量需是reg型,比如方法二中的“y”;
3、对reg型变量赋值时,需用带箭头的等号“<=”,比如方法二中的“y<=a&b; ”;
4、对if else判别语句中的变量判别时,要用双等号“==”,比如方法二中的“if(sel==1)”。
原教学视频链接如下
https://www.bilibili.com/video/BV1hX4y137Ph?p=2&spm_id_from=pageDriver