国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ZYNQ AXI4總線訪問(wèn)DDR3實(shí)現(xiàn)圖像數(shù)據(jù)乒乓存儲(chǔ)與顯示

這篇具有很好參考價(jià)值的文章主要介紹了ZYNQ AXI4總線訪問(wèn)DDR3實(shí)現(xiàn)圖像數(shù)據(jù)乒乓存儲(chǔ)與顯示。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

前言

一、添加端口

二、添加局部變量

三、例化讀寫(xiě)FIFO

四、內(nèi)部變量修改,設(shè)置一次讀寫(xiě)進(jìn)行多少次突發(fā)操作

五、寫(xiě)地址

六、讀地址

七、狀態(tài)機(jī)

1.寫(xiě)狀態(tài)機(jī)

2.讀狀態(tài)機(jī)

總結(jié)



前言

在Altera FPGA進(jìn)行圖像處理時(shí),我們采用的存儲(chǔ)芯片為SDRAM,當(dāng)時(shí)參照正點(diǎn)原子的例程是封裝SDRAM控制器,然后像操作FIFO一樣去控制SDRAM?,F(xiàn)在換了ZYNQ的板子后,由于DDR3是掛載在PS端的,Xilinx官方提供了視頻接口的IP,但是IP這東西像個(gè)小黑盒子一樣,在開(kāi)發(fā)過(guò)程中遇到了問(wèn)題,極其不易排查,所以我就在官方的AXI4—FULL接口代碼上稍做修改,實(shí)現(xiàn)像以前一樣像操作FIFO一樣去操作PS端的DDR3。


一、添加端口

// Users to add ports here
//圖像數(shù)據(jù)寫(xiě)端口
input	wire			wr_clk,		//輸入像素時(shí)鐘
input	wire			wr_en,		//數(shù)據(jù)有效信號(hào)
input	wire	[15:0]	wr_data,	//像素?cái)?shù)據(jù)
	
//圖像數(shù)據(jù)讀端口
input	wire			rd_clk,		//輸入hdmi驅(qū)動(dòng)時(shí)鐘
input	wire			rd_en,		//讀請(qǐng)求
output	wire	[15:0]	rd_data,	//像素?cái)?shù)據(jù)

二、添加局部變量

觸發(fā)一次讀寫(xiě)DDR3的FIFO中的數(shù)據(jù)量設(shè)置為256,當(dāng)寫(xiě)FIFO中的數(shù)據(jù)量大于THRESHOLD進(jìn)行一次寫(xiě)操作的觸發(fā),當(dāng)讀FIFO中的數(shù)據(jù)量小于THRESHOLD時(shí)進(jìn)行一次讀操作的觸發(fā)。一幀圖像的最大存儲(chǔ)地址為FIRST_FRAME

// I/O Connections assignments
localparam THRESHOLD 	= 256 			;	//觸發(fā)寫(xiě)FIFO讀數(shù)據(jù)個(gè)數(shù)
localparam FIRST_FRAME 	= (640*480)*4 	;	//存儲(chǔ)最大值

三、例化讀寫(xiě)FIFO

用作數(shù)據(jù)緩存

// Add user logic here
    //寫(xiě)數(shù)據(jù)補(bǔ)位
    assign din_wr_fifo = {16'd0,wr_data};
    assign wr_en_wr_fifo = wr_en;
    assign rd_en_wr = wnext;
    //寫(xiě)FIFO
    wr_fifo inst_fifo (
 	.wr_clk(wr_clk),                			// input wire wr_clk
 	.rd_clk(M_AXI_ACLK),                		// input wire rd_clk
 	.din(din_wr_fifo),                  		// input wire [31 : 0] din
 	.wr_en(wr_en_wr_fifo),              		// input wire wr_en
 	.rd_en(rd_en_wr),                  			// input wire rd_en
 	.dout(dout_wr_fifo),                    	// output wire [31 : 0] dout
 	.full(full_wr_fifo),                    	// output wire full
 	.empty(empty_wr_fifo),                  	// output wire empty
 	.rd_data_count(rd_data_count_wr_fifo)  		// output wire [11 : 0] rd_data_count
    );
	
	assign rd_data = dout_rd_fifo[15:0];
	assign wr_en_rd_fifo = rnext;
	//讀FIFO
	rd_fifo inst_rd_fifo (
  	.wr_clk(M_AXI_ACLK),            // input wire wr_clk
  	.rd_clk(rd_clk),              // input wire rd_clk
  	.din(M_AXI_RDATA),              // input wire [63 : 0] din
  	.wr_en(wr_en_rd_fifo),                  // input wire wr_en
  	.rd_en(rd_en),                  // input wire rd_en
  	.dout(dout_rd_fifo),                    // output wire [31 : 0] dout
  	.full(full_rd_fifo),                    // output wire full
  	.empty(empty_rd_fifo),                  // output wire empty
  	.rd_data_count(rd_data_count_rd_fifo),  // output wire [11 : 0] rd_data_count
    .wr_data_count(wr_data_count_rd_fifo)   // output wire [10 : 0] wr_data_count
	);

四、內(nèi)部變量修改,設(shè)置一次讀寫(xiě)進(jìn)行多少次突發(fā)操作

將原本代碼里面C_MASTER_LENGTH 的數(shù)值12更改為10,原本的12表示一次讀寫(xiě)操作進(jìn)行64次突發(fā)操作,由于一次突發(fā)的數(shù)據(jù)量為16個(gè)32位的數(shù)據(jù),所以64*16=1024個(gè)數(shù)據(jù),與AXI4讀寫(xiě)DDR3的實(shí)驗(yàn)現(xiàn)象一致,更改位10的原因?yàn)樽屍湟淮巫x寫(xiě)的數(shù)據(jù)量保持跟設(shè)置的THRESHOLD 一致都為256,避免數(shù)據(jù)沖突。

五、寫(xiě)地址

由于DDR3可以自由設(shè)置數(shù)據(jù)存儲(chǔ)的地址,所以我們?cè)诖a內(nèi)部自己劃分讀寫(xiě)bank,從而可以實(shí)現(xiàn)乒乓操作。

always @(posedge M_AXI_ACLK)begin
	if(M_AXI_ARESETN == 0)begin
		bank_1 <= 2'b00;
	end
	else if((axi_awaddr[21:0] == FIRST_FRAME) && writes_done && bank_1 == 2'b00)begin
			bank_1 <= 2'b01;
	end
	else if((axi_awaddr[21:0] == FIRST_FRAME) && writes_done && bank_1 == 2'b01)begin
			bank_1 <= 2'b00;
	end
	else
		bank_1 <= bank_1;
end


  always @(posedge M_AXI_ACLK)                                         
	  begin                                                                
	    if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1)                                            
	      begin                                                            
	        axi_awaddr <= 'b0;
	        sw_bank_en <= 1'b0;
            rw_bank_flag <= 1'b0;                                             
	      end                                                              
	    else if (M_AXI_AWREADY && axi_awvalid)                             
	      begin
	           //bank0的剩余地址滿足一次突發(fā)長(zhǎng)度
	           if(axi_awaddr[21:0] < FIRST_FRAME - burst_size_bytes)begin
	               axi_awaddr <= axi_awaddr + burst_size_bytes;
	           end
			   //不滿足切換BANK
	           else begin
	               axi_awaddr <= {8'b0000_0000,bank_1,22'd0};
	           end               
	      end                                                            
	    else                                                               
	      axi_awaddr <= axi_awaddr;                                        
	    end

六、讀地址

讀地址操作與寫(xiě)地址類似。

七、狀態(tài)機(jī)

1.寫(xiě)狀態(tài)機(jī)

在原本官方狀態(tài)機(jī)上刪除讀狀態(tài)與讀寫(xiě)錯(cuò)誤判斷狀態(tài)。

  always @ ( posedge M_AXI_ACLK)                                                                            
	  begin                                                                                                     
	    if (M_AXI_ARESETN == 1'b0 )                                                                             
	      begin                                                                                                 
	        // reset condition                                                                                  
	        // All the signals are assigned default values under reset condition                                
	        mst_exec_state      <= IDLE;                                                                
	        start_single_burst_write <= 1'b0;                                                                                                                                  
	        compare_done      <= 1'b0;                                                                          
	        ERROR <= 1'b0;   
	      end                                                                                                   
	    else                                                                                                    
	      begin                                                                                                 
	                                                                                                            
	        // state transition                                                                                 
	        case (mst_exec_state)                                                                               
	                                                                                                            
	          IDLE:                                                                                     
	            // This state is responsible to wait for user defined C_M_START_COUNT                           
	            // number of clock cycles.                                                                      
				if ( init_txn_pulse == 1'b1 || rd_data_count_wr_fifo >= THRESHOLD)                                                      
	              begin                                                                                         
	                mst_exec_state  <= INIT_WRITE;
	                start_single_burst_write <= 1'b0;                                                                                                                                
	                ERROR <= 1'b0;
	                compare_done <= 1'b0;
	              end
	            else                                                                                            
	              begin                                                                                         
	                mst_exec_state  <= IDLE;                                                            
	              end                                                                                           
	                                                                                                            
	          INIT_WRITE:                                                                                       
	            // This state is responsible to issue start_single_write pulse to                               
	            // initiate a write transaction. Write transactions will be                                     
	            // issued until burst_write_active signal is asserted.                                          
	            // write controller                                                                             
	            if (writes_done)                                                                                
	              begin                                                                                         
	                mst_exec_state <= IDLE;//
	                start_single_burst_write <= 1'b0;                                                                                                                             
	              end                                                                                           
	            else                                                                                            
	              begin                                                                                         
	                mst_exec_state  <= INIT_WRITE;                                                              
	                                                                                                            
	                if (~axi_awvalid && ~start_single_burst_write && ~burst_write_active)                       
	                  begin                                                                                     
	                    start_single_burst_write <= 1'b1;                                                       
	                  end                                                                                       
	                else                                                                                        
	                  begin                                                                                     
	                    start_single_burst_write <= 1'b0; //Negate to generate a pulse                          
	                  end                                                                                       
	              end                                                                                                                                                                  
	          default :                                                                                         
	            begin                                                                                           
	              mst_exec_state  <= IDLE;                                                              
	            end                                                                                             
	        endcase                                                                                             
	      end                                                                                                   
	  end 

2.讀狀態(tài)機(jī)

與寫(xiě)狀態(tài)機(jī)類似,照著來(lái)就行

always @(posedge M_AXI_ACLK)begin
		if(M_AXI_ARESETN == 1'b0)begin
			curr_state      <= IDLE;                                                                                                                               
	        start_single_burst_read  <= 1'b0;
		end
		else begin
			case(curr_state)
				IDLE:	
					if(wr_data_count_rd_fifo < 2048-THRESHOLD)begin
						curr_state 		<= INIT_READ;                                                                 
						start_single_burst_read  <= 1'b0;
					end
					else begin
						curr_state		<= IDLE;
					end
				INIT_READ:
					if(reads_done)begin
						curr_state 		<= IDLE;                                                                
						start_single_burst_read  <= 1'b0;
					end
					else begin
						curr_state 		<= INIT_READ;
						if(~axi_arvalid && ~burst_read_active && ~start_single_burst_read)begin
							start_single_burst_read <= 1'b1;
						end
						else begin
							start_single_burst_read <= 1'b0;
						end
					end
				default :                                                                                         
					begin                                                                                           
						curr_state  <= IDLE;                                                              
					end
			endcase
		end
	end

總結(jié)

一開(kāi)始拿到AXI4總線我也是一頭霧水,但認(rèn)真看完總線介紹還是比較簡(jiǎn)單的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787489.html

到了這里,關(guān)于ZYNQ AXI4總線訪問(wèn)DDR3實(shí)現(xiàn)圖像數(shù)據(jù)乒乓存儲(chǔ)與顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • DDR3 控制器 MIG IP 詳解完整版 (AXI4&VIVADO&Verilog)

    DDR3 控制器 MIG IP 詳解完整版 (AXI4&VIVADO&Verilog)

    DDR系列文章分類地址: (1)DDR3 基礎(chǔ)知識(shí)分享 (2)DDR3 控制器 MIG IP 詳解完整版 (AXI4VivadoVerilog) (3)DDR3 控制器 MIG IP 詳解完整版 (nativeVivadoVerilog) (4)基于 DDR3 的串口傳圖幀緩存系統(tǒng)設(shè)計(jì)實(shí)現(xiàn) (5)基于 DDR3 的native接口串口局部傳圖緩存系統(tǒng)設(shè)計(jì)實(shí)現(xiàn) (6)基于 DDR3 的

    2024年02月11日
    瀏覽(29)
  • ZYNQ通過(guò)AXI DMA實(shí)現(xiàn)PL發(fā)送連續(xù)大量數(shù)據(jù)到PS DDR

    ZYNQ通過(guò)AXI DMA實(shí)現(xiàn)PL發(fā)送連續(xù)大量數(shù)據(jù)到PS DDR

    硬件:ZYNQ7100 軟件:Vivado 2017.4、Xilinx SDK 2017.4 ??ZYNQ PL 和 PS 的通信方式有 AXI GPIO、BRAM、DDR等。對(duì)于數(shù)據(jù)量較少、地址不連續(xù)、長(zhǎng)度規(guī)則的情況,BRAM 比較適用。而對(duì)于傳輸速度要求高、數(shù)據(jù)量大、地址連續(xù)的情況,比如 ADC,可以通過(guò) AXI DMA 來(lái)完成。 1、硬件設(shè)計(jì) 1.1 ZYNQ7

    2024年02月04日
    瀏覽(27)
  • 帶你快速入門(mén)AXI4總線--AXI4-Full篇(1)----AXI4-Full總線

    目錄 1、什么是AXI4-Full? 2、通道(Channel) 2.1、AXI 讀取傳輸事務(wù) 2.2、AXI 寫(xiě)入傳輸事務(wù)

    2024年02月01日
    瀏覽(21)
  • 基于fpga的ddr3讀寫(xiě)控制,純verilog實(shí)現(xiàn),能實(shí)現(xiàn)多通道圖像數(shù)據(jù)讀寫(xiě)控制

    基于fpga的ddr3讀寫(xiě)控制,純verilog實(shí)現(xiàn),能實(shí)現(xiàn)多通道圖像數(shù)據(jù)讀寫(xiě)控制

    基于fpga的ddr3讀寫(xiě)控制,純verilog實(shí)現(xiàn),能實(shí)現(xiàn)多通道圖像數(shù)據(jù)讀寫(xiě)控制,模塊接口清晰,可移植性高. 基于FPGA的DDR3讀寫(xiě)控制是一項(xiàng)重要的技術(shù),它為多通道圖像數(shù)據(jù)的讀寫(xiě)提供了高效的解決方案。本文將介紹一種純Verilog實(shí)現(xiàn)的DDR3讀寫(xiě)控制模塊,旨在實(shí)現(xiàn)模塊接口清晰、可移

    2024年04月12日
    瀏覽(41)
  • FPGA——AXI4總線詳解

    FPGA——AXI4總線詳解

    目錄 AXI4總線 1、什么是AXI 2、AXI4協(xié)議的優(yōu)勢(shì) AXI4的工作模式 AXI4讀操作: AXI4寫(xiě)操作 AXI4和AXI4-Lite、AXI4-Stream接口信號(hào) 握手信號(hào) AXI相關(guān)術(shù)語(yǔ) ??? AXI(Advanced eXtensible Interface高級(jí)可擴(kuò)展總線)是一種總線協(xié)議 ??? AXI4包含3種類型的接口: 1)AXI4:主要面向高性能地址映射通信的

    2024年02月02日
    瀏覽(25)
  • AXI4總線學(xué)習(xí)心得(一)

    AXI4總線學(xué)習(xí)心得(一)

    AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允許最大 256 輪的數(shù)據(jù)突發(fā)傳輸; AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一個(gè)輕量級(jí)的地址映射單次傳輸接口,占用很少的邏輯單元。 AXI4-Stream:

    2024年02月12日
    瀏覽(20)
  • 使用VIVADO中的MIG控制DDR3(AXI接口)一——AXI簡(jiǎn)介

    使用VIVADO中的MIG控制DDR3(AXI接口)一——AXI簡(jiǎn)介

    ? ? ? ? 最近,因?yàn)樾枰?,學(xué)習(xí)了AXI總線協(xié)議和DDR3相關(guān)的知識(shí),花了很多的時(shí)間去找各種相關(guān)的資料,深刻明白查資料的不容易,這里將所學(xué)到的東西做一個(gè)總結(jié),同時(shí)給需要的人提供一些便利,有問(wèn)題的歡迎一起討論學(xué)習(xí)、共同進(jìn)步。? ????????首先來(lái)說(shuō)一下有關(guān)AXI總

    2024年02月08日
    瀏覽(26)
  • FPGA AXI4總線信號(hào)介紹篇

    FPGA AXI4總線信號(hào)介紹篇

    AXI是一種總線協(xié)議,可以掛在多個(gè)master和slave: ????????(1)AXI4:主要面向高性能地址映射通信的需求;(突發(fā)數(shù)據(jù))(地址映射模式) ? ? ? ? (2)AXI4-Lite:是一個(gè)輕量級(jí)的,適用于吞吐量較小的地址映射通信總線;(無(wú)突發(fā))(地址映射模式) ? ? ? ? (3)AXI4-

    2024年04月11日
    瀏覽(27)
  • DDR3(AXI接口例程)知識(shí)點(diǎn)筆記

    本文以7035開(kāi)發(fā)板中的DDR3master例程對(duì)DDR3中所涉及的知識(shí)點(diǎn)梳理下筆記。 ① DDR支持的突發(fā)長(zhǎng)度是2,4,8 。即如果芯片的數(shù)據(jù)位寬是16bit的話那么接口數(shù)據(jù)位寬是32bit,64bit以及128bit。因?yàn)?L-Bank一次就存取兩倍于芯片位寬的數(shù)據(jù),所以芯片至少也要進(jìn)行兩次傳輸才可以。我認(rèn)為芯片

    2024年02月13日
    瀏覽(17)
  • 【FPGA】AXI4-Lite總線讀寫(xiě)B(tài)RAM

    【FPGA】AXI4-Lite總線讀寫(xiě)B(tài)RAM

    AXI協(xié)議基礎(chǔ)知識(shí) 。這篇博客比較詳細(xì)地介紹了AXI總線,并且羅列了所有的通道和端口,寫(xiě)代碼的時(shí)候可以方便地進(jìn)行查表。 AXI總線,AXI_BRAM讀寫(xiě)仿真測(cè)試 。 這篇文章為代碼的書(shū)寫(xiě)提供大致的思路,比如狀態(tài)機(jī)和時(shí)序的控制問(wèn)題,可以參考。 雙向握手機(jī)制的實(shí)質(zhì)是: 數(shù)據(jù)接

    2024年02月15日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包