FPGA VIVADO:axi-lite 從機和主機

FPGA VIVADO:axi-lite 從機和主機


@TOC在這里插入代碼片


前言


協議就不詳細講解了,直接看手冊即可。下面主要如何寫代碼和關鍵的時序。

此外下面的代碼可以直接用于實際工程

一、AXI-LITE 主機

數據轉axi lite接口:
讀/寫數據FIFO緩存
仲裁:寫優先
AXI LITE 總線輸出
以下是axi-lite主機的代碼:
主要思路:
先理清楚下面5個通道,一個一個來看,端口再多理順了就好了

  • AW
  • W
  • B
  • AR
  • R

上面是五個通道關鍵的名稱,在寫代碼時,也按照這五個通道分別命名,就可以批量復制的寫代碼了!

代碼設計思路:

  • 采用背靠背的方式寫AW通道和W通道
  • 當握手完成,代表數據已經被從機捕獲
  • 使用fifo做批量數據緩存
// 數據轉axi lite接口:
// 讀/寫數據FIFO緩存
// 仲裁:寫優先
// AXI LITE 總線輸出
module axi_master_driver#(parameter	P_AXI_ADDR_WIDTH = 32,parameter	P_AXI_DATA_WIDTH = 32
)(input								M_AXI_CLK			,input								M_AXI_RST_N         ,input	[P_AXI_ADDR_WIDTH - 1:0]	M_SLAVE_BASE_ADDR   ,output	[P_AXI_ADDR_WIDTH - 1:0]	M_AXI_AWADDR	    ,output	[2 : 0]	                    M_AXI_AWPROT        ,output		                        M_AXI_AWVALID       ,input		                        M_AXI_AWREADY       ,output	[P_AXI_DATA_WIDTH - 1:0]	M_AXI_WDATA		    ,output	[P_AXI_DATA_WIDTH/8 - 1:0]	M_AXI_WSTRB 	    ,   output		                        M_AXI_WVALID	    ,   input		                        M_AXI_WREADY	    ,   input	[1:0]	                    M_AXI_BRESP		    ,input		                        M_AXI_BVALID        ,output		                        M_AXI_BREADY        ,output	[P_AXI_ADDR_WIDTH - 1:0]	M_AXI_ARADDR	    ,output	[2 : 0]	                    M_AXI_ARPROT        ,output		                        M_AXI_ARVALID       ,input		                        M_AXI_ARREADY       ,input	[P_AXI_DATA_WIDTH - 1:0]	M_AXI_RDATA		    ,input	[1:0]	                    M_AXI_RRESP         ,input		                        M_AXI_RVALID        ,output		                        M_AXI_RREADY        ,input   [P_AXI_ADDR_WIDTH - 1:0]	i_awaddr			    ,input   [P_AXI_DATA_WIDTH - 1:0]	i_wdata             ,input								i_wdata_vld         ,input   [P_AXI_ADDR_WIDTH - 1:0]	i_raddr			    ,input   							i_raddr_vld         ,output  [P_AXI_DATA_WIDTH - 1:0]	o_rdata             ,output	[1:0]						o_rresp			    ,output								o_rdata_vld		
);
// -------------------------------------------------------
logic	[P_AXI_ADDR_WIDTH - 1:0]	lg_M_AXI_AWADDR		    ;
logic	[2 : 0]	                    lg_M_AXI_AWPROT         ;
logic		                        lg_M_AXI_AWVALID        ;
logic	[P_AXI_DATA_WIDTH - 1:0]	lg_M_AXI_WDATA		    ;
logic	[P_AXI_DATA_WIDTH/8 - 1:0]	lg_M_AXI_WSTRB 	        ;
logic		                        lg_M_AXI_WVALID	        ;
logic		                        lg_M_AXI_BREADY         ;
logic	[P_AXI_ADDR_WIDTH - 1:0]	lg_M_AXI_ARADDR	        ;
logic	[2 : 0]	                    lg_M_AXI_ARPROT         ;
logic		                        lg_M_AXI_ARVALID        ;
logic		                        lg_M_AXI_RREADY         ;
logic 	[P_AXI_DATA_WIDTH - 1:0]	lg_rdata                ;
logic	[1:0]						lg_rresp	            ;
logic								lg_rdata_vld            ;
// --------------------------------------------------------
logic								lg_aw_active	;
logic								lg_w_active  	;
logic								lg_b_active  	;
logic								lg_ar_active 	;
logic								lg_r_active  	;
// --------------------------------------------------------	
logic		                        lg_fifo_awaddr_rd_en          ;
logic		                        lg_fifo_awaddr_rd_en_d1       ;
logic	[P_AXI_ADDR_WIDTH - 1:0]	lg_fifo_awaddr_dout           ;
logic		                        lg_fifo_awaddr_full           ;
logic		                        lg_fifo_awaddr_almost_full    ;
logic		                        lg_fifo_awaddr_empty          ;   
logic		                        lg_fifo_awaddr_valid          ;
logic	[4:0]                        lg_fifo_awaddr_data_count	  ;
logic		                        lg_fifo_aw_prog_full		  ;logic		                        lg_fifo_wdata_rd_en           ;
logic	[P_AXI_ADDR_WIDTH - 1:0]	lg_fifo_wdata_dout            ;
logic		                        lg_fifo_wdata_full            ;
logic		                        lg_fifo_wdata_almost_full     ;
logic		                        lg_fifo_wdata_empty           ;   
logic		                        lg_fifo_wdata_valid           ;
logic	[4:0]	                        lg_fifo_wdata_data_count	  ;
logic		                        lg_fifo_w_prog_full		  	  ;logic		                        lg_fifo_araddr_rd_en          ;
logic								lg_fifo_araddr_rd_en_d1		  ;
logic	[P_AXI_ADDR_WIDTH - 1:0]	lg_fifo_araddr_dout           ;
logic		                        lg_fifo_araddr_full           ;
logic		                        lg_fifo_araddr_almost_full    ;
logic		                        lg_fifo_araddr_empty          ;   
logic		                        lg_fifo_araddr_valid          ;
logic	[4:0]	                        lg_fifo_araddr_data_count	  ;
logic		                        lg_fifo_ar_prog_full		  ;
// --------------------------------------------------------	
logic				lg_wr_run;
logic				lg_rd_run;
// --------------------------------------------------------	
assign	M_AXI_AWADDR		=	lg_M_AXI_AWADDR		    ;	
assign	M_AXI_AWPROT        =	lg_M_AXI_AWPROT         ;
assign	M_AXI_AWVALID       =	lg_M_AXI_AWVALID        ;
assign	M_AXI_WDATA		    =	lg_M_AXI_WDATA		    ;
assign	M_AXI_WSTRB 	    =	lg_M_AXI_WSTRB 	        ;
assign	M_AXI_WVALID	    =	lg_M_AXI_WVALID	        ;
assign	M_AXI_BREADY        =	lg_M_AXI_BREADY         ;
assign	M_AXI_ARADDR	    =	lg_M_AXI_ARADDR	        ;
assign	M_AXI_ARPROT        =	lg_M_AXI_ARPROT         ;
assign	M_AXI_ARVALID       =	lg_M_AXI_ARVALID        ;
assign	M_AXI_RREADY        =	lg_M_AXI_RREADY         ;
assign	o_rdata             =	lg_rdata                ;
assign	o_rresp				= 	lg_rresp				;
assign	o_rdata_vld         =	lg_rdata_vld            ;
// --------------------------------------------------------
assign	lg_aw_active	= M_AXI_AWVALID & M_AXI_AWREADY;
assign	lg_w_active  	= M_AXI_WVALID  & M_AXI_WREADY ;
assign	lg_b_active  	= M_AXI_BVALID  & M_AXI_BREADY ;
assign	lg_ar_active 	= M_AXI_ARVALID & M_AXI_ARREADY;
assign	lg_r_active  	= M_AXI_RVALID  & M_AXI_RREADY ;// ---------------- 讀寫控制 ----------------------
// 背靠背,數據和地址同時寫;
// ==============================
// ==============================
always@(posedge M_AXI_CLK) beginif(M_AXI_RST_N == 1'b0)	lg_wr_run <= 'd0;else if(!lg_fifo_awaddr_empty)lg_wr_run <= 'd1;elselg_wr_run <= lg_wr_run;
endalways@(posedge M_AXI_CLK) beginif(M_AXI_RST_N == 1'b0)	lg_fifo_awaddr_rd_en <= 'd0;else if(lg_aw_active)lg_fifo_awaddr_rd_en <= 'd0;else if(!lg_fifo_awaddr_empty & !lg_wr_run)lg_fifo_awaddr_rd_en <= 'd1;elselg_fifo_awaddr_rd_en <= 'd0;
endalways@(posedge M_AXI_CLK) beginlg_fifo_awaddr_rd_en_d1 <= lg_fifo_awaddr_rd_en;
endalways@(posedge M_AXI_CLK) beginif(M_AXI_RST_N == 1'b0)	lg_rd_run <= 'd0;else if(lg_ar_active == 'd1)lg_rd_run <= 'd0;else if(!lg_fifo_araddr_empty & lg_fifo_awaddr_empty & !lg_wr_run)lg_rd_run <= 'd1;elselg_rd_run <= lg_rd_run;
endalways@(posedge M_AXI_CLK) beginif(M_AXI_RST_N == 1'b0)	lg_fifo_araddr_rd_en <= 'd0;else if(!lg_fifo_araddr_empty & lg_fifo_awaddr_empty & !lg_wr_run & !lg_rd_run) lg_fifo_araddr_rd_en <= 'd1;elselg_fifo_araddr_rd_en <= 'd0;
end
always@(posedge M_AXI_CLK) beginlg_fifo_araddr_rd_en_d1 <= lg_fifo_araddr_rd_en;
end
// ================================================	
// 寫數據、地址FIFO緩存	
// ================================================	
fifo_axi_master_32x32 fifo_axi_master_aw (.clk        (M_AXI_CLK           			    ),.din        (i_awaddr       	                ),     .wr_en      (i_wdata_vld                      ),  .rd_en      (lg_fifo_awaddr_rd_en             ),  			 .dout       (lg_fifo_awaddr_dout              ),            .full       (lg_fifo_awaddr_full              ),        .almost_full(lg_fifo_awaddr_almost_full       ),  .empty      (lg_fifo_awaddr_empty             ),  			 .valid      (lg_fifo_awaddr_valid             ),.data_count (lg_fifo_awaddr_data_count		),.prog_full  (lg_fifo_aw_prog_full				)     
);fifo_axi_master_32x32 fifo_axi_master_w (.clk        (M_AXI_CLK           			  ),.din        (i_wdata       	              ),     .wr_en      (i_wdata_vld                    ),  .rd_en      (lg_fifo_awaddr_rd_en           ),  .dout       (lg_fifo_wdata_dout             ),.full       (lg_fifo_wdata_full             ),.almost_full(lg_fifo_wdata_almost_full      ),.empty      (lg_fifo_wdata_empty            ),.valid      (lg_fifo_wdata_valid            ),.data_count (lg_fifo_wdata_data_count		  ),.prog_full  (lg_fifo_w_prog_full			  )     
);fifo_axi_master_32x32 fifo_axi_master_ar (.clk        (M_AXI_CLK           				),.din        (i_raddr       	                ),     .wr_en      (i_raddr_vld                      ),  .rd_en      (lg_fifo_araddr_rd_en             ),  .dout       (lg_fifo_araddr_dout              ),.full       (lg_fifo_araddr_full              ),.almost_full(lg_fifo_araddr_almost_full       ),.empty      (lg_fifo_araddr_empty             ),.valid      (lg_fifo_araddr_valid             ),.data_count (lg_fifo_araddr_data_count		),.prog_full  (lg_fifo_ar_prog_full				)     
);// ----------- axi 時序 ------------------ 	always@(posedge M_AXI_CLK) beginif(!M_AXI_RST_N) beginlg_M_AXI_AWADDR	    <= 'd0;lg_M_AXI_AWPROT     <= 'd0;lg_M_AXI_AWVALID  	<= 'd0;	endelse if(lg_aw_active) beginlg_M_AXI_AWADDR	    <= 'd0;lg_M_AXI_AWPROT     <= 'd0;lg_M_AXI_AWVALID  	<= 'd0;		end	// 這里多打一拍的原因是因為fifo輸出要延遲一拍else if(lg_fifo_awaddr_rd_en_d1) beginlg_M_AXI_AWADDR	    <= lg_fifo_awaddr_dout;lg_M_AXI_AWPROT     <= 'd0;lg_M_AXI_AWVALID  	<= 'd1;		endelse beginlg_M_AXI_AWADDR	    <= lg_M_AXI_AWADDR	;lg_M_AXI_AWPROT     <= lg_M_AXI_AWPROT    ;lg_M_AXI_AWVALID  	<= lg_M_AXI_AWVALID  	;		end
endalways@(posedge M_AXI_CLK) beginif(!M_AXI_RST_N) beginlg_M_AXI_WDATA		<= 'd0;lg_M_AXI_WSTRB		<= 'd0; lg_M_AXI_WVALID     <= 'd0;endelse if(lg_w_active) beginlg_M_AXI_WDATA		<= 'd0;lg_M_AXI_WSTRB		<= 'd0; lg_M_AXI_WVALID     <= 'd0;end	else if(lg_fifo_awaddr_rd_en_d1) beginlg_M_AXI_WDATA		<= lg_fifo_wdata_dout;lg_M_AXI_WSTRB		<= 'hF               ; lg_M_AXI_WVALID     <= 'd1               ;endelse beginlg_M_AXI_WDATA		<= lg_M_AXI_WDATA	;lg_M_AXI_WSTRB		<= lg_M_AXI_WSTRB	;lg_M_AXI_WVALID     <= lg_M_AXI_WVALID ;	end
endalways@(posedge M_AXI_CLK) beginif(!M_AXI_RST_N) beginlg_M_AXI_BREADY     <='d0;endelse if(lg_b_active) beginlg_M_AXI_BREADY     <='d0;		end	else if(lg_w_active) beginlg_M_AXI_BREADY     <='d1;endelse beginlg_M_AXI_BREADY     <=lg_M_AXI_BREADY;end
endalways@(posedge M_AXI_CLK) beginif(!M_AXI_RST_N) beginlg_M_AXI_ARADDR	    <= 'd0;lg_M_AXI_ARPROT     <= 'd0;lg_M_AXI_ARVALID  	<= 'd0;	endelse if(lg_ar_active) beginlg_M_AXI_ARADDR	    <= 'd0;lg_M_AXI_ARPROT     <= 'd0;lg_M_AXI_ARVALID  	<= 'd0;		end	else if(lg_fifo_araddr_rd_en_d1) beginlg_M_AXI_ARADDR	    <= lg_fifo_araddr_dout;lg_M_AXI_ARPROT     <= 'd0;lg_M_AXI_ARVALID  	<= 'd1;		endelse beginlg_M_AXI_ARADDR	    <= lg_M_AXI_ARADDR		;lg_M_AXI_ARPROT     <= lg_M_AXI_ARPROT     ;lg_M_AXI_ARVALID  	<= lg_M_AXI_ARVALID    ;		end
endalways@(posedge M_AXI_CLK) beginif(!M_AXI_RST_N) beginlg_M_AXI_RREADY     <='d0;endelse if(lg_r_active) beginlg_M_AXI_RREADY     <='d0;		end	else if(lg_ar_active) beginlg_M_AXI_RREADY     <='d1;endelse beginlg_M_AXI_RREADY     <=lg_M_AXI_RREADY;end
endalways@(posedge M_AXI_CLK) beginlg_rdata		        <= M_AXI_RDATA			;lg_rresp		        <= M_AXI_RRESP          ;lg_rdata_vld	        <= M_AXI_RVALID  	    ;
endendmodule

TB如下:

`timescale 1ns / 1psmodule tb_axi_master();logic clk=0;
logic rst_n=0;initial begin#1000;rst_n = 1;
endalways #(1000/100/2) clk = ~clk;// ==================================================
// ==================================================
// ==================================================
parameter P_AXI_ADDR_WIDTH =32;
parameter P_AXI_DATA_WIDTH =32;
logic 							M_AXI_CLK			;
logic 							M_AXI_RST_N         ;
logic [P_AXI_ADDR_WIDTH - 1:0]	M_SLAVE_BASE_ADDR   ;
logic [P_AXI_ADDR_WIDTH - 1:0]	M_AXI_AWADDR	    ;
logic [2 : 0]	                M_AXI_AWPROT        ;
logic 	                        M_AXI_AWVALID       ;
logic 	                        M_AXI_AWREADY       ;
logic [P_AXI_DATA_WIDTH - 1:0]	M_AXI_WDATA		    ;
logic [P_AXI_DATA_WIDTH/8 - 1:0]M_AXI_WSTRB 	    ;
logic 	                        M_AXI_WVALID	    ;
logic 	                        M_AXI_WREADY	    ;
logic [1:0]	                    M_AXI_BRESP		    ;
logic 	                        M_AXI_BVALID        ;
logic 	                        M_AXI_BREADY        ;
logic [P_AXI_ADDR_WIDTH - 1:0]	M_AXI_ARADDR	    ;
logic [2 : 0]	                M_AXI_ARPROT        ;
logic 	                        M_AXI_ARVALID       ;
logic 	                        M_AXI_ARREADY       ;
logic [P_AXI_DATA_WIDTH - 1:0]	M_AXI_RDATA		    ;
logic [1:0]	                    M_AXI_RRESP         ;
logic 	                        M_AXI_RVALID        ;
logic 	                        M_AXI_RREADY        ;
logic [P_AXI_ADDR_WIDTH - 1:0]	lg_i_waddr			;
logic [P_AXI_DATA_WIDTH - 1:0]	lg_i_wdata          ;
logic 							lg_i_wdata_vld      ;
logic [P_AXI_ADDR_WIDTH - 1:0]	lg_i_raddr			;
logic 							lg_i_raddr_vld      ;
logic [P_AXI_DATA_WIDTH - 1:0]	lg_o_rdata          ;
logic [1:0]						lg_o_rresp			;
logic 							lg_o_rdata_vld		;axi_master_driver#(
.P_AXI_ADDR_WIDTH(P_AXI_ADDR_WIDTH),                                                                     
.P_AXI_DATA_WIDTH(P_AXI_DATA_WIDTH)
)
axi_master_driver(.M_AXI_CLK     			(clk	),                                                                .M_AXI_RST_N            (rst_n	),                                                         .M_SLAVE_BASE_ADDR      (32'd0   	 ),                                                               .M_AXI_AWADDR           (M_AXI_AWADDR        ),                                                          .M_AXI_AWPROT           (M_AXI_AWPROT        ),                                                          .M_AXI_AWVALID          (M_AXI_AWVALID       ),                                                           .M_AXI_AWREADY          (M_AXI_AWREADY       ),                                                           .M_AXI_WDATA            (M_AXI_WDATA         ),                                                         .M_AXI_WSTRB            (M_AXI_WSTRB         ),                                                         .M_AXI_WVALID           (M_AXI_WVALID        ),                                                          .M_AXI_WREADY           (M_AXI_WREADY        ),                                                          .M_AXI_BRESP            (M_AXI_BRESP         ),                                                         .M_AXI_BVALID           (M_AXI_BVALID        ),                                                          .M_AXI_BREADY           (M_AXI_BREADY        ),                                                          .M_AXI_ARADDR           (M_AXI_ARADDR        ),                                                          .M_AXI_ARPROT           (M_AXI_ARPROT        ),                                                          .M_AXI_ARVALID          (M_AXI_ARVALID       ),                                                           .M_AXI_ARREADY          (M_AXI_ARREADY       ),                                                           .M_AXI_RDATA            (M_AXI_RDATA         ),                                                         .M_AXI_RRESP            (M_AXI_RRESP         ),                                                         .M_AXI_RVALID           (M_AXI_RVALID        ),                                                          .M_AXI_RREADY           (M_AXI_RREADY        ),                                                          .i_awaddr               (lg_i_waddr          ),                                                     .i_wdata                (lg_i_wdata          ),                                                     .i_wdata_vld            (lg_i_wdata_vld      ),                                                         .i_raddr                (lg_i_raddr          ),                                                     .i_raddr_vld            (lg_i_raddr_vld      ),                                                         .o_rdata                (lg_o_rdata          ),                                                     .o_rresp                (lg_o_rresp          ),                                                     .o_rdata_vld            (lg_o_rdata_vld      )
);axi_slaver_v1_0_S00_AXI # ( .C_S_AXI_DATA_WIDTH(32),.C_S_AXI_ADDR_WIDTH(32)) axi_slaver_v1_0_S00_AXI_inst (.S_AXI_ACLK   (clk				),			.S_AXI_ARESETN(rst_n            ),.S_AXI_AWADDR (M_AXI_AWADDR   	),				.S_AXI_AWPROT (M_AXI_AWPROT     ),.S_AXI_AWVALID(M_AXI_AWVALID    ),.S_AXI_AWREADY(M_AXI_AWREADY    ),.S_AXI_WDATA  (M_AXI_WDATA      ),.S_AXI_WSTRB  (M_AXI_WSTRB      ),.S_AXI_WVALID (M_AXI_WVALID     ),.S_AXI_WREADY (M_AXI_WREADY     ),.S_AXI_BRESP  (M_AXI_BRESP      ),.S_AXI_BVALID (M_AXI_BVALID     ),.S_AXI_BREADY (M_AXI_BREADY     ),.S_AXI_ARADDR (M_AXI_ARADDR     ),.S_AXI_ARPROT (M_AXI_ARPROT     ),.S_AXI_ARVALID(M_AXI_ARVALID    ),.S_AXI_ARREADY(M_AXI_ARREADY    ),.S_AXI_RDATA  (M_AXI_RDATA      ),.S_AXI_RRESP  (M_AXI_RRESP      ),.S_AXI_RVALID (M_AXI_RVALID     ),.S_AXI_RREADY (M_AXI_RREADY     ));
logic [31:0] data;
initial beginlg_i_waddr     	=0;lg_i_wdata     	=0;lg_i_wdata_vld 	=0;lg_i_raddr     	=0;lg_i_raddr_vld 	=0;data			=0;wait(rst_n);write_task(36,'h0000_0001);#100;write_task(36,'h0000_0000);write_task(12,'h5555_FFFF);write_task(16,'h5555_FFFF);write_task(20,'h5555_FFFF);rd_task('d24);rd_task('d28);write_task(32,'h5555_6666);rd_task('d32);
end// ====================== task ==============================task write_task(input [31:0] awaddr,input [31:0] wdata);begin:write_data@(posedge clk) beginlg_i_waddr     <= 'd0;lg_i_wdata     <= 'd0;lg_i_wdata_vld <= 'd0;end@(posedge clk) beginlg_i_waddr     <= awaddr;lg_i_wdata     <= wdata;lg_i_wdata_vld <= 'd1;end@(posedge clk) beginlg_i_waddr     <= 'd0;lg_i_wdata     <= 'd0;lg_i_wdata_vld <= 'd0;endend
endtask	task rd_task(input [31:0] araddr);begin:rd_data@(posedge clk) beginlg_i_raddr     <= 'd0;lg_i_raddr_vld <= 'd0;end@(posedge clk) beginlg_i_raddr     <= araddr;lg_i_raddr_vld <= 'd1;end@(posedge clk) beginlg_i_raddr     <= 'd0;lg_i_raddr_vld <= 'd0;endend
endtask	
endmodule

這里有一個寫代碼的技巧:
如果想實現一個時序如下:只想在run開始后,拉高一個使能一個周期
在這里插入圖片描述
那么,可以這么寫代碼:

// (!lg_fifo_awaddr_empty)最為run的觸發信號,en想拉高一拍,則en的觸發信號使用run的觸發信號+run的取反  =》 可以得到en和run同時拉高,且en只拉高一拍
always@(posedge M_AXI_CLK) beginif(M_AXI_RST_N == 1'b0)	lg_wr_run <= 'd0;else if(!lg_fifo_awaddr_empty)lg_wr_run <= 'd1;elselg_wr_run <= lg_wr_run;
endalways@(posedge M_AXI_CLK) beginif(M_AXI_RST_N == 1'b0)	lg_fifo_awaddr_rd_en <= 'd0;else if(lg_aw_active)lg_fifo_awaddr_rd_en <= 'd0;else if(!lg_fifo_awaddr_empty & !lg_wr_run)lg_fifo_awaddr_rd_en <= 'd1;elselg_fifo_awaddr_rd_en <= 'd0;
end

1.1 FIFO

這里再做一個FIFO的擴展,FIFO用的確實很多,這里再對FIFO的時序做一個鞏固。

我這里FIFO的IP配置如下:
在這里插入圖片描述
例化如下:

fifo_axi_master_32x32 fifo_axi_master_aw (.clk        (M_AXI_CLK           			    ),.din        (i_awaddr       	                ),     .wr_en      (i_wdata_vld                      ),  .rd_en      (lg_fifo_awaddr_rd_en             ),  			 .dout       (lg_fifo_awaddr_dout              ),            .full       (lg_fifo_awaddr_full              ),        .almost_full(lg_fifo_awaddr_almost_full       ),  .empty      (lg_fifo_awaddr_empty             ),  			 .valid      (lg_fifo_awaddr_valid             ),.data_count (lg_fifo_awaddr_data_count		),.prog_full  (lg_fifo_aw_prog_full				)     
);

在這個代碼運行過程中,針對FIFO信號的各個關鍵時序進行說明;
在這里插入圖片描述
從時序上看,當寫入或者讀出數據,empty count dout都是在下一個時鐘周期進行更新

接著,我嘗試只寫不讀,看看pfull和afull和full的關系(我這里設置fifo的深度為32),時序如下:
在這里插入圖片描述
我這里使用count計數是和數據的寫入是同步的,當采集到31時(fifo里面已經有了31個數據),且在寫數據,那么此時full拉高,下一個時鐘周期,才能讀到full,這樣會存在反壓失敗的情況。

對于afull和pfull(我這設置為29),分別為當寫為31個數據時afull會拉高(采樣到vld拉高之后拉高,即會延遲一拍),當寫入29個數據時pfull會拉高(采樣到vld拉高之后拉高,即會延遲一拍).

關于反壓不丟數,可以看我另外一篇博客:
FPGA FIFO系列 - FIFO使用中需要注意的若干問題

二 AXI-LITE 從機

關于從機,可以直接用VIVADO提供的代碼:
只需要關注下axi_araddr和axi_awaddr兩個信號里面地址需要修改一下就好了。此外對于外部的寫入和讀取,就按照需要的進行修改即可


`timescale 1 ns / 1 psmodule axi_slaver_v1_0_S00_AXI #(// Users to add parameters here// User parameters ends// Do not modify the parameters beyond this line// Width of S_AXI data busparameter integer C_S_AXI_DATA_WIDTH	= 32,// Width of S_AXI address busparameter integer C_S_AXI_ADDR_WIDTH	= 8)(// Users to add ports here// User ports ends// Do not modify the ports beyond this line// Global Clock Signalinput wire  S_AXI_ACLK,// Global Reset Signal. This Signal is Active LOWinput wire  S_AXI_ARESETN,// Write address (issued by master, acceped by Slave)input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,// Write channel Protection type. This signal indicates the// privilege and security level of the transaction, and whether// the transaction is a data access or an instruction access.input wire [2 : 0] S_AXI_AWPROT,// Write address valid. This signal indicates that the master signaling// valid write address and control information.input wire  S_AXI_AWVALID,// Write address ready. This signal indicates that the slave is ready// to accept an address and associated control signals.output wire  S_AXI_AWREADY,// Write data (issued by master, acceped by Slave) input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,// Write strobes. This signal indicates which byte lanes hold// valid data. There is one write strobe bit for each eight// bits of the write data bus.    input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,// Write valid. This signal indicates that valid write// data and strobes are available.input wire  S_AXI_WVALID,// Write ready. This signal indicates that the slave// can accept the write data.output wire  S_AXI_WREADY,// Write response. This signal indicates the status// of the write transaction.output wire [1 : 0] S_AXI_BRESP,// Write response valid. This signal indicates that the channel// is signaling a valid write response.output wire  S_AXI_BVALID,// Response ready. This signal indicates that the master// can accept a write response.input wire  S_AXI_BREADY,// Read address (issued by master, acceped by Slave)input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,// Protection type. This signal indicates the privilege// and security level of the transaction, and whether the// transaction is a data access or an instruction access.input wire [2 : 0] S_AXI_ARPROT,// Read address valid. This signal indicates that the channel// is signaling valid read address and control information.input wire  S_AXI_ARVALID,// Read address ready. This signal indicates that the slave is// ready to accept an address and associated control signals.output wire  S_AXI_ARREADY,// Read data (issued by slave)output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,// Read response. This signal indicates the status of the// read transfer.output wire [1 : 0] S_AXI_RRESP,// Read valid. This signal indicates that the channel is// signaling the required read data.output wire  S_AXI_RVALID,// Read ready. This signal indicates that the master can// accept the read data and response information.input wire  S_AXI_RREADY);// AXI4LITE signalsreg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_awaddr;reg  	axi_awready;reg  	axi_wready;reg [1 : 0] 	axi_bresp;reg  	axi_bvalid;reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_araddr;reg  	axi_arready;reg [C_S_AXI_DATA_WIDTH-1 : 0] 	axi_rdata;reg [1 : 0] 	axi_rresp;reg  	axi_rvalid;// Example-specific design signals// local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH// ADDR_LSB is used for addressing 32/64 bit registers/memories// ADDR_LSB = 2 for 32 bits (n downto 2)// ADDR_LSB = 3 for 64 bits (n downto 3)localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;localparam integer OPT_MEM_ADDR_BITS = 5;//----------------------------------------------//-- Signals for user logic register space example//------------------------------------------------//-- Number of Slave Registers 64reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg0;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg1;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg2;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg3;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg4;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg5;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg6;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg7;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg8;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg9;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg10;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg11;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg12;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg13;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg14;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg15;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg16;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg17;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg18;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg19;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg20;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg21;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg22;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg23;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg24;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg25;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg26;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg27;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg28;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg29;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg30;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg31;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg32;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg33;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg34;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg35;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg36;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg37;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg38;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg39;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg40;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg41;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg42;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg43;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg44;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg45;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg46;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg47;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg48;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg49;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg50;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg51;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg52;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg53;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg54;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg55;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg56;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg57;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg58;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg59;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg60;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg61;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg62;reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg63;wire	 slv_reg_rden;wire	 slv_reg_wren;reg [C_S_AXI_DATA_WIDTH-1:0]	 reg_data_out;integer	 byte_index;reg	 aw_en;// I/O Connections assignmentsassign S_AXI_AWREADY	= axi_awready;assign S_AXI_WREADY	= axi_wready;assign S_AXI_BRESP	= axi_bresp;assign S_AXI_BVALID	= axi_bvalid;assign S_AXI_ARREADY	= axi_arready;assign S_AXI_RDATA	= axi_rdata;assign S_AXI_RRESP	= axi_rresp;assign S_AXI_RVALID	= axi_rvalid;// Implement axi_awready generation// axi_awready is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is// de-asserted when reset is low.
// 嚴格1對1關系,所以需要aw和w通道同時拉高(AXI_FULL因為是突發傳輸,所以就不會對齊(只發一個地址,后面都是突發遞增))// 給出ready,其實這時已經采集到了;主機實在ready之后才釋放vldalways @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_awready <= 1'b0;aw_en <= 1'b1;end elsebegin    // 防止連續寫兩個地址,因此引入 aw_en; aw_en 決定當前是否寫完,知道響應握手成功if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en) // 拉高一個周期的方式,前置拉高條件+拉高后取反條件;拉高時機就是和采集和條件是同一拍begin// slave is ready to accept write address when // there is a valid write address and write data// on the write address and data bus. This design // expects no outstanding transactions. axi_awready <= 1'b1;aw_en <= 1'b0;endelse if (S_AXI_BREADY && axi_bvalid)beginaw_en <= 1'b1;axi_awready <= 1'b0;endelse           beginaxi_awready <= 1'b0;endend end       // Implement axi_awaddr latching// This process is used to latch the address when both // S_AXI_AWVALID and S_AXI_WVALID are valid. 
// 這里對AWaddr進行寄存always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_awaddr <= 0;end elsebegin   if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)begin// Write Address latching axi_awaddr <= S_AXI_AWADDR;endend end       // Implement axi_wready generation// axi_wready is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is // de-asserted when reset is low. 
// 類似的對wready進行同步給出always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_wready <= 1'b0;end elsebegin    if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )begin// slave is ready to accept write data when // there is a valid write address and write data// on the write address and data bus. This design // expects no outstanding transactions. axi_wready <= 1'b1;endelsebeginaxi_wready <= 1'b0;endend end       // Implement memory mapped register select and write logic generation// The write data is accepted and written to memory mapped registers when// axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to// select byte enables of slave registers while writing.// These registers are cleared when reset (active low) is applied.// Slave register write enable is asserted when valid address and data are available// and the slave is ready to accept the write address and write data.assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginslv_reg0 <= 0;slv_reg1 <= 0;slv_reg2 <= 0;slv_reg3 <= 0;slv_reg4 <= 0;slv_reg5 <= 0;slv_reg6 <= 0;slv_reg7 <= 0;slv_reg8 <= 0;slv_reg9 <= 0;slv_reg10 <= 0;slv_reg11 <= 0;slv_reg12 <= 0;slv_reg13 <= 0;slv_reg14 <= 0;slv_reg15 <= 0;slv_reg16 <= 0;slv_reg17 <= 0;slv_reg18 <= 0;slv_reg19 <= 0;slv_reg20 <= 0;slv_reg21 <= 0;slv_reg22 <= 0;slv_reg23 <= 0;slv_reg24 <= 0;slv_reg25 <= 0;slv_reg26 <= 0;slv_reg27 <= 0;slv_reg28 <= 0;slv_reg29 <= 0;slv_reg30 <= 0;slv_reg31 <= 0;slv_reg32 <= 0;slv_reg33 <= 0;slv_reg34 <= 0;slv_reg35 <= 0;slv_reg36 <= 0;slv_reg37 <= 0;slv_reg38 <= 0;slv_reg39 <= 0;slv_reg40 <= 0;slv_reg41 <= 0;slv_reg42 <= 0;slv_reg43 <= 0;slv_reg44 <= 0;slv_reg45 <= 0;slv_reg46 <= 0;slv_reg47 <= 0;slv_reg48 <= 0;slv_reg49 <= 0;slv_reg50 <= 0;slv_reg51 <= 0;slv_reg52 <= 0;slv_reg53 <= 0;slv_reg54 <= 0;slv_reg55 <= 0;slv_reg56 <= 0;slv_reg57 <= 0;slv_reg58 <= 0;slv_reg59 <= 0;slv_reg60 <= 0;slv_reg61 <= 0;slv_reg62 <= 0;slv_reg63 <= 0;end else beginif (slv_reg_wren)begincase ( axi_awaddr[5:0] )6'h00:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 0slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h01:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 1slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h02:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 2slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h03:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 3slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h04:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 4slv_reg4[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h05:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 5slv_reg5[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h06:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 6slv_reg6[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h07:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 7slv_reg7[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h08:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 8slv_reg8[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h09:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 9slv_reg9[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h0A:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 10slv_reg10[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h0B:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 11slv_reg11[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h0C:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 12slv_reg12[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h0D:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 13slv_reg13[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h0E:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 14slv_reg14[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h0F:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 15slv_reg15[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h10:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 16slv_reg16[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h11:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 17slv_reg17[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h12:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 18slv_reg18[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h13:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 19slv_reg19[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h14:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 20slv_reg20[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h15:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 21slv_reg21[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h16:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 22slv_reg22[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h17:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 23slv_reg23[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h18:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 24slv_reg24[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h19:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 25slv_reg25[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h1A:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 26slv_reg26[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h1B:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 27slv_reg27[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h1C:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 28slv_reg28[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h1D:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 29slv_reg29[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h1E:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 30slv_reg30[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h1F:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 31slv_reg31[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h20:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 32slv_reg32[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h21:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 33slv_reg33[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h22:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 34slv_reg34[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h23:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 35slv_reg35[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h24:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 36slv_reg36[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h25:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 37slv_reg37[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h26:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 38slv_reg38[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h27:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 39slv_reg39[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h28:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 40slv_reg40[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h29:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 41slv_reg41[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h2A:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 42slv_reg42[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h2B:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 43slv_reg43[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h2C:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 44slv_reg44[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h2D:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 45slv_reg45[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h2E:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 46slv_reg46[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h2F:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 47slv_reg47[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h30:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 48slv_reg48[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h31:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 49slv_reg49[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h32:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 50slv_reg50[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h33:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 51slv_reg51[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h34:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 52slv_reg52[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h35:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 53slv_reg53[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h36:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 54slv_reg54[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h37:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 55slv_reg55[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h38:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 56slv_reg56[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h39:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 57slv_reg57[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h3A:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 58slv_reg58[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h3B:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 59slv_reg59[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h3C:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 60slv_reg60[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h3D:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 61slv_reg61[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h3E:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 62slv_reg62[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  6'h3F:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes // Slave register 63slv_reg63[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end  default : beginslv_reg0 <= slv_reg0;slv_reg1 <= slv_reg1;slv_reg2 <= slv_reg2;slv_reg3 <= slv_reg3;slv_reg4 <= slv_reg4;slv_reg5 <= slv_reg5;slv_reg6 <= slv_reg6;slv_reg7 <= slv_reg7;slv_reg8 <= slv_reg8;slv_reg9 <= slv_reg9;slv_reg10 <= slv_reg10;slv_reg11 <= slv_reg11;slv_reg12 <= slv_reg12;slv_reg13 <= slv_reg13;slv_reg14 <= slv_reg14;slv_reg15 <= slv_reg15;slv_reg16 <= slv_reg16;slv_reg17 <= slv_reg17;slv_reg18 <= slv_reg18;slv_reg19 <= slv_reg19;slv_reg20 <= slv_reg20;slv_reg21 <= slv_reg21;slv_reg22 <= slv_reg22;slv_reg23 <= slv_reg23;slv_reg24 <= slv_reg24;slv_reg25 <= slv_reg25;slv_reg26 <= slv_reg26;slv_reg27 <= slv_reg27;slv_reg28 <= slv_reg28;slv_reg29 <= slv_reg29;slv_reg30 <= slv_reg30;slv_reg31 <= slv_reg31;slv_reg32 <= slv_reg32;slv_reg33 <= slv_reg33;slv_reg34 <= slv_reg34;slv_reg35 <= slv_reg35;slv_reg36 <= slv_reg36;slv_reg37 <= slv_reg37;slv_reg38 <= slv_reg38;slv_reg39 <= slv_reg39;slv_reg40 <= slv_reg40;slv_reg41 <= slv_reg41;slv_reg42 <= slv_reg42;slv_reg43 <= slv_reg43;slv_reg44 <= slv_reg44;slv_reg45 <= slv_reg45;slv_reg46 <= slv_reg46;slv_reg47 <= slv_reg47;slv_reg48 <= slv_reg48;slv_reg49 <= slv_reg49;slv_reg50 <= slv_reg50;slv_reg51 <= slv_reg51;slv_reg52 <= slv_reg52;slv_reg53 <= slv_reg53;slv_reg54 <= slv_reg54;slv_reg55 <= slv_reg55;slv_reg56 <= slv_reg56;slv_reg57 <= slv_reg57;slv_reg58 <= slv_reg58;slv_reg59 <= slv_reg59;slv_reg60 <= slv_reg60;slv_reg61 <= slv_reg61;slv_reg62 <= slv_reg62;slv_reg63 <= slv_reg63;endendcaseendendend    // Implement write response logic generation// The write response and response valid signals are asserted by the slave // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.  // This marks the acceptance of address and indicates the status of // write transaction.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_bvalid  <= 0;axi_bresp   <= 2'b0;end elsebegin    if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)begin// indicates a valid write response is availableaxi_bvalid <= 1'b1;axi_bresp  <= 2'b0; // 'OKAY' response end                   // work error responses in futureelsebeginif (S_AXI_BREADY && axi_bvalid) //check if bready is asserted while bvalid is high) //(there is a possibility that bready is always asserted high)   beginaxi_bvalid <= 1'b0; end  endendend   // Implement axi_arready generation// axi_arready is asserted for one S_AXI_ACLK clock cycle when// S_AXI_ARVALID is asserted. axi_awready is // de-asserted when reset (active low) is asserted. // The read address is also latched when S_AXI_ARVALID is // asserted. axi_araddr is reset to zero on reset assertion.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_arready <= 1'b0;axi_araddr  <= 32'b0;end elsebegin    if (~axi_arready && S_AXI_ARVALID)begin// indicates that the slave has acceped the valid read addressaxi_arready <= 1'b1;// Read address latchingaxi_araddr  <= S_AXI_ARADDR;endelsebeginaxi_arready <= 1'b0;endend end       // Implement axi_arvalid generation// axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_ARVALID and axi_arready are asserted. The slave registers // data are available on the axi_rdata bus at this instance. The // assertion of axi_rvalid marks the validity of read data on the // bus and axi_rresp indicates the status of read transaction.axi_rvalid // is deasserted on reset (active low). axi_rresp and axi_rdata are // cleared to zero on reset (active low).  always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_rvalid <= 0;axi_rresp  <= 0;end elsebegin    if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)begin// Valid read data is available at the read data busaxi_rvalid <= 1'b1;axi_rresp  <= 2'b0; // 'OKAY' responseend   else if (axi_rvalid && S_AXI_RREADY)begin// Read data is accepted by the masteraxi_rvalid <= 1'b0;end                endend    // Implement memory mapped register select and read logic generation// Slave register read enable is asserted when valid address is available// and the slave is ready to accept the read address.assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;always @(*)begin// Address decoding for reading registerscase ( axi_araddr[5:0] )6'h00   : reg_data_out <= slv_reg0;6'h01   : reg_data_out <= slv_reg1;6'h02   : reg_data_out <= slv_reg2;6'h03   : reg_data_out <= slv_reg3;6'h04   : reg_data_out <= slv_reg4;6'h05   : reg_data_out <= slv_reg5;6'h06   : reg_data_out <= slv_reg6;6'h07   : reg_data_out <= slv_reg7;6'h08   : reg_data_out <= slv_reg8;6'h09   : reg_data_out <= slv_reg9;6'h0A   : reg_data_out <= slv_reg10;6'h0B   : reg_data_out <= slv_reg11;6'h0C   : reg_data_out <= slv_reg12;6'h0D   : reg_data_out <= slv_reg13;6'h0E   : reg_data_out <= slv_reg14;6'h0F   : reg_data_out <= slv_reg15;6'h10   : reg_data_out <= slv_reg16;6'h11   : reg_data_out <= slv_reg17;6'h12   : reg_data_out <= slv_reg18;6'h13   : reg_data_out <= slv_reg19;6'h14   : reg_data_out <= slv_reg20;6'h15   : reg_data_out <= slv_reg21;6'h16   : reg_data_out <= slv_reg22;6'h17   : reg_data_out <= slv_reg23;6'h18   : reg_data_out <= slv_reg24;6'h19   : reg_data_out <= slv_reg25;6'h1A   : reg_data_out <= slv_reg26;6'h1B   : reg_data_out <= slv_reg27;6'h1C   : reg_data_out <= slv_reg28;6'h1D   : reg_data_out <= slv_reg29;6'h1E   : reg_data_out <= slv_reg30;6'h1F   : reg_data_out <= slv_reg31;6'h20   : reg_data_out <= slv_reg32;6'h21   : reg_data_out <= slv_reg33;6'h22   : reg_data_out <= slv_reg34;6'h23   : reg_data_out <= slv_reg35;6'h24   : reg_data_out <= slv_reg36;6'h25   : reg_data_out <= slv_reg37;6'h26   : reg_data_out <= slv_reg38;6'h27   : reg_data_out <= slv_reg39;6'h28   : reg_data_out <= slv_reg40;6'h29   : reg_data_out <= slv_reg41;6'h2A   : reg_data_out <= slv_reg42;6'h2B   : reg_data_out <= slv_reg43;6'h2C   : reg_data_out <= slv_reg44;6'h2D   : reg_data_out <= slv_reg45;6'h2E   : reg_data_out <= slv_reg46;6'h2F   : reg_data_out <= slv_reg47;6'h30   : reg_data_out <= slv_reg48;6'h31   : reg_data_out <= slv_reg49;6'h32   : reg_data_out <= slv_reg50;6'h33   : reg_data_out <= slv_reg51;6'h34   : reg_data_out <= slv_reg52;6'h35   : reg_data_out <= slv_reg53;6'h36   : reg_data_out <= slv_reg54;6'h37   : reg_data_out <= slv_reg55;6'h38   : reg_data_out <= slv_reg56;6'h39   : reg_data_out <= slv_reg57;6'h3A   : reg_data_out <= slv_reg58;6'h3B   : reg_data_out <= slv_reg59;6'h3C   : reg_data_out <= slv_reg60;6'h3D   : reg_data_out <= slv_reg61;6'h3E   : reg_data_out <= slv_reg62;6'h3F   : reg_data_out <= slv_reg63;default : reg_data_out <= 0;endcaseend// Output register or memory read dataalways @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_rdata  <= 0;end elsebegin    // When there is a valid read address (S_AXI_ARVALID) with // acceptance of read address by the slave (axi_arready), // output the read dada if (slv_reg_rden)beginaxi_rdata <= reg_data_out;     // register read dataend   endend    // Add user logic here// User logic endsendmodule

工程鏈接:
工程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71348.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1. 對比 LVS 負載均衡群集的 NAT 模式和 DR 模式,比較其各自的優勢 。2. 基于 openEuler 構建 LVS-DR 群集。

DR 模式 * 負載各節點服務器通過本地網絡連接&#xff0c;不需要建立專用的IP隧道 原理&#xff1a;首先負載均衡器接收到客戶的請求數據包時&#xff0c;根據調度算法決定將請求發送給哪個后端的真實服務器&#xff08;RS&#xff09;。然后負載均衡器就把客戶端發送的請求數…

ollama server啟動服務后如何停止

要停止 Ollama 服務器服務&#xff0c;取決于如何啟動該服務的。以下是幾種常見的啟動方法和相應的停止服務的步驟&#xff1a; 1. 直接在命令行中啟動 如果是在命令行中直接啟動 Ollama 服務器的&#xff0c;例如使用以下命令&#xff1a; ollama serve 可以通過以下方式停…

【設計模式】03-理解常見設計模式-行為型模式(專欄完結)

前言 前面我們介紹完創建型模式和創建型模式&#xff0c;這篇介紹最后的行為型模式&#xff0c;也是【設計模式】專欄的最后一篇。 一、概述 行為型模式主要用于處理對象之間的交互和職責分配&#xff0c;以實現更靈活的行為和更好的協作。 二、常見的行為型模式 1、觀察者模…

mapbox基礎,使用geojson加載line線圖層,實現純色填充、圖片填充、虛線和漸變效果

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??line線圖層樣式二、??使用geojson加載…

深入淺出:CUDA是什么,如何利用它進行高效并行計算

在當今這個數據驅動的時代&#xff0c;計算能力的需求日益增加&#xff0c;特別是在深度學習、科學計算和圖像處理等領域。為了滿足這些需求&#xff0c;NVIDIA推出了CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;這是一種并行計算平臺和編程模…

LNMP+Zabbix安裝部署(Zabbix6.0 Lnmp+Zabbix Installation and Deployment)

LNMPZabbix安裝部署&#xff08;Zabbix6.0&#xff09; 簡介 LNMP&#xff08;Linux Nginx MySQL PHP&#xff09;是一種流行的Web服務器架構&#xff0c;廣泛用于搭建高性能的網站和應用程序。Zabbix 是一個開源的監控軟件&#xff0c;可以用來監控網絡、服務器和應用程序…

Docker 部署 Dify:輕松集成 Ollama 和 DeepSeek

1 Ollama的安裝及使用 1.1 什么是Ollama&#xff1f; Ollama 是一個用于本地部署和運行大型語言模型的框架。 Ollama 的作用包括&#xff1a; 本地模型運行&#xff1a;Ollama 允許在本地機器上運行大型語言模型&#xff08;如 LLaMA、DeepSeek 等&#xff09;&#xff0c;無…

C++筆記之標準庫中用于處理迭代器的`std::advance`和`std::distance`

C++筆記之標準庫中用于處理迭代器的std::advance和std::distance code review! 文章目錄 C++筆記之標準庫中用于處理迭代器的`std::advance`和`std::distance`一.`std::advance`函數原型參數說明使用場景示例代碼示例 1:移動 `std::vector` 的隨機訪問迭代器示例 2:移動 `st…

工業制造能耗管理新突破,漫途MTIC-ECM平臺助力企業綠色轉型!

在工業制造領域&#xff0c;能源消耗一直是企業運營成本的重要組成部分。隨著“雙碳”目標的推進&#xff0c;如何實現高效能耗管理&#xff0c;成為制造企業亟待解決的問題。漫途MTIC-ECM能源能耗在線監測平臺&#xff0c;結合其自研的硬件產品&#xff0c;為工業制造企業提供…

C語言——深入理解指針(2)(數組與指針)

文章目錄 數組名的理解使用指針訪問數組一維數組傳參的本質冒泡排序二級指針指針數組指針數組模擬二維數組 數組名的理解 之前我們在使用指針訪問數組內容時&#xff0c;有這樣的代碼&#xff1a; int arr[10]{1,2,3,4,5,6,7,8,9,10}; int* p&arr[0];這里我們使用&ar…

在Windows系統中安裝Open WebUI并連接Ollama

Open WebUI是一個開源的大語言模型&#xff08;LLM&#xff09;交互界面&#xff0c;支持本地部署與離線運行。通過它&#xff0c;用戶可以在類似ChatGPT的網頁界面中&#xff0c;直接操作本地運行的Ollama等大語言模型工具。 安裝前的核心要求&#xff1a; Python 3.11&#…

Day4:強化學習之Qlearning走迷宮

一、迷宮游戲 1.環境已知 迷宮環境是定義好的&#xff0c;障礙物位置和空位置是已知的&#xff1b; # 定義迷宮 grid [[0, 0, 0, 1, 0],[0, 1, 0, 1, 0],[0, 1, 0, 0, 0],[0, 0, 0, 1, 0],[0, 1, 1, 1, 0] ] 2.獎勵方式已知 如果碰到障礙物則得-1&#xff0c;如果到終點則…

家里WiFi信號穿墻后信號太差怎么處理?

一、首先在調制解調器&#xff08;俗稱&#xff1a;貓&#xff09;測試網速&#xff0c;網速達不到聯系運營商&#xff1b; 二、網線影響不大&#xff0c;5類網線跑500M完全沒問題&#xff1b; 三、可以在臥室增加輔助路由器&#xff08;例如小米AX系列&#xff09;90~200元區…

視點開場動畫實現(九)

這個相對比較簡單&#xff1a; void COSGObject::FlyTo(double lon, double lat, double hei) {theApp.bNeedModify TRUE;while(!theApp.bCanModify)Sleep(1);em->setViewpoint(osgEarth::Viewpoint("0",lon, lat, 0, 0, -45, hei), 2);theApp.bNeedModify FAL…

保姆級GitHub大文件(100mb-2gb)上傳教程

GLF&#xff08;Git Large File Storage&#xff09;安裝使用 使用GitHub desktop上傳大于100mb的文件時報錯 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…

HTML之JavaScript DOM(document)編程處理事件

HTML之JavaScript DOM&#xff08;document&#xff09;編程處理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Redis7——基礎篇(四)

前言&#xff1a;此篇文章系本人學習過程中記錄下來的筆記&#xff0c;里面難免會有不少欠缺的地方&#xff0c;誠心期待大家多多給予指教。 基礎篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09; 接上期內容&…

Sprinig源碼解析

前言 Spring 框架是 Java 企業級開發的基石&#xff0c;其源碼設計體現了模塊化、擴展性和靈活性。以下從 IoC 容器、AOP 實現、核心模塊和關鍵設計模式四個角度對 Spring 源碼進行深度解析&#xff0c;幫助理解其底層機制。即使Spring會使用的人見得就能使用。 一、IoC 容器源…

如何簡單的去使用jconsloe 查看線程 (多線程編程篇1)

目錄 前言 1.進程和線程 進程 PCB 的作用 并發編程和并行編程 線程 為什么選擇多線程編程 2.在IDEA中如何簡單創建一個線程 1. 通過繼承Thread類 2. 通過實現 Runnable 接口 3. 使用 Lambda 表達式 3.如何簡單使用jconsloe去查看創建好的線程 前言 2025來了,這是第…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析④】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase04 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月17日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-004測試用例 用例ID測試場景驗證要點參考條款預期結果TC…