从RTL视图到Verilog语言
曾经听过某位大牛都说:“当你的学习FPGA到一个境界的时候,你看到的硬件描述语言,将不再是单纯的语言,而是由一个个逻辑门组成的电路图,一旦达到这个境界,方能把代码写到极致!”
笔者是多么希望达到这种境界啊~~,可这种境界给笔者的感觉是那么的虚无缥缈。
前段时间笔者写了一篇名叫《关于FPGA(verilog)电平检测模块的易错点分析》的博客。我仔细看了看verilog对应的RTL视图,又将RTL视图与verilog对比,突然间略有感悟。
首先奉上笔者亲手绘制的逻辑图,呵呵~~请原谅它的丑陋。读者能从图直接想象对应出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
——宋桓公