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

FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH)

這篇具有很好參考價(jià)值的文章主要介紹了FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

(1)FLASH芯片 W25Q16BV

芯片引腳圖:
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

內(nèi)部結(jié)構(gòu)圖:
存儲(chǔ)區(qū)域總共分成了32塊,每塊64KB。每塊又分成了16個(gè)部分,每個(gè)部分4KB。方便進(jìn)行讀取和局部操作。
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式
電路設(shè)計(jì)
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

(2)SPI協(xié)議

SPI的四種模式
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

這里使用這個(gè)模式:
主機(jī)和從機(jī)在時(shí)鐘上升沿放入要輸出的數(shù)據(jù),在時(shí)鐘下降沿讀取要輸入的數(shù)據(jù)。
8個(gè)時(shí)鐘后交換一個(gè)字節(jié)8位數(shù)據(jù)(高位在前)。
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

(3)芯片部分命令

有個(gè)輸入時(shí)序的要求 開(kāi)始時(shí)CS拉低等待(tSLCH要求最小5ns)再開(kāi)始, 結(jié)束時(shí)CS拉高等待(tSHSL用100ns )再進(jìn)行下一次操作。
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

這個(gè)寄存器的第一位數(shù)據(jù)可以判斷操作是否完成(BUSY位)
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

1.Write Enable(06h)

寫(xiě)使能:開(kāi)始時(shí)CS拉低等待(tSLCH要求最小5ns)再開(kāi)始,結(jié)束時(shí)CS拉高等待(tSHSL取100ns )再進(jìn)行下一次操作。
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

2.Chip Erase (C7h / 60h)

整片擦除,要判斷操作是否完成
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

3.寫(xiě)指令(02h)

數(shù)據(jù)寫(xiě)多了會(huì)把之前的數(shù)據(jù)覆蓋掉,要判斷操作是否完成。
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

4.讀指令(03h)

要判斷操作是否完成
FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式

(4)代碼

1. FPGA做主機(jī)的SPI協(xié)議

FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH),FPGA,fpga開(kāi)發(fā),fpga,嵌入式
對(duì)信號(hào)進(jìn)行同步和提前準(zhǔn)備:
100m時(shí)鐘和clk_cnt配合進(jìn)行數(shù)據(jù)的讀取和輸出(clk_cnt有等于1和0的時(shí)候)
spi_clk基于100m時(shí)鐘輸出一個(gè)相當(dāng)于clk_cnt的延時(shí)半個(gè)周期的時(shí)鐘,確保輸入輸出數(shù)據(jù)穩(wěn)定。

module spi_drive(

	input             clk_100m      ,
	input             sys_rst_n     ,
	
	//user interface
	input             spi_start     ,//spi開(kāi)啟使能。
	input [7:0 ]      spi_cmd       ,//FLAH操作指令
	input [23:0]      spi_addr      ,//FLASH地址
	input [7:0 ]      spi_data      ,//FLASH寫(xiě)入的數(shù)據(jù)
	input [3:0 ]      cmd_cnt       ,
	
	output            idel_flag_r   ,//空閑狀態(tài)標(biāo)志的上升沿 
	output reg        w_data_req    ,//FLASH寫(xiě)數(shù)據(jù)請(qǐng)求 
	output reg [7:0]  r_data        ,//FLASH讀出的數(shù)據(jù)
	output reg        erro_flag     ,//讀出的數(shù)據(jù)錯(cuò)誤標(biāo)志
	
	//spi interface
	output reg        spi_cs        ,//SPI從機(jī)的片選信號(hào),低電平有效。
	output reg        spi_clk       ,//主從機(jī)之間的數(shù)據(jù)同步時(shí)鐘。
	output reg        spi_mosi      ,//數(shù)據(jù)引腳,主機(jī)輸出,從機(jī)輸入。
	input             spi_miso       //數(shù)據(jù)引腳,主機(jī)輸入,從機(jī)輸出。

);

//狀態(tài)機(jī)
parameter IDLE         =4'd0;//空閑狀態(tài)
parameter WEL          =4'd1;//寫(xiě)使能狀態(tài)
parameter S_ERA        =4'd2;//扇區(qū)擦除狀態(tài)
parameter C_ERA        =4'd3;//全局擦除
parameter READ         =4'd4;//讀狀態(tài)
parameter WRITE        =4'd5;//寫(xiě)狀態(tài)
parameter R_STA_REG    =4'd6;

//指令集
parameter WEL_CMD      =8'h06;
parameter S_ERA_CMD    =8'h20;
parameter C_ERA_CMD    =8'hc7;
parameter READ_CMD     =8'h03;
parameter WRITE_CMD    =8'h02;
parameter R_STA_REG_CMD=8'h05;

//wire define
wire      idel_flag;

//reg define
reg[3:0]  current_state  ;
reg[3:0]  next_state     ;
reg[7:0 ] data_buffer    ;
reg[7:0 ] cmd_buffer     ;
reg[7:0 ] sta_reg        ;
reg[23:0] addr_buffer    ;
reg[31:0] bit_cnt        ;
reg       clk_cnt        ;
reg       dely_cnt       ;
reg[31:0] dely_state_cnt ;
reg[7:0 ] rd_data_buffer ;
reg       spi_clk0       ;
reg       stdone         ;
reg[7:0 ] data_check     ;
reg       idel_flag0     ;
reg       idel_flag1     ;

//*****************************************************
//**                    main code
//*****************************************************

//*抓取上升沿
assign idel_flag=(current_state==IDLE)?1:0;//空閑狀態(tài)標(biāo)志
assign idel_flag_r=idel_flag0&&(~idel_flag1);//空閑狀態(tài)標(biāo)志的上升沿

//*抓取上升沿要用的
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)begin
		idel_flag0<=1'b1;
		idel_flag1<=1'b1;
	end
	else begin
		idel_flag0<=idel_flag;
		idel_flag1<=idel_flag0;
	end
end

//請(qǐng)求數(shù)據(jù) + 把數(shù)據(jù)放入buffer 
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		w_data_req<=1'b0;
	else if((bit_cnt+2)%8==0&&bit_cnt>=30&&clk_cnt==0&&current_state==WRITE) //提前2個(gè)時(shí)鐘周期
		w_data_req<=1'b1;
	else
		w_data_req<=1'b0;
end

always @(posedge clk_100m or negedge sys_rst_n )begin//讀出的數(shù)據(jù)移位寄存
	if(!sys_rst_n)
		rd_data_buffer<=8'd0;
	else if(bit_cnt>=32&&bit_cnt<=2080&&clk_cnt==0&&current_state==READ)									
		rd_data_buffer<={rd_data_buffer[6:0],spi_miso};
	else
		rd_data_buffer<=rd_data_buffer;
end

always @(posedge clk_100m or negedge sys_rst_n )begin//檢查讀出的數(shù)據(jù)是否正確
	if(!sys_rst_n)
		data_check<=8'd0;
	else if(bit_cnt%8==0&&bit_cnt>=40&&clk_cnt==1&&current_state==READ)
		data_check<=data_check+1'd1;
	else
		data_check<=data_check;
end

always @(posedge clk_100m or negedge sys_rst_n )begin//讀出的數(shù)據(jù)
	if(!sys_rst_n)
		r_data<=8'd0;
	else if(bit_cnt%8==0&&bit_cnt>38&&clk_cnt==1&&current_state==READ)
		r_data<=rd_data_buffer;
	else
		r_data<=r_data;
end

always @(posedge clk_100m or negedge sys_rst_n )begin//讀出的數(shù)據(jù)錯(cuò)誤標(biāo)志
	if(!sys_rst_n)
		erro_flag<=1'd0;
	else if(bit_cnt>32&&bit_cnt<=2080&&current_state==READ&&cmd_cnt==6)begin
		if(data_check!=r_data)
			erro_flag<=1'd1;
		else
			erro_flag<=erro_flag;
		end
	else
		erro_flag<=erro_flag;
end
	
//*把數(shù)據(jù)放入buffer 提前一個(gè)周期
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		data_buffer<=8'd0;
	else if((bit_cnt+1)%8==0&&bit_cnt>30&&clk_cnt==1)//*把數(shù)據(jù)放入buffer 提前一個(gè)周期
		data_buffer<=spi_data;
	else if(clk_cnt==1&&current_state==WRITE&&bit_cnt>=32)
		data_buffer<={data_buffer[6:0],data_buffer[7]};
	else
		data_buffer<=data_buffer;
end

//*----位移cmd指令存儲(chǔ)器 開(kāi)始:cs選中且dely未生效,提前了100mhz的周期------------
//使50mhz時(shí)數(shù)據(jù)提前半個(gè)周期獲得
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		cmd_buffer<=8'd0;
	else if(spi_cs==0&&dely_cnt==0)
		cmd_buffer<=spi_cmd;
	else if(clk_cnt==1&&(current_state==WEL||current_state==S_ERA||current_state==C_ERA
	       ||current_state==READ||current_state==WRITE||current_state==R_STA_REG)&&bit_cnt<8)
		cmd_buffer<={cmd_buffer[6:0],1'b1};
	else
		cmd_buffer<=cmd_buffer;
end

//取出地址每一位
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		addr_buffer<=8'd0;
	else if(spi_cs==0&&dely_cnt==0)
		addr_buffer<=spi_addr;
	else if(clk_cnt==1&&(current_state==READ||current_state==WRITE)&&bit_cnt>=8&&bit_cnt<32)
		addr_buffer<={addr_buffer[22:0],addr_buffer[23]};
	else
		addr_buffer<=addr_buffer;
end

//------------使能后clk_cnt輸出50M時(shí)鐘用于操作信號(hào)--------------
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		clk_cnt<=1'd0;
	else if(dely_cnt==1)
		clk_cnt<=clk_cnt+1'd1;
	else 
		clk_cnt<=1'd0;
end

//*---------cs選中器件后的信號(hào)輸出的  dely_cnt 可以認(rèn)為是使能操作------------
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		dely_cnt<=1'd0;
	else if(spi_cs==0)begin
	    if(dely_cnt<1)
			dely_cnt<=dely_cnt+1'd1;
		else
			dely_cnt<=dely_cnt;
	end
	else
		dely_cnt<=1'd0;
end

//*-----------------結(jié)束的延時(shí)計(jì)時(shí)器------------------------------------
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		dely_state_cnt<=1'd0;
	else if(spi_cs)begin
	    if(dely_state_cnt<400000000)
			dely_state_cnt<=dely_state_cnt+1'd1;
		else
			dely_state_cnt<=dely_state_cnt;
	end
	else
		dely_state_cnt<=1'd0;
end

//*-------------------------bit讀寫(xiě)計(jì)數(shù)---------------------
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		bit_cnt<=11'd0;
	else if(dely_cnt==1)begin
			if(clk_cnt==1'b1)
				bit_cnt<=bit_cnt+1'd1;
			else
				bit_cnt<=bit_cnt;
	end
	else
		bit_cnt<=11'd0;
end

狀態(tài)機(jī) :每個(gè)狀態(tài)該干什么,怎么轉(zhuǎn)移
修改里面的命令和轉(zhuǎn)態(tài)就可以移植到其他的地方了。

//三段式狀態(tài)機(jī)
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n)
		current_state<=IDLE;
	else
		current_state<=next_state;
end

always @(*)begin

	case(current_state)
	
	   IDLE: begin
	          if(spi_start&&spi_cmd==WEL_CMD)
				next_state=WEL;
			  else if(spi_start&&spi_cmd==C_ERA_CMD)
				next_state=C_ERA;
			  else if(spi_start&&spi_cmd==S_ERA_CMD)
				next_state=S_ERA;
			  else if(spi_start&&spi_cmd==READ_CMD)
				next_state=READ;
			  else if(spi_start&&spi_cmd==WRITE_CMD)
				next_state=WRITE;
			  else if(spi_start&&spi_cmd==R_STA_REG_CMD)
				next_state=R_STA_REG;
			  else
	            next_state=IDLE;
			end
	
		WEL: begin
			  if(stdone&&bit_cnt>=8)
				   next_state=IDLE;
			  else
		           next_state=WEL;
			  end
			 
		S_ERA: begin
				if(stdone)
					next_state=IDLE;
				else
					next_state=S_ERA;
				end
		C_ERA: begin		
				if(stdone)
					next_state=IDLE;
				else
					next_state=C_ERA;
				end
		READ: begin 		
				if(stdone&&bit_cnt>=8)
					next_state=IDLE;
				else
					next_state=READ;
				end
		WRITE: begin		
				 if(stdone&&bit_cnt>=8)
					next_state=IDLE;
				else
					next_state=WRITE;
				end
		R_STA_REG: begin		
				 if(stdone)
					next_state=IDLE;
				else
					next_state=R_STA_REG;
				end
		
	default: next_state=IDLE;			
	endcase				
end
									
always @(posedge clk_100m or negedge sys_rst_n )begin
	if(!sys_rst_n) begin
		spi_cs<=1'b1;
		spi_clk<=1'b0;
		spi_clk0<=1'b0;
		spi_mosi<=1'b0;	
		stdone<=1'b0;		
	end
	else begin
		case(current_state)
			IDLE: begin
				spi_cs<=1'b1;
				spi_clk<=1'b0;
				spi_mosi<=1'b0;				
			end
			
			WEL: begin
			     stdone<=1'b0;
				 spi_cs<=1'b0;
					 if(dely_cnt==1&&bit_cnt<8) begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=cmd_buffer[7];
						end
					 else if(bit_cnt==8&&clk_cnt==0)begin
					    stdone<=1'b1;
						spi_clk<=1'b0;						
						spi_mosi<=1'b0;						
					 end
					 else if(bit_cnt==8&&clk_cnt==1)begin
						spi_cs<=1'b1;						
				 end
				 end
			C_ERA: begin
					stdone<=1'b0;
			         if(dely_state_cnt==10)                
						spi_cs<=1'b0;
					 else if(dely_cnt==1&&bit_cnt<8) begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=cmd_buffer[7];
						end
					 else if(bit_cnt==8&&clk_cnt==0)begin
					    stdone<=1'b1;				    
						spi_clk<=1'b0;
						spi_mosi<=1'b0;	
					 end
					  else if(bit_cnt==8&&clk_cnt==1)begin
						spi_cs<=1'b1;						
				 end
				 end
			S_ERA: begin
			       stdone<=1'b0;				 
					if(dely_state_cnt==10)                
						spi_cs<=1'b0;
					 else if(dely_cnt==1&&bit_cnt<8) begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=cmd_buffer[7];
						end
					 else if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin
					    spi_cs<=1'b0;
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=addr_buffer[23];
					 end
					 else if(bit_cnt==32&&clk_cnt==0) begin
						spi_cs<=1'b1;
						spi_clk<=1'b0;
						spi_mosi<=1'b0;
						stdone<=1'b1;
					 end
				 end
            READ: begin
			      stdone<=1'b0;
				  if(dely_state_cnt==10)                
						spi_cs<=1'b0;
					else if(dely_cnt==1&&bit_cnt<8) begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=cmd_buffer[7];
						end
					 else if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin					    
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=addr_buffer[23];
					 end
					 else if(bit_cnt>=32&&bit_cnt<2080)begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=1'b0;						
					 end
					 else if(bit_cnt==2080&&clk_cnt==0) begin						
						spi_clk<=1'b0;
						spi_mosi<=1'b0;
						stdone<=1'b1;						
					 end
					  else if(bit_cnt==2080&&clk_cnt==1) begin
						spi_cs<=1'b1;
					 end
				 end
            WRITE: begin
			     stdone<=1'b0;
				  if(dely_state_cnt==10)                
						spi_cs<=1'b0;
					 else if(dely_cnt==1&&bit_cnt<8) begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=cmd_buffer[7];
						end
					 else if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin					   
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=addr_buffer[23];
					 end
					 else if(bit_cnt>=32&&bit_cnt<2080)begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=data_buffer[7];
					 end
					 else if(bit_cnt==2080&&clk_cnt==0) begin
						
						spi_clk<=1'b0;
						spi_mosi<=1'b0;
						stdone<=1'b1;
					 end
					  else if(bit_cnt==2080&&clk_cnt==1) begin
						spi_cs<=1'b1;
					 end
                  end
			R_STA_REG:begin				              
						stdone<=1'b0;
				     if(dely_state_cnt==10)                
						spi_cs<=1'b0;
					else if(dely_cnt==1&&bit_cnt<8)begin						
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=cmd_buffer[7];
						end
					 else if(bit_cnt==8)begin					   				    
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
						spi_mosi<=1'b0;						
					 end                      				 
					  else if(~spi_miso&&bit_cnt%8==0)begin
					    spi_clk<=1'b0;
						spi_cs<=1'b1;
						stdone<=1'b1;
				      end
					 else if(~spi_cs&&dely_cnt==1)begin
						spi_clk0<=~spi_clk0;
						spi_clk<=spi_clk0;
				 end	   			         	 
			  end 
             default: begin
			            stdone<=1'b0;
                        spi_cs<=1'b1;
				        spi_clk<=1'b0;
						spi_clk0<=1'b0;
				        spi_mosi<=1'b0;				        
			end
         endcase
	end
end

endmodule

2. SPI協(xié)議的使用

首先系統(tǒng)開(kāi)始運(yùn)行,來(lái)幾個(gè)周期延伸。
spi_start信號(hào)只是一個(gè)周期脈沖。
idel_flag_r是進(jìn)入空閑狀態(tài)的標(biāo)志位也就是意味著上一步操作完成。
cmd計(jì)數(shù)指令不斷加來(lái)切換不同的命令。
spi_cmd 輸出命令文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-755619.html

module flash_rw(

	input            sys_clk      ,
	input            sys_rst_n    ,
	
	input            idel_flag_r  ,
	input            w_data_req   ,
	output reg[3:0 ] cmd_cnt      ,
	output reg       spi_start    ,//spi開(kāi)啟使能。
	output reg[7:0 ] spi_cmd      ,
	output reg[7:0 ] spi_data      
   
);

//指令集
parameter WEL_CMD      =16'h06;
parameter S_ERA_CMD    =16'h20;
parameter C_ERA_CMD    =16'hc7;
parameter READ_CMD     =16'h03;
parameter WRITE_CMD    =16'h02;
parameter R_STA_REG_CMD=8'h05 ;

//reg define
reg[3:0] flash_start;


//SPI 要寫(xiě)入的數(shù)據(jù)
always @(posedge sys_clk or negedge sys_rst_n )begin
	if(!sys_rst_n)
		flash_start<=0;
	else if(flash_start<=5)
	    flash_start<=flash_start+1;
	else
		flash_start<=flash_start;
end

always @(posedge sys_clk or negedge sys_rst_n )begin
	if(!sys_rst_n)
		cmd_cnt<=0;
	else if(flash_start==4)
	    spi_start<=1'b1;
	else if(idel_flag_r&&cmd_cnt<10)begin
	    cmd_cnt<=cmd_cnt+1;
		spi_start<=1'b1;
	end
	else begin
		cmd_cnt<=cmd_cnt;
		spi_start<=1'b0;
	end
end

always @(posedge sys_clk or negedge sys_rst_n )begin
	if(!sys_rst_n)
		spi_data<=8'd0;
	else if(w_data_req)
		spi_data<=spi_data+1'b1;
	else
		spi_data<=spi_data;
end

always @(*)begin
	case(cmd_cnt)
		0:spi_cmd=WEL_CMD;
		1:spi_cmd=C_ERA_CMD;
		2:spi_cmd=R_STA_REG_CMD;
		3:spi_cmd=WEL_CMD;
		4:spi_cmd=WRITE_CMD;
		5:spi_cmd=R_STA_REG_CMD;
		6:spi_cmd=READ_CMD;
		7:spi_cmd=WEL_CMD;
		8:spi_cmd=S_ERA_CMD;
		9:spi_cmd=R_STA_REG_CMD;
		10:spi_cmd=READ_CMD;
		
	default:;
	endcase
end

endmodule

到了這里,關(guān)于FPGA模塊——SPI協(xié)議(讀寫(xiě)FLASH)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 基于FPGA 外置qspi Flash的讀寫(xiě)

    1.寫(xiě)在前面 FPGA內(nèi)部不具有掉電存儲(chǔ)程序的功能,所以都需要外置的flash存儲(chǔ)器來(lái)存儲(chǔ)程序,上電后從flash加載程序到FPGA中運(yùn)行。外置的flash可以存儲(chǔ)程序,也可以存儲(chǔ)任何用戶數(shù)據(jù),可以更有效的利用flash的存儲(chǔ)空間。 值得注意的是,用于存儲(chǔ)程序的flash和fpga連接用的是fpga的

    2024年02月12日
    瀏覽(22)
  • 【FPGA】SPI-FLASH-M25P16手冊(cè)解讀

    【FPGA】SPI-FLASH-M25P16手冊(cè)解讀

    M25P16概述: M25P16是一款帶有先進(jìn)寫(xiě)保護(hù)機(jī)制和高速SPI總線訪問(wèn)的串行Flash存儲(chǔ)器。M25P16特點(diǎn)如下: 存儲(chǔ)結(jié)構(gòu):16M Bit(2M Byte)的存儲(chǔ)空間,一共32個(gè)扇區(qū)(sector),每個(gè)扇區(qū)256頁(yè),每頁(yè)256字節(jié),每個(gè)字節(jié)的的存儲(chǔ)地址由扇區(qū)地址(8bit)+頁(yè)地址(8bit)+字節(jié)地址(8bit)構(gòu)成。 SP

    2024年02月04日
    瀏覽(20)
  • FPGA怎么讀寫(xiě)外部FLASH中的用戶數(shù)據(jù)?(超詳細(xì))

    FPGA怎么讀寫(xiě)外部FLASH中的用戶數(shù)據(jù)?(超詳細(xì))

    一、 軟件平臺(tái)與硬件平臺(tái) 軟件平臺(tái): 1、操作系統(tǒng):Windows-8.1 2、開(kāi)發(fā)套件:ISE14.7 3、仿真工具:ModelSim-10.4-SE 4、Matlab版本:Matlab2014b/Matlab2016a 硬件平臺(tái): 1、 FPGA型號(hào):Xilinx公司的XC6SLX45-2CSG324 2、 Flash型號(hào):WinBond公司的W25Q128BV?? Quad SPI Flash存儲(chǔ)器 提示:如果圖片不清晰,請(qǐng)

    2024年02月07日
    瀏覽(22)
  • FPGA解析串口指令控制spi flash完成連續(xù)寫(xiě)、讀、擦除數(shù)據(jù)

    FPGA解析串口指令控制spi flash完成連續(xù)寫(xiě)、讀、擦除數(shù)據(jù)

    最近在收拾抽屜時(shí)找到一個(gè)某寶的spi flash模塊,如下圖所示,我就想用能不能串口來(lái)讀寫(xiě)flash,大致過(guò)程就是,串口向fpga發(fā)送一條指令,fpga解析出指令控制flah,這個(gè)指令協(xié)議目前就是: 55 + AA + CMD + LEN_h + LEN_m + LEN_l + DATA CMD:01 寫(xiě);02 讀;03 擦除(片擦除); LEN_h/m/l:三個(gè)字

    2024年02月03日
    瀏覽(18)
  • K7系列FPGA進(jìn)行FLASH讀寫(xiě)1——CCLK控制(STARTUPE2原語(yǔ))

    K7系列FPGA進(jìn)行FLASH讀寫(xiě)1——CCLK控制(STARTUPE2原語(yǔ))

    ??最近的工作涉及對(duì) FPGA 進(jìn)行遠(yuǎn)程更新,也就是通過(guò)遠(yuǎn)程通信接口將 .bin 文件送到 FPGA,然后寫(xiě)入 FLASH,這樣當(dāng) FPGA 重新上電后就可以執(zhí)行更新后的程序了。因此第一步工作就是進(jìn)行 FLASH 的讀寫(xiě)控制。 ??然而如果嘗試配置 FLASH 管腳時(shí),會(huì)發(fā)現(xiàn) CCLK 管腳是不可配置的,這

    2024年02月05日
    瀏覽(31)
  • 嵌入式開(kāi)發(fā)--STM32G4系列片上FLASH的讀寫(xiě)

    嵌入式開(kāi)發(fā)--STM32G4系列片上FLASH的讀寫(xiě)

    這個(gè)玩意吧,說(shuō)起來(lái)很簡(jiǎn)單,就是幾行代碼的事,但楞是折騰了我大半天時(shí)間才搞定。原因后面說(shuō),先看代碼吧: 讀操作很簡(jiǎn)單,以32位方式讀取的時(shí)候是這樣的: 需要注意的是,當(dāng)以32位方式讀取時(shí),地址需要是4的整數(shù)倍,即32位。 8位或16位方式類似操作即可 需要注意的

    2024年01月18日
    瀏覽(98)
  • 【正點(diǎn)原子FPGA連載】第十五章eMMC讀寫(xiě)測(cè)試實(shí)驗(yàn) 摘自【正點(diǎn)原子】DFZU2EG_4EV MPSoC之嵌入式Vitis開(kāi)發(fā)指南

    【正點(diǎn)原子FPGA連載】第十五章eMMC讀寫(xiě)測(cè)試實(shí)驗(yàn) 摘自【正點(diǎn)原子】DFZU2EG_4EV MPSoC之嵌入式Vitis開(kāi)發(fā)指南

    1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子MPSoC開(kāi)發(fā)板 2)平臺(tái)購(gòu)買(mǎi)地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套實(shí)驗(yàn)源碼+手冊(cè)+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html eMMC是一種嵌入式多媒體存儲(chǔ)卡,它具有存儲(chǔ)容量大、傳輸速度快、易于使用等優(yōu)點(diǎn),主要應(yīng)用于對(duì)存儲(chǔ)容量有

    2024年02月06日
    瀏覽(16)
  • 【FPGA】SPI協(xié)議

    【FPGA】SPI協(xié)議

    SPI(Serial Perripheral Interface, 串行外圍設(shè)備接口)是 Motorola 公司推出的一種同步串行接口技術(shù)。SPI 總線在物理上是通過(guò)接在外圍設(shè)備微控制器(PICmicro) 上面的微處理控制單元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模塊(Module)來(lái)實(shí)現(xiàn)的, 它允許 MCU 以全雙工的同步串行方式

    2024年02月09日
    瀏覽(16)
  • 【LabVIEW FPGA入門(mén)】LabVIEW FPGA 實(shí)現(xiàn)SPI通信協(xié)議

    【LabVIEW FPGA入門(mén)】LabVIEW FPGA 實(shí)現(xiàn)SPI通信協(xié)議

    ????????該實(shí)現(xiàn)由兩個(gè)組件組成:在 LabVIEW FPGA 中實(shí)現(xiàn)的 SPI 協(xié)議以及用于從主機(jī) PC 或?qū)崟r(shí)控制器與 FPGA 進(jìn)行通信的 LabVIEW 主機(jī)接口。該架構(gòu)允許從單個(gè)主機(jī)程序控制多個(gè) SPI 端口,同時(shí)仍然允許定制 FPGA VI 以進(jìn)行其他數(shù)據(jù)采集和處理。該實(shí)現(xiàn)不使用任何DMA(直接內(nèi)存訪問(wèn)

    2024年01月17日
    瀏覽(41)
  • FPGA DAC模塊 SPI通信

    FPGA DAC模塊 SPI通信

    1.串行外設(shè)接口(SPI)是微控制器和外圍IC(如傳感器、ADC、DAC、移位寄存器、SRAM等)之間使用最廣泛的接口之一。 2.SPI是一種同步、全雙工、主從式接口。來(lái)自主機(jī)或從機(jī)的數(shù)據(jù)在時(shí)鐘上升沿或下降沿同步。主機(jī)和從機(jī)可以同時(shí)傳輸數(shù)據(jù)。SPI接口可以是3線式或4線式。 ? ?SPI總

    2024年02月11日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包