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


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

    解法一:

    1. `timescale 1ns/1ns
    2. module mux4_1(
    3. input [1:0]d1,d2,d3,d0,
    4. input [1:0]sel,
    5. output[1:0]mux_out
    6. );
    7. //*************code***********//
    8. reg [1:0] mux_out1;
    9. always@(*)
    10. begin
    11. case(sel)
    12. 2'b00:mux_out1 = d3;
    13. 2'b01:mux_out1 = d2;
    14. 2'b10:mux_out1 = d1;
    15. 2'b11:mux_out1 = d0;
    16. default:mux_out1 = d3;
    17. endcase
    18. end
    19. assign mux_out = mux_out1;
    20. //*************code***********//
    21. endmodule

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

    解法二:

    1. `timescale 1ns/1ns
    2. module mux4_1(
    3. input [1:0]d1,d2,d3,d0,
    4. input [1:0]sel,
    5. output[1:0]mux_out
    6. );
    7. //*************code***********//
    8. reg [1:0] mux_out1;
    9. always@(*)
    10. begin
    11. case(sel)
    12. 2'd0:mux_out1 = d3;
    13. 2'd1:mux_out1 = d2;
    14. 2'd2:mux_out1 = d1;
    15. 2'd3:mux_out1 = d0;
    16. default:mux_out1 = d3;
    17. endcase
    18. end
    19. assign mux_out = mux_out1;
    20. //*************code***********//
    21. endmodule

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

    解法三:

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

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

    解法四:

    1. `timescale 1ns/1ns
    2. module mux4_1(
    3. input [1:0]d1,d2,d3,d0,
    4. input [1:0]sel,
    5. output[1:0]mux_out
    6. );
    7. wire [1:0] sel_1,sel_2;
    8. assign sel_1 = (sel[0]) ? d2 : d3;
    9. assign sel_2 = (sel[0]) ? d0 : d1;
    10. assign mux_out = (sel[1]) ? sel_2 :sel_1;
    11. endmodule
    12. //通过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

    1. `timescale 1ns/1ns
    2. module testbench();
    3. reg clk=0;
    4. //always #5 clk = ~clk; // Create clock with period=10
    5. //initial作为初始化模块,被初始化的变量必须是reg型
    6. reg [1:0] d0,d1,d2,d3,sel;
    7. // A testbench
    8. initial begin
    9. $dumpfile("out.vcd"); //这两个一定要在initial中写,否则编译无法通过,
    10. $dumpvars(0, testbench); //会无法生成out.vcd文件
    11. d0 = 3;
    12. d1 = 0;
    13. d2 = 1;
    14. d3 = 2;
    15. sel = 0;
    16. #5 sel = 1;
    17. #5 sel = 2;
    18. end
    19. mux4_1 mux4_1_inst
    20. (
    21. .d1 (d1),
    22. .d2 (d2),
    23. .d3 (d3),
    24. .d0 (d0),
    25. .sel (sel),
    26. .mux_out (mux_out)
    27. );
    28. endmodule

  • 相关阅读:
    SV--对象拷贝、参数化的类
    Unity读书系列《Unity3D游戏开发》——脚本(一)
    人工智能 | ShowMeAI资讯日报 #2022.06.22
    048_末晨曦Vue技术_处理边界情况之使用$root访问根实例
    [oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态
    MySQL 创建用户并设置权限
    客户端简单实现断路器
    一种基于光强传输方程的散射成像相位恢复仿真研究
    数据预处理
    MongoDB的日志目录被删除了,导致无法启动:(code=exited, status=1/FAILURE)
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126332053