flipchip 发表于 2010-7-26 15:24:08

被verilog 的信号敏感表弄有些糊涂了

在下最近才开始接触verilog,边工作边学习,看书的时候还觉得比较好理解,可是一动手写代码,推敲起来就发现有些地方比较难理解了。比如,最近就被一个简单的带异步清零的D触发器的代码弄糊涂了。参考书上是这么写的:

module dff(clk,d,clr,q)
input clk,d,clr;
output q;
reg q;
always @(posedge clk or negedge clr)
begin
if(!clr) q<=0;
else q<=d;
end
endmodule

注意看其信号敏感表,clk是上升沿触发,这个好理解。可是clr也是上升沿触发就不好理解了。按照我们的理解,异步复位信号应该是电平敏感的,而不是上升沿敏感的。我曾经尝试着把信号敏感表写成 always @(posedge clk or clr)进行综合,可是报错。 现在真有点糊涂了,上面的写法,其本意很明白clr应该是对电平敏感的异步复位信号,即如果clr一直保持低电平,那么q会一直保持0输出。可是按照字面的意思,clr又好象是边沿触发的。

我就有些好奇了,上述代码综合后,应用到芯片中去,如果clr一直保持低电平,而clk也来几个脉冲,究竟输出是变还是不变?

相信很多电工都能帮我解决上述疑问,多谢了!!!!!

zj_llh 发表于 2010-7-26 15:42:28

满足(posedge clk or negedge clr) 才会执行always下的内容,你可以理解一下

ibq3100 发表于 2010-7-26 16:04:43

如果clr一直保持高电平,而clk也来几个脉冲,究竟输出是变还是不变?
-----------------------------------------------------------------
q<=0;

flipchip 发表于 2010-7-26 16:08:26

to zj_llh:

   多谢回复。我的疑问是,如果是组合逻辑电路,输入是电平敏感的,信号敏感表一般会写成always @(a,b,...);的形式。

   而在同步电路中,复位信号也是电平敏感,而不是边沿敏感的,却为什么要写成边沿敏感的形式。

justsun 发表于 2010-7-26 19:03:25

always @(posedge clk or negedge clr)
begin
if(!clr) q<=0;
else q<=d;
end
endmodule

这个是clk上升沿和clr下降沿都触发这个语句,就是说不管时钟怎么样,只要检测到clr的下降沿,并且clr==0,D触发器清零。
如果变成always @(posedge clk or clr) 时钟上升沿和clr触发,当clr变化的时候不管时钟怎么样,都执行always,如果这样的话,当clr开始是0变到1的时候,就是Q<=D;CLR的变化引起了不想要的输出,这应该是自己不希望的看到的结果吧。

simplorer 发表于 2010-8-2 16:42:04

回复【3楼】flipchip
to zj_llh:
   多谢回复。我的疑问是,如果是组合逻辑电路,输入是电平敏感的,信号敏感表一般会写成always @(a,b,...);的形式。

   而在同步电路中,复位信号也是电平敏感,而不是边沿敏感的,却为什么要写成边沿敏感的形式。
-----------------------------------------------------------------------

你应该首先理解什么是同步电路,什么是异步电路,所谓同步电路是与一个时钟联系在一起的,当然时钟可能不止一个,这还存在跨时钟域的问题,更加复杂。
always @(a,b,...)这种形式是异步电路,时序约束不严的话很容易出现毛刺,而同步电路可以解决这个问题,建议楼主先理解同步与异步的区别。

yvhksovo 发表于 2010-8-2 17:27:28

回复【5楼】simplorer
-----------------------------------------------------------------------

就是就是.边沿触发的就是同步的,电平触发的就是异步的,我是这么理解的.
另外,你说报错的原因是:不支持同时电平触发和边沿触发.

wanwzy 发表于 2010-8-2 22:35:34

呵呵,一个很经典的问题,学习了

bone 发表于 2010-8-3 17:55:23

这是异步复位电路的写法啊,如果是同步复位,就是:

always @(posedge clk)
begin
if(!clr) q<=0;
else q<=d;
end
endmodule
页: [1]
查看完整版本: 被verilog 的信号敏感表弄有些糊涂了