📄 mx25l8005.v
字号:
// task enter_4kb_sector;// begin// //$display( $stime, " Old Enter 4kb Sector Register = %b", enter4kbmode );// forever begin// @( posedge CS );// if( CS == 1'b1 ) begin // if ( dpmode == 1'b0 ) begin // do work on non deep power down mode (1)// if (status_reg[0] == 1'b0) begin // WIP (2)// enter4kbmode = 1;// //$display( $stime, " New Enter 4kb Sector Register = %b", enter4kbmode );// disable enter_4kb_sector;// end // end // end// end // end forever // end// endtask// // /*---------------------------------------------------------------*/// /* Description: define a exit 4kb sector task */// /*---------------------------------------------------------------*/// task exit_4kb_sector;// begin// //$display( $stime, " Old Enter 4kb Sector Register = %b", enter4kbmode );// forever begin// @( posedge CS );// if( CS == 1'b1 ) begin // if ( dpmode == 1'b0 ) begin // do work on non deep power down mode (1)// if (status_reg[0] == 1'b0) begin // WIP (2)// enter4kbmode = 0;// //$display( $stime, " New Enter 4kb Sector Register = %b", enter4kbmode );// disable exit_4kb_sector;// end // end // end // end // end forever // end// endtask// /*---------------------------------------------------------------*/ /* Description: define a release from deep power dwon task (RDP)*/ /*---------------------------------------------------------------*/ task release_from_deep_power_dwon; begin //$display( $stime, " Old DP Mode Register = %b", dpmode ); forever begin @( posedge SCLK or posedge CS ); if( CS == 1'b1 ) begin dpmode <= #tRES2 1'b0; //$display( $stime, " New DP Mode Register = %b", dpmode ); disable release_from_deep_power_dwon; end else begin //$display( $stime, " Enter Read Electronic ID Function ..."); dummy_cycle( 23 ); read_electronic_id; //$display( $stime, " Leave Read Electronic ID Function ..."); disable release_from_deep_power_dwon; end end // end forever end endtask /*---------------------------------------------------------------*/ /* Description: define a read electronic ID (RES) */ /* AB X X X */ /*---------------------------------------------------------------*/ task read_electronic_id; reg [ 7:0 ] dummy_ID; begin //$display( $stime, " Old DP Mode Register = %b", dpmode ); if (pmode == 0) begin {ENB_S0,ENB_P0,ENB_S1,ENB_P1} = {1'b1,1'b0,1'b0,1'b0}; end else begin {ENB_S0,ENB_P0,ENB_S1,ENB_P1} = {1'b0,1'b1,1'b0,1'b0}; end dummy_ID = ID_Device; forever begin @( negedge SCLK or posedge CS ); if( CS == 1'b1 ) begin if (pmode == 0) begin {ENB_S0,ENB_P0,ENB_S1,ENB_P1} = {1'b1,1'b0,1'b0,1'b0}; end else begin {ENB_S0,ENB_P0,ENB_S1,ENB_P1} = {1'b0,1'b1,1'b0,1'b0}; end {SO_reg,PO_reg6,PO_reg5,PO_reg4,PO_reg3,PO_reg2,PO_reg1,PO_reg0} <= #tCLQV {1'bz,1'bz,1'bz,1'bz,1'bz,1'bz,1'bz,1'bz}; dpmode <= #tRES2 1'b0; //$display( $stime, " New DP Mode Register = %b", dpmode ); disable read_electronic_id; end else begin if ( pmode == 1'b0 ) begin { SO_reg, dummy_ID } <= #tCLQV { dummy_ID, dummy_ID[ 7 ] }; end else begin SO_reg <= #tCLQV ID_Device; end end end // end forever end endtask /*-----------------------------------------------------------------*/ /* Description: define a read electronic manufacturer & device ID */ /*-----------------------------------------------------------------*/ task read_electronic_manufacturer_device_id; reg [ 15:0 ] dummy_ID; integer dummy_count; begin //$width(negedge SCLK,1); //$period( posedge SCLK, tCY ); // SCLK _/~ -> _/~ if ( si_reg[0]==1'b0 ) begin dummy_ID = {ID_MXIC,ID_Device}; end else begin dummy_ID = {ID_Device,ID_MXIC}; end dummy_count = 0; forever begin @( negedge SCLK or posedge CS ); if ( CS == 1'b1 ) begin if ( dpmode == 1'b0 ) begin // do work on non deep power down mode SO_reg <= #tCLQV 1'bz; end disable read_electronic_manufacturer_device_id; end else begin if ( dpmode == 1'b0 ) begin // do work on non deep power down mode if ( pmode == 1'b0) begin // check parallel mode (2) { SO_reg, dummy_ID } <= #tCLQV { dummy_ID, dummy_ID[ 15 ] }; end else begin if ( dummy_count == 0 ) begin SO_reg = #tCLQV dummy_ID[15:8]; dummy_count = 1; end else begin SO_reg = #tCLQV dummy_ID[7:0]; dummy_count = 0; end end end end end // end forever end endtask /*---------------------------------------------------------------*/ /* Description: define a program chip task */ /* INPUT */ /* segment: segment address */ /* offset : offset address */ /*---------------------------------------------------------------*/ task update_array; input [12:0] segment; input [7:0] offset; reg [`FLASH_ADDR - 1:0] rom_addr; // rom_addr = {segment, offset} integer dummy_count, tmp_int; reg [`SECTOR_ADDR - 1:0] sector; begin dummy_count = 256; /*------------------------------------------------*/ /* Store 256 bytes back to ROM Page */ /*------------------------------------------------*/ if ( dpmode == 1'b0 ) begin // do work on non deep power down mode (1) if (status_reg[0] == 1'b0) begin // WIP (2) sector[`SECTOR_ADDR - 1:0] = rom_addr[`FLASH_ADDR - 1:12]; if ( wp_reg !=1'b0 || status_reg[7]!=1'b1 ) begin // protected mode (3) if ( status_reg[1] == 1'b1 ) begin // WEL:Write Enable Latch (4) if ( protected_area(sector[`SECTOR_ADDR - 1:0]) == 1'b0 ) begin // check protected area (5) // initial start rom addrress offset = 8'h00; rom_addr[`FLASH_ADDR - 1:0] = { segment[12:0], offset[7:0] }; // in write operation status_reg[0]<= 1'b1; // not in write operation after PROG_TIME status_reg[0]<= #`PROG_TIME 1'b0; // WEL : write enable latch status_reg[1]<= #`PROG_TIME 1'b0; while ( dummy_count ) begin rom_addr[`FLASH_ADDR - 1:0] = { segment[12:0], offset[7:0] }; dummy_count = dummy_count - 1; tmp_int = dummy_count << 3; /* byte to bit */ ROM_ARRAY[ rom_addr ] <= #`PROG_TIME { dummy_A[ tmp_int+7 ], dummy_A[ tmp_int+6 ], dummy_A[ tmp_int+5 ], dummy_A[ tmp_int+4 ], dummy_A[ tmp_int+3 ], dummy_A[ tmp_int+2 ], dummy_A[ tmp_int+1 ], dummy_A[ tmp_int ] }; offset = offset + 1; end end // end protected area end // end WEL:Write Enable Latch end end end end endtask /*---------------------------------------------------------------*/ /* Description: define a protected_area area function */ /* INPUT */ /* sector : sector address */ /*---------------------------------------------------------------*/ function protected_area; input [7:0] sector; begin `ifdef MX25L4005 if (status_reg[5:2]==4'b0000) begin protected_area = 1'b0; end else if (status_reg[5:2]==4'b0001) begin if (sector[`SECTOR_ADDR - 1:4] == 7) begin protected_area = 1'b1; end else begin protected_area = 1'b0; end end else if (status_reg[5:2]==4'b0010) begin if (sector[`SECTOR_ADDR - 1:4] >= 6 && sector[`SECTOR_ADDR - 1:4] <= 7) begin protected_area = 1'b1; end else begin protected_area = 1'b0; end end else if (status_reg[5:2]==4'b0011) begin if (sector[`SECTOR_ADDR - 1:4] >= 4 && sector[`SECTOR_ADDR - 1:4] <= 7) begin protected_area = 1'b1; end else begin protected_area = 1'b0; end end else if (status_reg[5:2]==4'b0100) begin protected_area = 1'b1; end else if (status_reg[5:2]==4'b0101) begin protected_area = 1'b1; end else if (status_reg[5:2]==4'b0110) begin protected_area = 1'b1; end else if (status_reg[5:2]==4'b0111) begin protected_area = 1'b1; end else begin protected_area = 1'b1; end `else `ifdef MX25L8005 if (status_reg[5:2]==4'b0000) begin protected_area = 1'b0; end else if (status_reg[5:2]==4'b0001) begin if (sector[`SECTOR_ADDR - 1:4] == 15) begin protected_area = 1'b1; end else begin protected_area = 1'b0; end end else if (status_reg[5:2]==4'b0010) begin if (sector[`SECTOR_ADDR - 1:4] >= 14 && sector[`SECTOR_ADDR - 1:4] <= 15) begin protected_area = 1'b1; end else begin protected_area = 1'b0; end end else if (status_reg[5:2]==4'b0011) begin if (sector[`SECTOR_ADDR - 1:4] >= 12 && sector[`SECTOR_ADDR - 1:4] <= 15) begin protected_area =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -