被verilog 的信号敏感表弄有些糊涂了(转)
时间:10-02
整理:3721RD
点击:
在下最近才开始接触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也来几个脉冲,究竟输出是变还是不变?
相信很多电工都能帮我解决上述疑问,多谢了!
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也来几个脉冲,究竟输出是变还是不变?
相信很多电工都能帮我解决上述疑问,多谢了!
"按照我们的理解,异步复位信号应该是电平敏感的,而不是上升沿敏感的。"。你这个理解是错误的。那么这样就好理解了,对吧。
缺乏基本的数字逻辑概念,去看verilog是不会懂的。
verilog不是编程语言,是硬件描述语言。
verilog的代码风格必须严格遵守其硬件可实现的规则。
其实,你说的这段always代码对于clr一直为0的情况很好理解啊!对于每个clk的上升沿,always都会执行一次,而执行的正是if分支,即输出一直为0,对吧!
缺乏基本的数字逻辑概念,去看verilog是不会懂的。
verilog不是编程语言,是硬件描述语言。
verilog的代码风格必须严格遵守其硬件可实现的规则。
每个CLK边沿都会对CLR信号采样 根据采样值进行IF判断 SO 结果很正常的啊
异步复位就是电平复位,不要死扣verilog的语法。
always @(*)很好使;
always @(*)对组合逻辑很好使。
考试可能用用,平时找个好理解的写法就好
这是一个带异步清零的D触发器,不难理解,clr在下降沿时清零.
