从RTL视图到Verilog语言-转可乐豆原创

时间:2021-01-25 20:59:44

从RTL视图到Verilog语言

曾经听过某位大牛都说:“当你的学习FPGA到一个境界的时候,你看到的硬件描述语言,将不再是单纯的语言,而是由一个个逻辑门组成的电路图,一旦达到这个境界,方能把代码写到极致!”

笔者是多么希望达到这种境界啊~~,可这种境界给笔者的感觉是那么的虚无缥缈。

前段时间笔者写了一篇名叫《关于FPGA(verilog)电平检测模块的易错点分析》的博客。我仔细看了看verilog对应的RTL视图,又将RTL视图与verilog对比,突然间略有感悟。

首先奉上笔者亲手绘制的逻辑图,呵呵~~请原谅它的丑陋。读者能从图直接想象对应出Verilog吗?

从RTL视图到Verilog语言-转可乐豆原创

图中虚线左边:有一个输入A端口,输入时钟,复位信号和一个D触发器。

图中虚线右边:有两个非门和两个与门,和两个输出端口。

组合逻辑的输出与输入直接相关,时序逻辑的输出和原有状态也有关。

那么左边图就是我们常常所说的时序逻辑,而右边图就是组合逻辑。

先看看右边的视图,看看能不能把它想想成verilog,咦,似乎不难——不就是几个个输入经过几个非门和与门嘛。假设输入就叫F1和F2。

那么对图右边视图的上部分图而言:

wire  neg_edge  =  !F1 & F2;

那么对图右边视图的上部分图而言:

wire  pos_edge  =  F1 & !F2;

再看看左边的时序逻辑视图,我们发现F1和F2时序上是有关系的,F1与D触发器的输入直接相连,而F2与D触发器的输出直接相连。而对于D触发器而言,从输入到输出,从启动沿,到锁存沿。

F1和F2所间隔的正好是一个时钟周期(不考虑物理上的延时)。

好的,F1和F2的关系,我们也发现了。现在试着能不能根据左边的时序逻辑视图,写成Verilog时序逻辑。试试看,似乎也不难。

always @(posedge  CLK)//时序逻辑肯定少不了时钟,对吧~

begin

F1  <=  A;   //F1与输入A端口直接相连

F2  <=  F1;  //F2与F1相隔一个时钟周期

end

最后,我们看看整张图,脑子中想象Verilog代码,结果出现了。

always @(posedge  CLK or negedge RSTn)

if(!RSTn) begin  F1 <= 1’b0 ; F2 <= 1’b0 ; end//加上一个异步复位

else

begin

F1  <=  A;   //F1与输入A端口直接相连

F2  <=  F1;  //F2与F1相隔一个时钟周期

end

wire  neg_edge  =  !F1 & F2;

wire  pos_edge  =  F1 & !F2;

现在给笔者的感觉,就是不需要在死记硬背这个电平检测模块,因为迷迷糊糊,笔者的脑袋里似乎浮现出一幅图,这幅图在指引这笔者如何写这个模块。

其实还有一个更好的记忆方法:

F1 Current State;F2 Previous State,

那么,!F1 & F2 == 1  就必须是之前值是1,现在值是0,那么检测的自然是下降沿。

同理: F1 & !F2 == 1 就必须是之前值是0,现在值是1,那么检测的自然是上升沿。

总结:从看到verilog就能反映出逻辑视图(RTL),笔者感觉很难,这需要大量经验的积累;反之,从看到逻辑视图就能反映出verilog,笔者感觉相对较易。如果我们先从容易的下手,慢慢的积累经验。说不定哪一天也能达到那位大牛所说的境界,哈哈~~

2013-11-12

——宋桓公