亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nand_flash_ctl.v

?? nand flash control logic
?? V
?? 第 1 頁 / 共 2 頁
字號:
/*
clk is 125~250MHz
operation:
0~128KB is used as eprom for MCU, space greater than 128K is functioned 
  as a ATA PIO disk
1 read blk0:  when a new efm_r cmd is issued, if efm_addr[31:17] is "0",
  state machine will handle read sequence (read cmd, read data from buffer,
  buffer is 512 bytes, so if addr[16:9] "hit" bufferred (cache_adr), get data
  from buffer, otherwise from nand, then change cache_adr.

  blk0 give mcu initial 128KB code, then all other blocks will be accessed 
  (read and write) by mcu as below (similar as ATA PIO operation)
2. mcu w: fff5_0000, written data is cmd (data[7:0]), cle
       w: fff5_0004, addr (data[7:0]), ale
       w/r: fff5_0008, data (data[31:0]), no ale, no cle
       w: fff5_0010 [3:0]cmd pulse width
       r: fff5_0014 status (ecc and busy)
3. program: mcu w 512B into fff5_1000~fff5_11ff, the last write start program
   operation on NAND

port_adr map:

key factors:
blk0 can min write 1k times.
it contains 
 basic code which normally is not changed, and also include
 blk_map address, this address is also not changed normally, until that block 
 is written failed.
 by this way, the number of write on blk0 is minimized

1. each flash chip is logic block (64*512B) mapped physical blocks
   the 64 page in a block has a valid bit: 0: not written, 1 written
2. 3.125% (512 blocks) are assigned as spare blocks

flash read flow:
^^^^^^^^^^^^
error management
   move flash block
3. nand mechanism **********
2007-10-19 since eprom may have max 4MB space, it need 32 nand blocks (128K each)
while only block zero is guaranteed to be good, we use blk0 as a mapping table between a logic block and a physical block
operation steps:
3.1 use external board (e.g. a 8051 board) to establish a logic mapping table on block0, and program mcu codes etc to those
  good blocks.
3.2 put (soldering of use socket) nand on merced board
3.3 power-on, p0_flash has a state machine (init_sm) and a map ram (32*8),  which will read  block0 into map and cfg
3.4 convert normal efm cycles to coresponding nand cycles
3.5 mcu use the 4MB code to load 4M~1G space to ddr, then enable shadow, after that, mcu excute code from ddr.
3.6 reprogram: new code in ddr, mcu use software engine to program nand.
3.7 repeated power-on by step 3.3~3.6
*/     
`timescale 100ps/100ps
module p0_flash (
	clk,reset,
	in_efm_r,in_efm_w,data1efm,efm_addr,data2efm,efm_ack,
	mcu_r,mcu_w,mcu_adr,mcu_di,mcu_do,mcu_ack,
	ale, cle,re_,we_,
	data0, t_data,
	rb_, ce0_,ce1_,out_en,f_en
);
input clk,reset;
input in_efm_r,in_efm_w;
output efm_ack;
input [31:0] data1efm;
input [31:2] efm_addr;
output [31:0] data2efm;
input mcu_r,mcu_w; //mcu_if
output mcu_ack;
input [31:2] mcu_adr;
input [31:0] mcu_do;
output [31:0] mcu_di;
output ale; //flash group1 ------- pins: 41 per group
output cle,re_,we_;
input rb_; //rdy/busy_: may tie two together
output ce0_,ce1_,out_en,f_en;
input [7:0] data0;
output [7:0] t_data;
wire i_reset = reset;
wire req_len = 'h80; //dword
wire [7:0] ecc_data0,ecc_data1,ecc_data2,ecc_data3;
reg bf2ddr; //after read flash to bf, copy bf to ddr
wire ecc_done;
wire [7:0] data0_o,data0t;
reg w_cmd,q_w_cmd,r_cmd;
reg [3:0] q_cmd_width,pulse_cnt; 
reg [8:0] f_adr,d_f_adr;//512 adr
wire [9:0] ram_adr0,q_ram_adr;//q_ram_adr is common
wire end_w_cmd = !w_cmd & q_w_cmd;
reg [3:0] q_ctl_st,d_ctl_st;
always @(posedge clk or posedge reset)
    if (reset) q_cmd_width <=3;
    else if (mcu_w & {mcu_adr,2'b0}=='hfff5_0010) q_cmd_width <= mcu_do[3:0];
wire [3:0] cmd_width = (q_ctl_st==14)? q_cmd_width : q_cmd_width+4;
reg [31:0]  data2efm,d_data2efm;
reg efm_ack,d_efm_ack;
always @(posedge clk) efm_ack<=d_efm_ack;
always @(posedge clk) data2efm<=d_data2efm;

reg [7:0] d_data;
reg [2:0] q_mctl_st,d_mctl_st;
always @(posedge clk or posedge reset)
    if (reset) q_mctl_st<=0;
    else q_mctl_st<=d_mctl_st;   //tzt:  for mcu_w

always @(posedge clk or posedge reset)
    if (reset) w_cmd <=0; 
    else if (pulse_cnt==cmd_width) begin
       if (w_cmd)  w_cmd <=0;
       else if (q_mctl_st==1 | q_mctl_st==2 | q_mctl_st==3 |
//       else if (mcu_w & {mcu_adr,2'b0}=='hfff5_0008 |
	     q_ctl_st==1 | q_ctl_st==8 | q_ctl_st==9 | q_ctl_st==10 |
	     q_ctl_st==11 | q_ctl_st==12 | q_ctl_st==13 
	    ) w_cmd <=1; 
    end
always @(posedge clk or posedge reset)
    if (reset) q_w_cmd<=0;
    else if (w_cmd) q_w_cmd<=1; 
    else if (w_cmd==0) q_w_cmd <=0;
/*
 0: idle
 1: issue mcu cmd
 2: issue mcu adr
 3: mcu_wt_nand
 4: mcu_rd_nand
*/
always @(q_mctl_st or mcu_r or mcu_w or mcu_adr or mcu_do or pulse_cnt or cmd_width) begin
    d_mctl_st=q_mctl_st;
    case (q_mctl_st)
    0: if (mcu_adr[31:4]=='hfff5_000) begin
         d_data<=mcu_do[7:0];
	if (mcu_w)
	 case (mcu_adr[3:2])
	 0:	d_mctl_st=1; //issue cle
	 1:	d_mctl_st=2; //issue ale
	 2:	d_mctl_st=3; //wt data 
	 default:	d_mctl_st=0; //spare
         endcase
	// if (mcu_r & mcu_adr[3:2]==2'b10) d_mctl_st=4;
       end
    1: begin         //issue cle
//         if (pulse_cnt==cmd_width) d_mctl_st=0;
	 if (end_w_cmd) d_mctl_st=0;
       end
    2: begin         //issue ale
//         if (pulse_cnt==cmd_width) d_mctl_st=0;
	if (end_w_cmd) d_mctl_st=0;
       end
    3: begin         //issue wt_data
//         if (pulse_cnt==cmd_width) d_mctl_st=0;
	if (end_w_cmd) d_mctl_st=0;
       end
    4: begin         //read data
       end
    endcase
end
//wire end_512B=ram_adr0[8:0]=='h1ff;
wire end_512B=ram_adr0[9:0]=='h20f;
reg q_end_512B;
reg [1:0] bf_h; //bf_h sel 4*512B blocks 
always @(posedge clk or posedge reset)
    if (reset) q_end_512B<=0;
    else if (ecc_done) q_end_512B<=0;
    else if (end_512B) q_end_512B<=1;
/*
 0: idle, 
 1: rd efm, linefill 512B from nand
 2: efm rd within 512B
 3: pio rd, linefill 512B from nand
 4: pio wt, write to nand 
 5,6,7: spare
 8: issue 1st adr
 9: issue 2nd adr
 10: issue 3rd adr
 11: issue 4th adr
 12: issue 5th adr
 13: issue 2nd cmd "30"
 14,15: spare
*/
reg [7:0] blk0_quarter_page_num;
reg quarter_page_vld;
always @(posedge clk or posedge reset)
   if (reset) quarter_page_vld<=0;
   else if (q_ctl_st==15 & ecc_done) quarter_page_vld<=1;
/*
always @(posedge clk or posedge reset)
   if (reset) blk0_quarter_page_num<=0; //bf is 512B, need 0.25 page num
   else if (q_ctl_st==15 & ecc_done) blk0_quarter_page_num<=efm_addr[17:10]; 
wire quarter_hit = quarter_page_vld & efm_addr[17:10]==blk0_quarter_page_num;
wire page_hit = quarter_page_vld & efm_addr[17:12]==blk0_quarter_page_num[7:2];
wire [1:0] page_quarter=efm_addr[11:10];
*/
always @(posedge clk or posedge reset)
   if (reset) blk0_quarter_page_num<=0; //bf is 512B, need 0.25 page num
   else if (q_ctl_st==15 & ecc_done) blk0_quarter_page_num<={efm_addr[18:17],efm_addr[14:9]}; 
   else if (q_mctl_st!=0) blk0_quarter_page_num<=8'h1;  //tzt: 
wire quarter_hit = quarter_page_vld & {efm_addr[18:17],efm_addr[14:9]}==blk0_quarter_page_num;
wire page_hit = quarter_page_vld & {efm_addr[18:17],efm_addr[14:11]}==blk0_quarter_page_num[7:2];
wire [1:0] page_quarter=efm_addr[10:9];
wire pulse_change = pulse_cnt==cmd_width;
reg [7:0] cmd_adr,d_cmd_adr;
reg sel_cmd, h2f;
always @(posedge clk) cmd_adr<=d_cmd_adr;
always @(posedge clk or posedge reset)
    if (reset) q_ctl_st<=0;
    else  q_ctl_st<=d_ctl_st;
reg [1:0] access_cnt;
wire [1:0] page_quarter_plus1 = page_quarter+1;
always @(posedge clk or posedge reset)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久99| 天天影视色香欲综合网老头| 国产成人在线电影| 26uuu精品一区二区| 激情图片小说一区| 久久久蜜桃精品| 成人在线综合网| 亚洲精品国产视频| 欧美午夜电影网| 久久精品99国产精品| 久久久久久9999| 成人国产精品视频| 亚洲一二三专区| 日韩欧美在线123| 成人在线一区二区三区| 亚洲视频狠狠干| 欧美日本一区二区| 激情综合五月天| 国产精品福利一区二区三区| 欧美亚洲国产一区在线观看网站| 麻豆精品一区二区| 国产精品乱码一区二三区小蝌蚪| 91福利在线导航| 久久99日本精品| 最新不卡av在线| 日韩欧美高清dvd碟片| 成人激情文学综合网| 亚洲国产精品精华液网站 | 91在线国产福利| 亚洲一区二区视频在线| 日韩欧美综合在线| 97超碰欧美中文字幕| 日本欧美韩国一区三区| 国产精品灌醉下药二区| 日韩欧美国产1| 91成人国产精品| 国产69精品久久久久毛片| 亚瑟在线精品视频| 亚洲国产精品v| 6080午夜不卡| 色94色欧美sute亚洲线路二| 麻豆精品国产91久久久久久| 国产亚洲欧洲997久久综合| 在线观看av不卡| 粉嫩欧美一区二区三区高清影视| 亚洲成人av电影在线| 国产精品私人影院| 日韩三级视频在线观看| 91久久线看在观草草青青| 国产成人免费在线视频| 婷婷国产v国产偷v亚洲高清| 18欧美亚洲精品| 精品电影一区二区| 884aa四虎影成人精品一区| 色综合天天综合在线视频| 韩国精品免费视频| 日韩电影免费在线看| 亚洲一区在线免费观看| 国产精品久久久久久久久久免费看 | 国产婷婷色一区二区三区 | 国产成人av影院| 蜜臀99久久精品久久久久久软件| 亚洲一区二区三区在线看| 日本一区二区电影| 精品1区2区在线观看| 日韩一二三四区| 91麻豆精品国产91久久久久| 欧美午夜一区二区| 91久久国产最好的精华液| 成人午夜免费电影| 国产精品一区在线观看你懂的| 久久国产精品一区二区| 亚洲高清视频的网址| 午夜私人影院久久久久| 亚洲黄一区二区三区| 亚洲特黄一级片| 亚洲日本在线天堂| 一区二区三区中文免费| 一区二区在线观看不卡| 亚洲精品videosex极品| 一区二区三区四区在线| 亚洲精品国产成人久久av盗摄| 亚洲美腿欧美偷拍| 亚洲伊人色欲综合网| 亚洲一级在线观看| 日韩精彩视频在线观看| 精品在线播放免费| 国产在线麻豆精品观看| 九九精品视频在线看| 不卡高清视频专区| 免费不卡在线视频| 一区二区三区精品久久久| 久久久久久一级片| 久久综合国产精品| 国产亚洲精品超碰| 亚洲欧洲日产国码二区| 亚洲欧美色综合| 亚洲国产一二三| 另类欧美日韩国产在线| 国产精品99久久久久久似苏梦涵| av午夜一区麻豆| 在线观看不卡视频| 精品少妇一区二区三区免费观看| 国产亚洲女人久久久久毛片| 中文字幕一区在线观看视频| 一区二区在线看| 美女在线视频一区| av在线播放成人| 51精品秘密在线观看| 国产片一区二区| 亚洲午夜免费视频| 国内精品久久久久影院色| eeuss鲁片一区二区三区| 在线观看日产精品| 成人av一区二区三区| 国产精品拍天天在线| 亚洲欧美区自拍先锋| 日韩电影一区二区三区四区| 国产精品一二三四区| 欧美视频在线一区二区三区 | 欧美日韩二区三区| 久久精品欧美一区二区三区不卡| 亚洲精品美腿丝袜| 麻豆91免费看| 色国产综合视频| 久久精品视频在线看| 亚洲成人免费观看| 成人动漫在线一区| 欧美一区二区三区在线| 最新中文字幕一区二区三区 | 制服丝袜亚洲色图| 国产精品家庭影院| 九九精品视频在线看| 欧美三级电影网站| 亚洲国产精品av| 六月婷婷色综合| 欧美日本乱大交xxxxx| 国产精品国产三级国产a| 激情五月婷婷综合| 欧美日韩一区不卡| 日韩码欧中文字| 国产一区二区久久| 欧美三级在线看| 成人欧美一区二区三区1314| 国产精品亚洲视频| 欧美成人伊人久久综合网| 亚洲一本大道在线| 色哟哟国产精品| 国产精品麻豆视频| 国产不卡免费视频| 久久久综合视频| 另类的小说在线视频另类成人小视频在线| 91视频.com| 国产精品国产馆在线真实露脸| 国产盗摄女厕一区二区三区| 精品国产乱码久久久久久影片| 日韩国产精品久久久久久亚洲| 欧美在线视频你懂得| 亚洲视频在线观看三级| 国产69精品久久777的优势| xvideos.蜜桃一区二区| 精品在线免费观看| 精品美女在线观看| 久久国产尿小便嘘嘘尿| 精品国内片67194| 久久99精品国产.久久久久久 | 国产精品一区二区三区乱码| 精品国产精品网麻豆系列| 看电视剧不卡顿的网站| 日韩一区二区免费视频| 久久国产精品99久久人人澡| 日韩欧美在线不卡| 久久69国产一区二区蜜臀| 精品福利一区二区三区免费视频| 看国产成人h片视频| 久久亚洲一级片| 国产麻豆成人精品| 国产精品色在线| 99re视频精品| 亚洲国产精品自拍| 制服丝袜一区二区三区| 黑人巨大精品欧美一区| 国产视频一区二区在线观看| 成人黄色av网站在线| 亚洲人xxxx| 欧美精选一区二区| 国内外成人在线视频| 国产精品人妖ts系列视频| 色综合激情久久| 日韩电影免费在线| 久久日韩粉嫩一区二区三区| 91在线精品一区二区三区| 亚洲一级二级在线| 精品少妇一区二区三区在线播放 | 99视频精品全部免费在线| 亚洲精品国产第一综合99久久| 欧美高清激情brazzers| 国产美女在线观看一区| 亚洲精品乱码久久久久久黑人| 91精品欧美福利在线观看|