关于FPGA的打两拍防止复位问题?
比如下面的例子
module add(
input clk ,clr ,
input [7:0]a ,
output [8:0]b
);
////////////////////////////////////////////
reg [7:0]a_f ,a_ff ; // 1
always @(posedge clk or posedge rst)
begin
if (rst)
begin
a_f <= 8'b0000_0000 ;
a_ff <= 8'b0000_0000 ;
end
else
begin
a_f <= a ;
a_ff <= a_f ;
end
end
///////////////////////////
reg [7:0]a1_f ,a1_ff ; //2
always @(posedge clk or posedge rst)
begin
if (clr)
a1_f <= 8'b0000-0000 ;
else
a1_f <= a ;
end
always @(posedge clk )
a2_f <= a1_f ;
///////////////////////
关于以上两种打拍方法,唯一的不同是 第二种的 FF没有复位端口,
我觉得这样就会省略掉了复位信号,减少了连线,而且可以实现一样的功能,所以第二种比第一种要好 ,
大家觉的呢?
关于FPGA的打两拍防止复位问题?
谁说的可以打两拍避免复位问题?
多路信号打N拍都没有用。
对不起啊,我说错了,是不同时钟域,由低频到高频防止亚稳态的问题,可以说一下上面两段代码,那段比较好吗?
我喜欢第一种,,,,,,,,,,,新手
呵呵,我直到现在也想不明白呢,不过就按照第一种来写了,
本人认为:方案1做好,他是统一的复位方案
方案2说明:a在不同模块采用了两种不同复位方式,对综合不利,b,统一个芯片设计最好用一种复位方案,也就是你把方案1改为同步复位也可以。c,补充一点:FPGA推荐同步复位,ASIC设计推荐异步复位
无论fpga还是asic,并没有特别推荐哪种复位方式。
具体采用哪种复位方式,首先取决于你的系统时钟和复位方案,如果你的
系统要求必须先有时钟,然后再有复位,那么
always@(posedge clk)
if(rst) ....
else .....
这种较好。如果是要求先复位后给时钟,那么
always@(posedge clk or negedge rst_n)
这种较好。
另外,就小编说的:
always@(posedge clk)
a<= aa;
类似这种,是不推荐的coding style,为什么呢?需要考虑实际的DFF器件,这是完全不一定可以节省面积的写法。
这个和库的相关的,如果库里有这种没有clr,set端的、专门优化过的DFF,那么没问题会少一些逻辑,但很可能是
仅少了高扇出网络里的一些buf。
如果库里没有,那么就不会节省rst。因为rst端会接到固定电平,或者做到D端的逻辑里面去。
这个就成了和具体工艺库相关的code了,这是可移植code严重不推荐的。
任何verilog code,都不能想当然,因为你在搭器件,不能想当然。如果想确切的知道
这东西会是什么样子,请写个简单的module,然后进行综合,看看到底是什么样子的逻辑。
但是我用synplify综合出来后,第二种的第2个FF的复位端口没有连线,这是不是说如果是异步操作可以这样呢?
如果是ASic,那么是不是和工艺库有关呢? 但是在fpga中的DFF都有一个置位和复位端口,那么是不是可以减少资源使用呢?因为这个必须要采用异步复位的,
7楼正解。
ASIC和项目用的库是有很大关系的,不能想当然的写。
至于FPGA,看厂家,ALTERA是推荐异步复位的。如果是XILINX,异步复位同步释放,写法上建议你a_f和a_ff都不要复位,这样可以省route的资源,他们建议的是能不复位就不复位。
长见识
不使用复位就能正常工作的电路才是好电路
