Verilog——多路选择器逻辑设计

二选一逻辑

模块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

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值