请高手帮忙看一下我的verilog写的D触发器:

module asyn_d (
clk,
clr,
set,
d,
q
);

//input signal
input clk;
input clr,set;
input d;

//output signal
output q;

//declare the type of data
reg q;

//logic relationship
always @(posedge clk or posedge clr or posedge set)
begin
if(clr) //if clr is high level,then reset 'q'
begin q <= 1'b0; end
else //if clr is loe level,then..
if(set)
begin q <=1'b1; end
else
begin q <= d; end
end
endmodule
功能仿真没问题,但时序仿真不对,请问是什么原因呢?code的问题吗……

说实话你的代码应该没问题,估计是你时序仿真的设置有问题吧,多搜下后仿得资料看看!
我以前从没用过异步清零和异步置1同时存在的情况,我用过一次,DC中提示出错,就再没用过。
我觉得最好不用。
补充说明:你的时序仿真应该是门级的仿真的是吧,我看的很多资料上说异步复位与异步置位不要同时有效,不知道你加的激励是不是同时的,因为功能仿真的时候编译器会有优先级,但是到了FPGA里面的D触发器不一定会存在优先级(猜的),所以建议你的激励可以改一下,将两个异步信号分开有效。
还有,对于一楼说的,我想说一点就是,一个always里面三个posedge没关系,既然到了时序仿真了,就说明综合已经过了,那就可以的。异步清0和同步置位的编写就是应该这样写的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-11
我个人觉得你的清零 clr和 置位 set,是电平触发的,而你在该程序中,采用的是时钟沿触发
而且还是posedge上升沿触发,
修改:应该只需要时钟是上升沿触发,而clr和set用电平触发
只需将always @(posedge clk or posedge clr or posedge set)改成always @(posedge clk )应该就没什么问题了追问

谢谢你的回答,我还想问一下,如果将always @(posedge clk or posedge clr or posedge set)改成always @(posedge clk ),那不就成了 同步的吗?异步的话,信号不是要在always的敏感列表中出现吗?请多指教……

追答

这是一个时序电路,只要有一个时钟控制就可以了,只有在时钟沿到来时,才可以触发这条语句,与clr和set这两个电平触发没关系的,也就是说不存在不同步的问题,如果是异步的话使用negedge,如果你想异步清零,这样写就可以了always @ (posedge clk or negedge clr)

第2个回答  2011-03-12
还有你这个是异步清零和设值。代码应该没有问题
问题是你想要的时序是什么样的时序?可以按照你想要的时序修改啊。
第3个回答  2011-03-11
fd
第4个回答  2011-03-14
1楼都说了 没什么可加的了
相似回答