冰的verilog解析
阿小龟爱吃花生酱QwQ
2026年03月11日 23:37

(开始前先叠个甲,本人是c++信息学竞赛生,对于电路这一块只能是略有涉猎,部分资料参考了百科,我尽我所能地去解释了,欢迎大佬来指正错误)

前两行include的意思是导入库文件,代码的库文件用了模拟电路和常用物理常数的库文件

module类似于一个函数,triode是函数名,代表了三极管,函数有三个值(p,g,k),p,g,k对应了阳极,栅极,阴级(图中也有对应)

最后一行代码endmodule意思是这一串定义结束(triode的定义看后面)

(图片传不上去了,只能用文字了)

include "disciplines.vams"

include "constants.vams"

module triode (P, g, k);

electrical p, g, k;

parameter real mu = 100;

parameter real kg1 = 1060;

parameter real kp = 600;

parameter real kvb = 300;

parameter real ex = 1.5;

real vpk, vgk, E1, ipk;

analog begin

vpk=V(p,k);

vgk=V(g,k);

E1 = vpk / kp In(1 + exp(kp (1/mu + vgk / sqrt(kvb + vpk*vpk))));

if (E1>0) begin

ipk = (pow(E1, ex) / kg1) * 2;

end else

beginipk = 0;

end

I(p,k)<+ ipk;

end

endmodule

这一块代码前两行导入库文件与前文作用相似,不再赘述

第三行这里定义了上一串代码的函数triode(p,g,k)

第四行到最后一行是函数的内容,第四行electrical p,g,k是定义了电学类型的节点,相等于可以记录电压和电流,第五到九行是定义了不同类似于c++变量的东西,其中

mu代表放大系数,影响栅极U对阳极I的控制能力。

kg1是与电流大小相关的比例系数。

kp是与阳极电压相关的系数,影响阳极电压对电流的系数

kvb是与栅极电压弯曲效应相关的系数(kvb这个着实是不太了解,欢迎大佬补充)

ex应该是I的指数

下面定义的变量含义为:

vpk是阳极电压

vgk是栅极电压

E1是有效电压

ipk是阳极电流

后面使用 V(函数给vpk和vgk赋值,V函数是获取端口之间的电压差,V(p, k) 返回阳极对于阴极的电压,V(g, k) 返回栅极对于阴极的电压

然后这个公式 E1 = vpk / kp ln(1 + exp(kp (1/mu + vgk / sqrt(kvb + vpk*vpk))))是在描述描述三极管在不同工作区域的特性(关于这个公式部分资料来源于百科,可能不准确,欢迎大佬补充)sqrt(kvb + vpk*vpk):是一个与阳极电压相关的项,用于避免在 vpk 接近零时出现数值问题,并模拟阳极电压对栅极有效控制的影响。1/mu + vgk / sqrt(...):组合栅极电压和阳极电压的影响,1/mu 是当栅压为零时的偏置项,exp(...) 和 ln(1+exp(...)) 的组合实现了平滑的“类二极管”开关特性,当内部参数较大时近似为线性(或幂律)区域,最后乘以 vpk/kp 使 E1 具有电压量纲,并受阳极电压调制。

最后的

if (E1 > 0) begin

ipk = (pow(E1, ex) / kg1) * 2;

end else begin

ipk = 0;

end

通过判断E1 的正负决定阳极电流,如果 E1 > 0,电流 ipk 按 E1 的 ex 次幂计算,除以 kg1 并乘以 2,否则,电流为零,模拟截止区。这里 pow(E1, ex) 是幂函数,ex是指数

I(p, k) <+ ipk 表示在阳极 p 和阴极 k 之间注入大小为 ipk 的电流

该段代码描述了三极管的工作原理

module and_gate(

input wire a,

input wire b,

output wire y

);

assign y= a & b;

endmodule

这一段输入了a和b,输出了y,y是a和b与运算的结果(也就是a&b),与运算的原理是同为高电平就是true,否则是false

这一段应该是与门

module FlipFlop (

input wire a,

input wire b,

input wire B,

output reg T = 1'b0,

output wire T_n

);

always @(negedge a or negedge b or negedge B) begin

if (!a)

T <= 1'b0;

else if (!b)

T <= 1'b1;

else if (!B)

T <= ~T;

end

assign T_n = ~T;

endmodule

这一段输入了a,b,B,输出了reg和wire

(always部分参考百科资料)

如果 a 为低电平(!a 为真),将 T 非阻塞赋值为 1'b0。这相当于异步清零(复位)。

否则如果 b 为低电平,将 T 赋值为 1'b1。这相当于异步置位。

否则如果 B 为低电平,将 T 取反(~T),即翻转。

assign T_n = ~T将 T_n 始终赋值为 T 的逻辑非,

这一串有可能是构建分频器、计数器或状态机中的异步控制单元。