牛客刷题一<四选一多路器>

题目:四选一多路器_牛客题霸_牛客网

解法一:

`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
//*************code***********//
   reg [1:0]  mux_out1;

    always@(*)
        begin
            case(sel)
                2'b00:mux_out1 = d3;
                2'b01:mux_out1 = d2;
                2'b10:mux_out1 = d1;
                2'b11:mux_out1 = d0;
                default:mux_out1 = d3;
            endcase
        end
                
assign mux_out = mux_out1;

//*************code***********//
endmodule

易出错的地方:容易写成2'b0,2'b1,2'b2,2'b3,但可以写成2'd0,2'd1,2'd2,2'd3,如下:

解法二:

`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
//*************code***********//
   reg [1:0]  mux_out1;

    always@(*)
        begin
            case(sel)
                2'd0:mux_out1 = d3;
                2'd1:mux_out1 = d2;
                2'd2:mux_out1 = d1;
                2'd3:mux_out1 = d0;
                default:mux_out1 = d3;
            endcase
        end
                
assign mux_out = mux_out1;

//*************code***********//
endmodule

注意:.always模块内被赋值的变量必须是reg型,赋的值类型随意,因此mux_out1必须是reg类型,而d0,d1,d2,d3类型无所谓。

解法三:

`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
    //assign mux_out = sel[0]?(sel[1]?d0:d2):(sel[1]?d1:d3);
    assign mux_out = sel[1]?(sel[0]?d0:d1):(sel[0]?d2:d3);
    //先判断高位需保证低位相同,先判断低位,则保证高位相同
endmodule
//通过2选1选择器进行判断,需要三个这种结构

此种方法是通过2选1选择器进行判断,先判断高位需保证低位相同,先判断低位,则保证高位相同。d0、d2高位不同,d1、d3高位不同,d0、d1低位不同,d2、d3低位不同

解法四:

`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
wire    [1:0]    sel_1,sel_2;

assign sel_1 = (sel[0]) ? d2 : d3;

assign sel_2 = (sel[0]) ? d0 : d1;

assign mux_out = (sel[1]) ? sel_2 :sel_1;
  
endmodule
//通过2选1选择器进行判断,需要三个这种结构

笔记:

Verilog Tips

1.module里定义时自动为wire型变量

2.always的@内变量设置为*可以自动匹配输入

3.always模块内被赋值的变量必须是reg型,赋的值类型随意

4.assign时被赋值的变量必须是wire型,赋的值类型随意

5输入输出都是wire型,直接放弃always块

Testbench Tips

1.testbench里需要根据Verilog里的输入输出重新定义变量,再实例化设计模块

2.initial作为初始化模块,被初始化的变量必须是reg型

Testbench

`timescale 1ns/1ns

module testbench();
	reg clk=0;
	//always #5 clk = ~clk;  // Create clock with period=10

    //initial作为初始化模块,被初始化的变量必须是reg型
    reg  [1:0] d0,d1,d2,d3,sel;
    
// A testbench
initial begin  
    $dumpfile("out.vcd");     //这两个一定要在initial中写,否则编译无法通过,
    $dumpvars(0, testbench);  //会无法生成out.vcd文件
    d0 = 3;
    d1 = 0;
    d2 = 1;
    d3 = 2;
    sel = 0;
    #5 sel = 1;
    #5 sel = 2;
end  
mux4_1 mux4_1_inst
(
    .d1       (d1),
    .d2       (d2),
    .d3       (d3),
    .d0       (d0),
    .sel      (sel),
    .mux_out  (mux_out)
);    
      
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值