目录
- 1. 时钟
- 2. 复位
- 2.1. 异步复位 同步释放
- 2.2. Xilinx FPGA复位设计
- 基于PLL锁定(locked)复位设计
 
 
- 3. 上电初始化
1. 时钟
2. 复位
FPGA中复位设计总结
深入理解复位—同步复位,异步复位,异步复位同步释放(含多时钟域)
-  同步复位:优点是时序简单,不受毛刺影响。缺点是大部分逻辑器件库内的DFF都只有异步复位端口,同步复位需要额外加入组合逻辑,整个芯片设计会消耗大量组合逻辑资源。 
-  异步复位:优点是实现简单,无需额外组合逻辑,复位启动不受时钟影响。缺点是复位释放的时候,时钟若采样复位信号跳变时刻,容易出现亚稳态。 
例如
always@(posedge clk or negedge rst_n) begin
	if(!rst_n) 
     	b <= 1'b0;
 	else 
     	b <= a;
end

因此为了保证全局复位不消耗太多组合逻辑,也能保证避免异步复位释放导致的亚稳态,如何作?
2.1. 异步复位 同步释放
- 异步复位,同步释放:复位信号到来的时候不受时钟信号影响,复位信号释放的时候受到时钟信号的同步。
例如下面代码中rst_sync_n就实现了异步置0、同步置1
// rst_async_n为异步复位信号
always@(posedge clk or negedge rst_async_n) begin
   if(!rst_async_n) begin
       rst_s1     <= 1'b0;
       rst_sync_n <= 1'b0;
   end
   else begin
       rst_s1     <= 1'b1;
       rst_sync_n <= rst_s1;
   end
end
  //由于rst_sync_n复位启动还是异步的,所以必须加入敏感列表中
     always@(posedge clk or negedge rst_sync_n) begin
         if (!rst_sync_n) 
         	dout <= 1'b0;
         else          
         	dout <= din;
     end
2.2. Xilinx FPGA复位设计
Xilinx FPGA异步复位同步释放——同步后的复位当作同步复位还是异步复位?【FPGA探索者】
Vivado寄存器初始值问题
基于PLL锁定(locked)复位设计
无论是PLL产生的时钟还是外部输入的时钟,同步复位信号按如下产生。注意reg a=1;表示上电后该值为1,复位后可能为其他值
`timescale 1ns / 1ps
module clk_rst_gen(
	input clk_in,
	
	input clk_in2,					
	output clk_a,					
	output clk_b,					
	output clk_c,					
	output clk_d,					
	
	output reg rst_in2,					
	output reg rst_a,					
	output reg rst_b,				
	output reg rst_c,					
	output reg rst_d,					
	);
	
	//--------------------------------------------------------------------------------------------------------
	// pll
	//--------------------------------------------------------------------------------------------------------
	wire locked;
	
	pll		pll(
		.clk_in1		( clk_in	),
		.clk_out1       ( clk_a   	),
		.clk_out2       ( clk_b   	),
		.clk_out3       ( clk_c 	),
		.clk_out4       ( clk_d   	),
		.locked         ( locked    )
	);
	
	//--------------------------------------------------------------------------------------------------------
	// locked_temp attends to eliminate jitter of signal locked
	//--------------------------------------------------------------------------------------------------------
	reg	[15:0]	cnt;
	
	always@(posedge clk_in or negedge locked) begin
		if(!locked)
			cnt <= 0;
		else if(cnt[15])
			cnt <= cnt;
		else
			cnt <= cnt + 1;
	end
	
	wire locked_temp = cnt[15];
	
	//--------------------------------------------------------------------------------------------------------
	// async reset and sync release
	//--------------------------------------------------------------------------------------------------------
	reg 		rst_in2_d1 = 1;					
	reg 		rst_in2_d2 = 1;					
	
	always@(posedge clk_in2 or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_in2_d1 <= 1'b1;
			rst_in2_d2 <= 1'b1;
			rst_in2    <= 1'b1;
		end
		else begin	
			rst_in2_d1 <= 1'b0;
			rst_in2_d2 <= rst_in2_d1;
			rst_in2    <= rst_in2_d2;
		end
	end
	
	reg 		rst_a_d1 = 1;					
	reg 		rst_a_d2 = 1;					
	
	always@(posedge clk_a or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_a_d1 <= 1'b1;
			rst_a_d2 <= 1'b1;
			rst_a    <= 1'b1;
		end
		else begin	
			rst_a_d1 <= 1'b0;
			rst_a_d2 <= rst_a_d1;
			rst_a    <= rst_a_d2;
		end
	end
	
	reg 		rst_b_d1 = 1;					
	reg 		rst_b_d2 = 1;					
	
	always@(posedge clk_b or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_b_d1 <= 1'b1;
			rst_b_d2 <= 1'b1;
			rst_b    <= 1'b1;
		end
		else begin	
			rst_b_d1 <= 1'b0;
			rst_b_d2 <= rst_b_d1;
			rst_b    <= rst_b_d2;
		end
	end
	
	reg 		rst_c_d1 = 1;					
	reg 		rst_c_d2 = 1;					
	
	always@(posedge clk_c or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_c_d1 <= 1'b1;
			rst_c_d2 <= 1'b1;
			rst_c    <= 1'b1;
		end
		else begin	
			rst_c_d1 <= 1'b0;
			rst_c_d2 <= rst_c_d1;
			rst_c    <= rst_c_d2;
		end
	end
	
	reg 		rst_d_d1 = 1;					
	reg 		rst_d_d2 = 1;					
	
	always@(posedge clk_d or negedge locked_temp) begin
		if(!locked_temp) begin
			rst_d_d1 <= 1'b1;
			rst_d_d2 <= 1'b1;
			rst_d    <= 1'b1;
		end
		else begin	
			rst_d_d1 <= 1'b0;
			rst_d_d2 <= rst_d_d1;
			rst_d    <= rst_d_d2;
		end
	end
	
endmodule



![[代码复现]Self-Attentive Sequential Recommendation(ing)](https://img-blog.csdnimg.cn/direct/196fac48d6b848fba9abf60f8c7b44bd.png)















