无效块建立程序.docx

上传人:b****8 文档编号:13142340 上传时间:2023-06-11 格式:DOCX 页数:18 大小:17.30KB
下载 相关 举报
无效块建立程序.docx_第1页
第1页 / 共18页
无效块建立程序.docx_第2页
第2页 / 共18页
无效块建立程序.docx_第3页
第3页 / 共18页
无效块建立程序.docx_第4页
第4页 / 共18页
无效块建立程序.docx_第5页
第5页 / 共18页
无效块建立程序.docx_第6页
第6页 / 共18页
无效块建立程序.docx_第7页
第7页 / 共18页
无效块建立程序.docx_第8页
第8页 / 共18页
无效块建立程序.docx_第9页
第9页 / 共18页
无效块建立程序.docx_第10页
第10页 / 共18页
无效块建立程序.docx_第11页
第11页 / 共18页
无效块建立程序.docx_第12页
第12页 / 共18页
无效块建立程序.docx_第13页
第13页 / 共18页
无效块建立程序.docx_第14页
第14页 / 共18页
无效块建立程序.docx_第15页
第15页 / 共18页
无效块建立程序.docx_第16页
第16页 / 共18页
无效块建立程序.docx_第17页
第17页 / 共18页
无效块建立程序.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

无效块建立程序.docx

《无效块建立程序.docx》由会员分享,可在线阅读,更多相关《无效块建立程序.docx(18页珍藏版)》请在冰点文库上搜索。

无效块建立程序.docx

无效块建立程序

建立无效块程序

//程序功能:

完成一片FLASH无效块建立。

/*程序流程:

首先,读取每一块第一页和第二页第2048个字节数据,

将其分别存入ramA和ramB中;

然后,再把ramA和ramB中的数据进行比较,若同

时为FF,则该块有效,否则该块无效。

最后,将块地址加1,直到检查完整片FLASH的所有块为至,invalid_over=1表示整片FlASH//无效块建立完成。

*/

moduleinvalid_block_cesu(

clk,

rst,

start,

data_in,

cle,

ce1,

ce2,

we,

ale,

re,

wp,

data_out,

invalid_flash_link,

invalid_table_addr,

invalid_in,

invalid_table_flag,

invalid_over,

state);

inputclk,rst,start;

input[7:

0]data_in;//FlASH反馈给FPGA的数据,检测

//I/O0的值,来说明各操作是否成功

outputcle,we,ale,re,wp,invalid_flash_link;

outputce1,ce2;

output[7:

0]data_out;//FPGA给FLASH的数据或地址

output[12:

0]invalid_table_addr; //无效块地址

outputinvalid_in; //每个块的无效块信息

outputinvalid_table_flag;//每个块无效块建立完成标志

outputinvalid_over; //整片FLASH无效块建立完成标志

output[4:

0]state;//无效块建立全过程的状态标志

regcle,we,ce,ale,re,wp;

reginvalid_flash_link,read_flag;

reg[7:

0]data_out;

reg[4:

0]state;

reg[9:

0]read_counter;

reg[33:

0]addr; //[33:

31]片选地址;

//[30:

18]块地址;

//[17:

12]页地址;

//[11:

0]每一页的2048个字节的地址

reg[1:

0]cnt;

reg[7:

0]ramA;//用来存每一块第一页第2048个字节的数据

reg[7:

0]ramB;//用来存每一块第二页第2048个字节的数据

reginvalid_in;

reginvalid_table_flag;

reginvalid_over;

reg[10:

0]wait_cycle;//执行完擦操作指令后的等待时间,

//即FLASH擦除每一块的需要的时间

wire[12:

0]invalid_table_addr;

wirece1,ce2; //一片FLASH的两个片选信号

assign invalid_table_addr=addr[30:

18];

//将内部addr赋于invalid_table_addr,

//给用于存储无效块信息的Ram

assignce1=(addr[33:

31]==3'd0)?

ce:

1;

//ce=0,选中FLASH第一小片

assignce2=(addr[33:

31]==3'd1)?

ce:

1;

//ce=1选中FLASH第二小片

parameterstep1=5'd0,

step2=5'd1,

step3=5'd2,

step4=5'd3,

step5=5'd4,

step6=5'd5,

step7=5'd6,

step8=5'd7,

step9=5'd8,

step10=5'd9,

step11=5'd10,

step12=5'd11,

step13=5'd12,

step14=5'd13,

step15=5'd14,

step16=5'd15,

step17=5'd16,

step18=5'd17,

step19=5'd18,

step20=5'd19,

step21=5'd20,

step22=5'd21,

step23=5'd22,

step24=5'd23,

step25=5'd24,

step26=5'd25,

step27=5'd26,

step28=5'd27;

always@(posedgeclk)

if(!

rst)

begin

state<=0;

cle<=1'b0;//命令锁存信号,高电平有效

ce<=1'b1;//片选信号,低电平有效

we<=1'b1;//写使能信号,低电平有效

ale<=1'b0;//地址锁存信号,高电平有效

re<=1'b1;//读使能信号,低电平有效

wp<=1'b0;//写保护信号,高电平有效

read_flag<=1'b0;

invalid_flash_link<=1'b0;

addr[33:

31]<=0;//片选初值

addr[30:

18]<=0;//块地址初值

addr[17:

12]<=0;//页地址初值

addr[11:

0]<=12'd2048;//页内地址第2048个字节初值

cnt<=0;

invalid_in<=0;

invalid_table_flag<=0;

ramA<=0;

ramB<=0;

invalid_over<=0;

wait_cycle<=0;

end

elseif(start==0)

begin

ce<=1'b1;

cle<=1'b0;

ce<=1'b1;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

wp<=1'b0;

end

else

case(state)

step1:

begin

addr[33:

31]<=addr[33:

31];addr[30:

18]<=addr[30:

18];

addr[17:

12]<=addr[17:

12];

addr[11:

0]<=12'd2048;

cle<=1'b1;

ce<=1'b0;

we<=1'b0;//一个ClK,写使能信号翻转一次

ale<=1'b0;

re<=1'b1;

wp<=1'b0;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

data_out<=8'h00;//读FLASH建立命令

invalid_in<=0;

invalid_table_flag<=0;

wait_cycle<=0;

invalid_over<=0;

state<=step2;

end

step2:

begin

cle<=1'b1;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

state<=step3;

end

step3:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b0;

ale<=1'b1;

re<=1'b1;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

data_out[7:

0]<=addr[7:

0];

//FPGA给FLASH列地址低8位

state<=step4;

end

step4:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b1;

re<=1'b1;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

state<=step5;

end

step5:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b0;

ale<=1'b1;

re<=1'b1;

wp<=1'b0;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

data_out[7:

4]<=4'd0;

data_out[3:

0]<=addr[11:

8];

//由FPGA给FLASH列地址高4位

state<=step6;

end

step6:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b1;

re<=1'b1;

invalid_flash_link<=1'b0;

state<=step7;

end

step7:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b0;

ale<=1'b1;

re<=1'b1;

data_out[7:

0]<=addr[19:

12];

//由FPGA给FLASH行地址低8位

invalid_flash_link<=1'b0;

state<=step8;

end

step8:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b1;

re<=1'b1;

invalid_flash_link<=1'b0;

state<=step9;

end

step9:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b0;

ale<=1'b1;

re<=1'b1;

wp<=1'b0;

invalid_flash_link<=1'b0;

data_out[7:

0]<=addr[27:

20];

//由FPGA给FLASH行地址次8位

state<=step10;

end

step10:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b1;

re<=1'b1;

invalid_flash_link<=1'b0;

state<=step11;

end

step11:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b0;

ale<=1'b1;

re<=1'b1;

invalid_flash_link<=1'b0;

data_out[7:

3]<=5'd0;

data_out[2:

0]<=addr[30:

28];

//由FPGA给FLASH行地址高3位

state<=step12;

end

step12:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b1;

re<=1'b1;

wp<=1'b0;

invalid_flash_link<=1'b0;

state<=step13;

end

step13:

begin

cle<=1'b1;

ce<=1'b0;

we<=1'b0;

ale<=1'b0;

re<=1'b1;

state<=step14;

data_out<=8'h30;//读确认命令

end

step14:

begin

cle<=1'b1;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

state<=step15;

end

step15:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

data_out<=8'h0;

state<=step16;

end

step16:

begin

wait_cycle<=wait_cycle+1;

if(wait_cycle==11'd1500)

state<=step17;//读FLASH每一块内第一页或//第二页的第2048个字节数据的

//等待时间

elsestate<=step16;

end

step17:

begin

invalid_flash_link<=1'b1;

state<=step18;

end

step18:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b0;

wp<=1'b0;

state<=step19;

end

step19:

begin

re<=1'b1;

state<=step20;

end

step20:

begin

state<=step21;

end

step21:

begin

ramA<=ramB;

//ramA中是每块第一页第2048个字节的数据

ramB<=data_in;

//ramB中是每块第二页第2048个字节的数据

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

state<=step22;

read_flag<=1'b1;

end

step22:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

cnt<=cnt+1;

addr[12]<=addr[12]+1;

//addr[12]只是在0与1之间变化,不产生进位,//为了读取每块第一页和第二页第2048个字节的

if(cnt==1)

begin

state<=step23;

cnt<=0;

end

else

state<=step1;

end

step23:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

if(ramA==8'hff&&ramB==8'hff)

//比较ramA与ramB的信息是否同时为FF

invalid_in<=1;

else

invalid_in<=0;

state<=step24;

end

step24:

begin

state<=step25;

end

step25:

begin

cle<=1'b0;

ce<=1'b0;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

read_flag<=1'b0;

invalid_flash_link<=1'b0;

invalid_table_flag<=1;

ramA<=0;

ramB<=0;

state<=step26;

end

step26:

begin

invalid_table_flag<=0;

state<=step27;

end

step27:

begin

if(addr[33:

18]==16'd65535) //[33:

31]=3d’1;

begin//[30:

18]=13d’8192;

state<=step28;

invalid_over<=1;

//整片FLASH无效块建立完成标志拉高

end

else

begin

state<=step1;

addr[33:

18]<=addr[33:

18]+1;

invalid_in<=1'b0;

end

end

step28:

begin

state<=step28;

invalid_in<=0;

invalid_table_flag<=0;

cle<=1'b0;

ce<=1'b1;

we<=1'b1;

ale<=1'b0;

re<=1'b1;

wp<=1'b0;

end

default:

e

state<=step1;

endcase

endmodule

/********************建立无效块结束****************/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2