简要
使用if else语句实现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进行联合仿真,出现如下错误:
- 仿真时报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.*
- 根据打印信息,D貌似只进行了一次移位,随后一直保持0010不变。
在问题出现之初,便一直在思考如何改进,同时,也在寻求多方帮助,奈何笔者愚笨,加之并不想花费过多时间(~主要是花了心力还是没解决
.),故将此本人疑惑粘贴在这,希望各方大佬捞捞!!!
思考
-
在模块tb_mux4_1.v中,如何编写代码实现输入信号的真正随机性?笔者想采用枚举类型enum,故先去看相关知识啦~~~
-
如果对于以上问题,您有好的解决方法或思路,务必留下您宝贵的箴言!
未完待续.......