⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mx25l8005.v

📁 Verilog based simluation model for MXIC SPI Flash.
💻 V
📖 第 1 页 / 共 5 页
字号:
//    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 + -