【Verilog - 组合逻辑 - 基础2】3. 是非门
全则必缺,极则必反《吕氏春秋·不苟论·博志》
是是非非谓之知,非是是非谓之愚《荀子·修身》
1.0 介绍
是非的辩证是人生中不可不面临的经历,同样,是门(缓冲器)与非门的应用是在数字电路里不可不学习的基础知识!
1.1 非门
非门就如同荀子所言的:“非是,是非,谓之愚”。
入 | 出 |
---|---|
0 | 1 |
1 | 0 |
在verilog,模拟的方法有三个。
1.1.1 非门 - 行为
module fei_xw(input jia, output yi);
assign yi = ~jia;
endmodule
~
就是非的功能。
1.1.2 非门 - 门
module fei_men(input jia, output yi);
not mynot(yi, jia);
endmodule
可以用Verilog自带的not(output out, input in)
来做模拟。
1.1.3 非门 - 电路
module fei_dl(input jia, output yi);
nmos(yi, 0, jia);
pmos(yi, 1, jia);
endmodule
可以用Verilog自带的nmos(inout drain, inout source, input gate)
和pmos(inout drain, inout source, input gate)
来做模拟。
在电路模拟时,1,0就代表高低电压。
1.2 缓冲器(是门)
缓冲器(是门)就是把能好好的把是非分辩的出来。就是说,是就是是,非就是非。不怪荀子曰:“是是,非非,谓之知(智慧)”。
入 | 出 |
---|---|
0 | 0 |
1 | 1 |
在verilog,模拟的方法有三个。
1.2.1 缓冲器 - 行为
module shi_xw(input jia, output yi);
assign yi = jia;
endmodule
可见,缓冲器在行为上就是一个单纯的连接而已。
1.2.2 缓冲器 - 门
module shi_men(input jia, output yi);
buf mybuf(yi, jia);
endmodule
可以用Verilog自带的buf(output out, input in)
来做模拟。
也可以这样模拟,
module shi_men(input jia, output yi);
wire zhong;
not not1(zhong, jia);
not not2(yi, zhong);
endmodule
module ceshi;
reg jia;
wire yi;
shi_men dut(jia, yi);
initial begin
jia = 1'b0;
#1;
$display("jia = %b, yi = %b", jia, yi);
$finish;
end
endmodule
1.2.3 缓冲器 - 电路
module shi_dl(input jia, output yi);
wire zhong;
nmos(zhong, 0, jia);
pmos(zhong, 1, jia);
nmos(yi, 0, jia);
pmos(yi, 1, jia);
endmodule
可见,缓冲器的电路模拟会更复杂一些,同常是用两个非门所构造的。
1.3 多个宽度的非门
1.3.1 非门 - 行为
module fei_xw #(parameter N = 1) (input [N-1:0] jia, output [N-1:0] yi);
assign yi = ~jia;
endmodule
module ceshi;
reg [5:0] jia;
wire [5:0] yi;
fei_xw #(6) dut(jia,yi);
initial begin
jia = 6'b100_101;
#1;
$display("jia = %b, yi = %b", jia, yi);
$finish;
end
endmodule
输出是,
liu2333hui@liu2333hui-PC:~/verilog/nihao$ epicsim fei_xw.v
jia = 100101, yi = 011010
1.3.2 非门 - 门
这里有一个小讨巧,得用systemverilog 里的generate
和for
语句。
module fei_xw #(parameter N = 1) (input [N-1:0] jia, output [N-1:0] yi);
genvar i;
generate
for (i = 0; i < N; i++) begin
not mynot(yi[i], jia[i]);
end
endgenerate
endmodule
module ceshi;
reg [5:0] jia;
wire [5:0] yi;
fei_xw #(6) dut(jia,yi);
initial begin
jia = 6'b100_101;
#1;
$display("jia = %b, yi = %b", jia, yi);
$finish;
end
endmodule
结果是一样的,
liu2333hui@liu2333hui-PC:~/verilog/nihao$ epicsim -g2005-sv fei_xw.sv
jia = 100101, yi = 011010
注意,这里需要加一个-g2005-sv
,代表我们现在在用systemverilog的语法了。
1.3.3 非门 - 电路
同样,可以用SystemVerilog来建模,
module fei_xw #(parameter N = 1) (input [N-1:0] jia, output [N-1:0] yi);
genvar i;
generate
for (i = 0; i < N; i++) begin
nmos(yi[i], 0, jia[i]);
pmos(yi[i], 1, jia[i]);
end
endgenerate
endmodule
module ceshi;
reg [5:0] jia;
wire [5:0] yi;
fei_xw #(6) dut(jia,yi);
initial begin
jia = 6'b100_101;
#1;
$display("jia = %b, yi = %b", jia, yi);
$finish;
end
endmodule
效果,
liu2333hui@liu2333hui-PC:~/verilog/nihao$ epicsim -g2005-sv fei_dl.sv
jia = 100101, yi = 011010
1.4 参考
[1] https://www.runoob.com/w3cnote/verilog2-level-modeling.html