二选一逻辑
模块fn_sw功能:
当sel为0时y是a和b的与;当sel为1时y是a和b的异或。
Verilog代码:
使用assign语句块实现二选一功能
module fn_sw(
a,
b,
sel,
y
);
//定义端口属性
input a;
input b;
input sel;
output y;
//输入输出的关系
assign y=sel?(a^b):(a&b);
//这里的问号冒号语句,含义是:如果sel为1,则y等于(a^b),否则等于(a&b)
//问号冒号语句实现二选一
endmodule
使用always语句块实现二选一功能:
module fn_sw(
a,
b,
sel,
y
);
//定义端口属性
input a;
input b;
input sel;
output y;
reg y; //always语句块里赋值的变量需要是reg型
//always语句块
always@(a or b or sel) //@后面的(a or b or sel)是敏感变量,组合逻辑输入,里面的输入变量要写全
begin
if(sel==1)begin //if else语句 实现二选一
y<=a^b; //reg型变量赋值用带箭头的等号
end
else begin
y<=a&b; //reg型变量赋值用带箭头的等号
end
end
endmodule
测试代码testbench
//testbench of fn_sw
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
多路选择逻辑
模块fn_sw功能:
当sel为00时y是a和b的与;
当sel为01时Y是a和b的或;
当sel为10时y是a和b的异或;
当sel为11时y是a和b的同或;
Verilog代码:
使用case语句实现多路选择功能
`timescale 1ns/10ps
module fn_sw(
a,
b,
sel,
y
);
//定义端口属性
input a;
input b;
input sel;
output y;
reg y; //always语句块里赋值的变量需要是reg型
//always语句块
always@(a or b or sel)
begin
case(sel) //case语句块
2'b00:begin y<=a&b;end //2'b指的是2bit变量
2'b01:begin y<=a|b;end
2'b10:begin y<=a^b;end
2'b11:begin y<=~(a^b);end
endcase
end
endmodule
测试代码testbench
//-----testbench of fn_sw_4
module fn_sw_4_tb;
reg[3:0] absel;
wire y;
fn_sw_4 fn_sw_4(
.a(absel[0]),
.b(absel[1]),
.sel(absel[3:2]),
.y(y)
);
intial begin
absel<=0;//absel赋初值
#200 $stop;//过200ns结束Verilog系统任务,仿真结束
end
always #10 absel<=absel+1;//每过10ns对absel进行加一
//always #遍历逻辑值
endmodule