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