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

📄 mx25l4005a.v

📁 Verilog based simluation model for MXIC SPI Flash.
💻 V
📖 第 1 页 / 共 5 页
字号:
            end
            forever begin
             @( posedge CS );
               if( CS == 1'b1 ) begin 
                  if ( dpmode == 1'b0 ) begin // do work on non deep power down mode (1)
                      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
                      dpmode <= #tDP 1'b1;
                      //$display( $stime, " New DP Mode Register = %b", dpmode );
                  end    
                  disable deep_power_down;
               end
            end // end forever   
        end
    endtask

//    /*---------------------------------------------------------------*/
//    /*  Description: define a enter 4kb sector task                  */
//    /*---------------------------------------------------------------*/
//    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 MX25L4005A
            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
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -