关于使用VerilogHDL实现4选1数据选择器的简要分析和若干问题与思考

321 阅读2分钟

简要

使用if else语句实现4选1数据选择器的逻辑功能,模块简要图和真值表如下:

模块简要图

4选1真值表

分析

// mux4_1.v模块
module mux4_1(
input wire[3:0]  D,
input wire [1:0]  S,
output reg  Y
);
        
always@(*)
    if(S == 2'b00)
    Y = D[0];        
    else if(S == 2'b01)
    Y = D[1];
    else if(S == 2'b10)
    Y = D[2];
    else
    Y = D[3];
endmodule

`timescale 1ns/1ns
module tb_mux4_1();
reg [3:0] D;
reg [1:0] S;
wire Y;

initial
    begin
    D <= 4'b0001;
    S <= 2'b00;
    end
    
always@(*)
    if(D == 4'b0001)    //由于笔者纯纯小白,故采用逐步移位的方法,生成4个输入信号,暂不考虑其随机性
            D =  D<<1'b1;
    else if(D == 4'b0010)
            D =  D<<1'b1;
    else if(D == 4'b0100)
            D =  D<<1'b1;    
    else 
     D =   4'b0001;

always #10 S <= {$random} % 4;

  initial            //打印输入输出信息
    begin
    $timeformat(-9, 0, "ns", 6);
    $monitor("@time %t:D=%b S=%b Y=%b ",$time,D,S,Y);
    end

mux4_1 mux4_1_inst(
    .D(D),
    .S(S),
    .Y(Y)
);
endmodule

问题

笔者使用的是Quarutus II和Modelsim进行联合仿真,模块mux4_1.v编译通过,并无报错,可利用Modelsim进行联合仿真,出现如下错误:

仿真错误

  1. 仿真时报Warning: C:/iFPGA/mux4_1/quartus_prj/../sim/tb_mux4_1.v(14): (vlog-2182) 'D' might be read before written in always_comb or always @ block.*
  2. 根据打印信息,D貌似只进行了一次移位,随后一直保持0010不变。 在问题出现之初,便一直在思考如何改进,同时,也在寻求多方帮助,奈何笔者愚笨,加之并不想花费过多时间(~主要是花了心力还是没解决 .),故将此本人疑惑粘贴在这,希望各方大佬捞捞!!!

思考

  • 在模块tb_mux4_1.v中,如何编写代码实现输入信号的真正随机性?笔者想采用枚举类型enum,故先去看相关知识啦~~~

  • 如果对于以上问题,您有好的解决方法或思路,务必留下您宝贵的箴言!

                                                                              未完待续.......