1. 程式人生 > 其它 >常用FPGA功能塊記錄

常用FPGA功能塊記錄

//runing flag led
reg[23:0]led_count = 24'd0;
always @ (posedge clk_25m or negedge rst_n) begin
    if(~rst_n)begin
        led_count <= 24'd0;
        led <= 1'b0;
    end
    else if(led_count < 24'd12_50_00_00) begin
        led_count <= led_count + 1'b1;
    end
    else begin
        led_count 
<= 24'd0; led <= ~led; end end //Watch Dog(WTD) //25M clk 2s reset //state1:上電等待CPU啟動完成,僅在產品上電執行一次,上電覆位或外部系統復位或reboot復位完成後等待1min //state2:根據CPU配置開始看門狗計時,預設2s超時復位 //note:使能看門狗後如要禁用,先喂狗一次再進行禁用操作,防止在看門狗超時臨界處操作。 wire w_FD_WTD;//input CPU喂狗訊號,高(電平)脈衝有效 reg r_WTD_Rstn;//output 看門狗復位訊號,超時未喂狗拉低 wire WTD_En;//
input CPU看門狗使能訊號,高有效 localparam [23:0]Param_25M_500ms = 24'hbe_bc_20; localparam [7:0]Count_500ms_2Min = 8'hf0; reg [23:0]Count_25M_500ms; reg [15:0]Count_500ms_num; //500ms計數 always @(posedge clk_25m or negedge rst_n) begin if(~rst_n)begin Count_25M_500ms <= 24'd0; Count_500ms_num <= 16'd0; end
else if(Count_25M_500ms >= Param_25M_500ms)begin Count_25M_500ms <= 24'd0; Count_500ms_num <= Count_500ms_num + 1'b1; end else begin Count_25M_500ms <= Count_25M_500ms + 1'b1; end end //state machine localparam [3:0]CPU_Startup = 4'b00_00; localparam [3:0]CPU_Running = 4'b00_01; localparam [3:0]CPU_WTD_Run = 4'b00_10; reg [3:0]WTD_state = 4'b00_00; //WTD function reg [27:0]WTD_Count; localparam [27:0]WTD_Count_2s = 28'd50_00_00_00; always @ (posedge clk_25m) begin case(WTD_state) CPU_Startup:begin//do nothing if(Count_500ms_num <= Count_500ms_2Min)begin WTD_state <= CPU_Startup; end else begin WTD_state <= CPU_Running; end end CPU_Running:begin//Waite WTD Enable if(WTD_En) begin//WTD_En From CPU Ctr WTD_state <= CPU_WTD_Run; end else begin WTD_state <= CPU_Running; end end CPU_WTD_Run:begin if(WTD_En) begin WTD_state <= CPU_WTD_Run; end else begin WTD_state <= CPU_Running; end end default:begin WTD_state <= CPU_Startup; end endcase end always @ (posedge clk_25m) begin case(WTD_state) CPU_WTD_Run:begin if(w_FD_WTD)begin//feed watch dog WTD_Count <= 28'd0; r_WTD_Rstn <= 1'b1; end else begin if(WTD_Count <= WTD_Count_2s)begin WTD_Count <= WTD_Count + 1'b1; r_WTD_Rstn <= 1'b1; end else begin r_WTD_Rstn <= 1'b0; end end end default:begin r_WTD_Rstn <= 1'b1; WTD_Count <= 28'd0; end endcase end