X86 CPU Power Sequence控制之FPGA代劳

        本人最近心态异常平静,于是乎--->简单整理下这两年魔幻般的经历(咱从地道的搬砖人又回到了研究僧的灵笼中,装作不开心~)。

        注:转载本文章,请标明其来源。同时,此文章涉及的逻辑块代码仅供学习参考!!!谢谢配合!!!!!!!

        本文以intel Birch Stream平台为例,参考的Birch Stream PDG为Rev 0.7 版本,如若新版PDG在时序上有所变动,请以最新的PDG或EDG为准,谢谢配合。

第一节:服务器CPU时序的要求

        X86架构的服务器CPU含有多路电源轨,如常见的P3V3、P1V05、P0V9等。如整机方案使用的是Eagle Steam或之前的CPU,整个系统的电源时序会增加若干组关于PCH的电源轨。电源部分的常见分类有CPU核心电源、IO电源、总线电源、DIMM电源等,其上电时序和掉电时序必须满足平台的PDG或EDG的时序要求,如若不然,某些BUG可能就脱颖而出(狗头。毕竟咱自己给自己挖过坑,调试时出现各种奇葩问题,这台机器AC cycle跑不起来、那台产品触发保护机制……回忆当年,不争气的眼睛又进了沙子)。关于电源轨简称或命名的详细含义,请自学~

        话不多说,先贴图为证。

        1. Power Up Sequence 简略图(G3->S5->S0)

        2. Power Down Sequence简略图(S0->S5)

        3. 详细时序图

第二节:FPGA控制CPU的时序

        1.三段式状态机FSM

        整个核心的时序控制逻辑分为三部分,第一部分为状态转移逻辑;第二部分描述状态转移条件和规律;第三部分为输出控制逻辑。详细介绍如下:

        1.1 状态转移逻辑(时序逻辑)
//1	Sequential state transition 
always@( posedge i_sys_clk or negedge i_sys_rst_n)begin
	if(!i_sys_rst_n)
		r_current_state <= FSM_IDLE;
	else 
		r_current_state <= r_next_state ;
end
        1.2 状态转移条件和规律(组合逻辑)
//2	Combinational condition judgment 
always@(*) begin
	if(!i_sys_rst_n) begin
		w_delay_start  = 1'b1;
		w_delay_ms_cnt = 8'd49;
		w_timeout_cnt  = 8'd49;
	end
	else begin
		case(r_current_state)

			FSM_IDLE : begin	
				if(i_config_error || w_pwr_fault_flg)
					r_next_state = FSM_IDLE;
				else if(w_delay_ms_done) begin
					w_delay_start  = 1'b0;
					w_delay_ms_cnt = AUX_DELAY_G0;
					w_timeout_cnt  = TIMEOUT_COUNT;
					r_next_state   = FSM_AUX_G0_PWR_ON;
				end
				else 
					r_next_state = FSM_IDLE;
			end
			
			FSM_AUX_G0_PWR_ON : begin
				w_delay_start = 1'b1;
                // (power on timeout | power run down) & (~forced power on)
				if(w_pwr_fault_flg)	
					r_next_state = FSM_PWR_FAIL;
				else if((&i_aux_g0_pwr_pgd | i_forced_pwron) && w_delay_ms_done)begin
					w_delay_start  = 1'b0;
					w_delay_ms_cnt = AUX_DELAY_G1;
					w_timeout_cnt  = TIMEOUT_COUNT;
					r_next_state   = FSM_AUX_G1_PWR_ON;
				end
				else
					r_next_state = FSM_AUX_G0_PWR_ON;
			end
				
			FSM_AUX_G1_PWR_ON : begin
				w_delay_start  = 1'b1;
				if(w_pwr_fault_flg)										
					r_next_state = FSM_PWR_FAIL;
				else if((&i_aux_g1_pwr_pgd | i_forced_pwron) && w_delay_ms_done) begin
					w_delay_start  = 1'b0;
					w_timeout_cnt  = TIMEOUT_COUNT;
					w_delay_ms_cnt = (AUX_PWR_GROUP > 2) ? AUX_DELAY_G2	: RSMRST_DE
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值