在这个项目中,将使用两个不同的 Verilog HDL 抽象级别(门级和行为级)来实现 4 对 1 多路复用器设计。需要注意的是,这里只采用逻辑综合,没有映射和拟合到 FPGA 中。一个人应该只修改模块内部来改变抽象级别;两种实现都将使用相同的测试平台。 4 对 1 多路复用器的门级实现如下所示。人们不应该认为原理图和 Verilog HDL 描述之间存在一对一的对应关系。
图1 4 对 1 多路复用器原理图
4 对 1 多路复用器的 Verilog 门级描述:
module four_to_one_mux(out,i0,i1,i2,i3)
output out;
input i0,i1,i2,i3,s1,s0;
//internal wires(nets)
wire s1n,s0n;
wire y0,y1,y2,y3;
//gate instantiation
not(s1n,s1);
not(s0n,s0);
and(y0,i0,s1n,s0n);
and(y1,i1,s1n,s0);
and(y2,i2,s1,s0n);
and(y3,i3,s1,s0);
or(out,y0,y1,y2,y3);
endmodule
4 对 1 多路复用器的 Verilog 数据流级别描述:***
module four_to_one_mux(out,i0,i1,i2,i3,s1,s0);
output out;
input i0,i1,i2,i3,s1,s0;
assign out = (~s1 & ~s0 & i0) | ( ~s1& ~s0 &i1) | (s1& ~s0& i3);
endmodule
4 对 1 多路复用器的 Verilog 测试平台:
module four_to_mux_TB;
// Inputs
reg i0; reg i1;
reg i2; reg i3;
reg s0; reg s1;
//Output
wire out;
// Instantiate the Unit Under Test(UUT)
four_to_one_mux uut(.out(out),.i0(i0),.i1(i1),.i2(i2),.i3(i3),.s1(s1),.s0(s0));
initial
begin
// Initialize Inputs
i0 = 0; i1 = 0; i2 = 0; i3 = 0; s1 = 0; s0 = 0;
//Wait 100ns for global reset to finish
#100;
//Add stimulus here
i0=1;i1=0;i2=1;i3=0;
#100 $display("i0=%b,i1=%b,i2=%b,i3=%b,",i0,i1,i2,i3);
s1=0;s0=0;
#100 $display("s1=%b,s0=%b,out=%b",s1,s0,out);
s1=0;s0=1;
#100 $display("s1=%b,s0=%b,out=%b",s1,s0,out);
s1=1;s0=0;
#100 $display("s1=%b,s0=%b,out=%b",s1,s0,out);
s1=1;s0=1;
#100 $display("s1=%b,s0=%b,out=%b",s1,s0,out);
end
endmodule