verilog fpga 中复位电路的问题

number007cool 2020-05-26 10:35:02
fpga 程序在上电的时候运行结果出现异常,怀疑复位有问题, 现在探讨一下以下几种复位的情况:


1、是采用异步复位还是同步复位好

2、异步复位的同步是否更好, 具体如下



reg r_rst_in_pre;
reg r_rst_in_sync;

always @(posedge i_clk or negedge i_rst_n)
begin

if(!i_rst_n)
begin

r_rst_in_pre <= 1'b0;
r_rst_in_sync <= 1'b0;
end
else
begin
r_rst_in_pre <= 1'b1;
r_rst_in_sync <= r_rst_in_pre;
end


end

assign o_rst_f = r_rst_in_sync;
...全文
446 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
number007cool 2020-06-02
  • 打赏
  • 举报
回复
引用 8 楼 yuanxingren1 的回复:
最好先确定一下你的复位信号,fpga逻辑启动后复位信号是不是有一个低电平,
让这两个语句有效
r_rst_cnt <= 32'd0;

o_rst <= 1'b0;
其次,在声明reg时候,
reg r_rst_in_pre=0;
reg r_rst_in_sync=0;
初值赋值为0;因为有些寄存器上电并不一定都是0;上电电平跟着芯片、编译工具有关。
声明的时候赋值为0? c里面才有这种操作吧? 我一般是在复位里面给寄存器清0的
yuanxingren1 2020-05-31
  • 打赏
  • 举报
回复
最好先确定一下你的复位信号,fpga逻辑启动后复位信号是不是有一个低电平,
让这两个语句有效
r_rst_cnt <= 32'd0;

o_rst <= 1'b0;
其次,在声明reg时候,
reg r_rst_in_pre=0;
reg r_rst_in_sync=0;
初值赋值为0;因为有些寄存器上电并不一定都是0;上电电平跟着芯片、编译工具有关。
老皮芽子 2020-05-26
  • 打赏
  • 举报
回复
这得查看具体的原理图电源供电部分。要看FPGA的ac/dc手册,看芯片的上电顺序和你们设计的是否一致。与verilog 没啥关系。还有可以飞一个专用的复位芯片,看是不是 RC复位电路问题。这种偶然几率的毛病不好定位。反复开关机多做测试,能找到故障出现的规律,能较容易的重现故障再去分析原因。
number007cool 2020-05-26
  • 打赏
  • 举报
回复
fpga电压供电顺序, 具体是哪里, 我都是复位初始化,初始化完毕后立马运行。
老皮芽子 2020-05-26
  • 打赏
  • 举报
回复
这样也算是异步复位同步化。逻辑上看没啥问题。 上电异常,可能是其他硬件原因,比如FPGA电压供电顺序等。
number007cool 2020-05-26
  • 打赏
  • 举报
回复
i_rst_n 来源于硬件电路输入脚, 硬件上采用的是普通的RC复位
number007cool 2020-05-26
  • 打赏
  • 举报
回复
引用 1 楼 qq_708907433 的回复:
同步、异步复位的优缺点网上有很多介绍,我就不再重复了。 1:加电产生的硬复位,复位时间长,远大于时钟周期,同步、异步复位都行。我一般采用同步方式。 2:用逻辑产生的控制脉冲去频繁复位控制模块,采用异步方式可能会出现不稳定?(可能是毛刺),时钟速率上不去等毛病,用你这样写的异步同步复位就很好。比如我在做图形视频处理中的帧脉冲常用来复位链路上的模块,单纯采用异步、同步复位,在时钟速率高时会出现图像抖动的现象,采用异步同步方式就没问题了。 3:在实时控制要求高的地方,可以采用异步复位,当然异步复位脉冲宽度要足够宽。
上面那段异步复位的同步是照着书上敲的。 我实际应用中不是这样复位的, 自己diy的, 不知道算哪种复位, 也不清楚是不是这个复位,导致小概率(半个月出一次的样子)程序上电运行异常 具体逻辑如下:
always @(posedge i_clk or negedge i_rst_n)
begin
	if(!i_rst_n)
	begin
		r_rst_cnt <= 32'd0;
		
		o_rst <= 1'b0;
		 
		
	end
	else
	begin
		if(r_rst_cnt == 32'd3000)
		begin
			o_rst <= 1'b1;
			 
		end
		else
		begin
			r_rst_cnt <= r_rst_cnt + 32'd1;
		end
	
	end
end
begin

end
老皮芽子 2020-05-26
  • 打赏
  • 举报
回复
同步、异步复位的优缺点网上有很多介绍,我就不再重复了。 1:加电产生的硬复位,复位时间长,远大于时钟周期,同步、异步复位都行。我一般采用同步方式。 2:用逻辑产生的控制脉冲去频繁复位控制模块,采用异步方式可能会出现不稳定?(可能是毛刺),时钟速率上不去等毛病,用你这样写的异步同步复位就很好。比如我在做图形视频处理中的帧脉冲常用来复位链路上的模块,单纯采用异步、同步复位,在时钟速率高时会出现图像抖动的现象,采用异步同步方式就没问题了。 3:在实时控制要求高的地方,可以采用异步复位,当然异步复位脉冲宽度要足够宽。
number007cool 2020-05-26
  • 打赏
  • 举报
回复
引用 6 楼 qq_708907433 的回复:
这得查看具体的原理图电源供电部分。要看FPGA的ac/dc手册,看芯片的上电顺序和你们设计的是否一致。与verilog 没啥关系。还有可以飞一个专用的复位芯片,看是不是 RC复位电路问题。这种偶然几率的毛病不好定位。反复开关机多做测试,能找到故障出现的规律,能较容易的重现故障再去分析原因。
有的时候反复上电一天都没有问题 有的时候用着用着就出现一次

6,127

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧