解法一:
`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