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

📄 ramsfrctrl.v

📁 8051的Verilog实现
💻 V
📖 第 1 页 / 共 5 页
字号:
      (
         mempsackint &
         (
            (memdatai == ACALL_0 & (codefetche | debugfetche)) |
            (memdatai == ACALL_1 & (codefetche | debugfetche)) |
            (memdatai == ACALL_2 & (codefetche | debugfetche)) |
            (memdatai == ACALL_3 & (codefetche | debugfetche)) |
            (memdatai == ACALL_4 & (codefetche | debugfetche)) |
            (memdatai == ACALL_5 & (codefetche | debugfetche)) |
            (memdatai == ACALL_6 & (codefetche | debugfetche)) |
            (memdatai == ACALL_7 & (codefetche | debugfetche)) |
            (memdatai == LCALL &   (codefetche | debugfetche)) |
            (intreq &              (codefetche | debugfetche)) |    // LCALL
            (instr == PUSH    & cycle == 1) |
            (instr == ACALL_0 & cycle == 1) |
            (instr == ACALL_1 & cycle == 1) |
            (instr == ACALL_2 & cycle == 1) |
            (instr == ACALL_3 & cycle == 1) |
            (instr == ACALL_4 & cycle == 1) |
            (instr == ACALL_5 & cycle == 1) |
            (instr == ACALL_6 & cycle == 1) |
            (instr == ACALL_7 & cycle == 1) |
            (instr == LCALL   & cycle == 1)
         )
      ) ? 1'b1 :
      1'b0 ; 
   
   //------------------------------------------------------------------
   // Stack Pointer decrement enable
   //------------------------------------------------------------------
   assign spdece =
      (
         (mempsackint &
            (
               (memdatai == RET &  (codefetche | debugfetche)) |
               (memdatai == RETI & (codefetche | debugfetche))
            )
         ) |
         (instr == RET & cycle == 1) |
         (instr == RETI & cycle == 1) |
         (instr == POP & cycle == 2)
      ) ? 1'b1 :
      1'b0 ; 
   
   //------------------------------------------------------------------
   // Stack Pointer increment vector
   //------------------------------------------------------------------
   assign sp_inc =
      (sfr_we & ram_sfr_address == {1'b1, SP_ID}) ? sfr_datao + 1'b1 :
      sp + 1'b1 ; 
   
   //------------------------------------------------------------------
   // Stack Pointer increment vector
   //------------------------------------------------------------------
   assign sp_dec =
      (sfr_we & ram_sfr_address == {1'b1, SP_ID}) ? sfr_datao - 1'b1 :
      sp - 1'b1 ; 

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : sp_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      sp <= SP_RV ; 
      end
   else
      begin
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Special function register write
      //--------------------------------
      if (spince)
         begin
         sp <= sp_inc;
         end
      else
         begin
         if (spdece)
            begin
            sp <= sp_dec;
            end
         else
            begin
            if (sfr_we & ram_sfr_address[6:0]==SP_ID)
               begin
               sp <= sfr_datao;
               end
            end
         end
      end  
   end 

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ram_oe_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ram_oe <= 1'b0 ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
      if (mempsackint)
         begin
         if ((codefetche | debugfetche))
            begin
            case (memdatai)
            ADD_IR0, ADD_IR1,
            ADDC_IR0, ADDC_IR1,
            INC_IR0, INC_IR1,
            DEC_IR0, DEC_IR1,
            ANL_A_IR0, ANL_A_IR1,
            ORL_A_IR0, ORL_A_IR1,
            XRL_A_IR0, XRL_A_IR1,
            MOV_A_IR0, MOV_A_IR1,
            MOV_ADDR_IR0, MOV_ADDR_IR1,
            MOV_IR0_A, MOV_IR1_A,
            MOV_IR0_N, MOV_IR1_N,
            XCH_IR0, XCH_IR1,
            XCHD_IR0, XCHD_IR1,
            CJNE_IR0_N, CJNE_IR1_N,
            ADD_R0, ADD_R1,
            ADD_R2, ADD_R3,
            ADD_R4, ADD_R5,
            ADD_R6, ADD_R7,
            ADDC_R0, ADDC_R1,
            ADDC_R2, ADDC_R3,
            ADDC_R4, ADDC_R5,
            ADDC_R6, ADDC_R7,
            SUBB_IR0, SUBB_IR1,
            SUBB_R0, SUBB_R1,
            SUBB_R2, SUBB_R3,
            SUBB_R4, SUBB_R5,
            SUBB_R6, SUBB_R7,
            INC_R0, INC_R1,
            INC_R2, INC_R3,
            INC_R4, INC_R5,
            INC_R6, INC_R7,
            DEC_R0, DEC_R1,
            DEC_R2, DEC_R3,
            DEC_R4, DEC_R5,
            DEC_R6, DEC_R7,
            ANL_A_R0, ANL_A_R1,
            ANL_A_R2, ANL_A_R3,
            ANL_A_R4, ANL_A_R5,
            ANL_A_R6, ANL_A_R7,
            ORL_A_R0, ORL_A_R1,
            ORL_A_R2, ORL_A_R3,
            ORL_A_R4, ORL_A_R5,
            ORL_A_R6, ORL_A_R7,
            XRL_A_R0, XRL_A_R1,
            XRL_A_R2, XRL_A_R3,
            XRL_A_R4, XRL_A_R5,
            XRL_A_R6, XRL_A_R7,
            MOV_A_R0, MOV_A_R1,
            MOV_A_R2, MOV_A_R3,
            MOV_A_R4, MOV_A_R5,
            MOV_A_R6, MOV_A_R7,
            MOV_R0_A, MOV_R1_A,
            MOV_R2_A, MOV_R3_A,
            MOV_R4_A, MOV_R5_A,
            MOV_R6_A, MOV_R7_A,
            MOV_ADDR_R0, MOV_ADDR_R1,
            MOV_ADDR_R2, MOV_ADDR_R3,
            MOV_ADDR_R4, MOV_ADDR_R5,
            MOV_ADDR_R6, MOV_ADDR_R7,
            XCH_R0, XCH_R1,
            XCH_R2, XCH_R3,
            XCH_R4, XCH_R5,
            XCH_R6, XCH_R7,
            CJNE_R0_N, CJNE_R1_N,
            CJNE_R2_N, CJNE_R3_N,
            CJNE_R4_N, CJNE_R5_N,
            CJNE_R6_N, CJNE_R7_N,
            DJNZ_R0, DJNZ_R1,
            DJNZ_R2, DJNZ_R3,
            DJNZ_R4, DJNZ_R5,
            DJNZ_R6, DJNZ_R7,
            MOVX_A_IR0, MOVX_A_IR1,
            MOVX_IR0_A, MOVX_IR1_A,
            RET, RETI,
            POP :
               begin
               ram_oe <= 1'b1 ; 
               end
            
            default :
               begin
               ram_oe <= 1'b0 ; 
               end
            
            endcase 
            end
         else if (ram2memaddr)
            begin
            ram_oe <= 1'b1 ; 
            end
         else
            begin
            case (cycle)
            1 :
               begin
               case (instr)
               ADD_IR0, ADD_IR1,
               ADDC_IR0, ADDC_IR1,
               INC_IR0, INC_IR1,
               DEC_IR0, DEC_IR1,
               ORL_A_IR0, ORL_A_IR1,
               ANL_A_IR0, ANL_A_IR1,
               XRL_A_IR0, XRL_A_IR1,
               CJNE_IR0_N, CJNE_IR1_N,
               MOV_A_IR0, MOV_A_IR1,
               MOV_ADDR_IR0, MOV_ADDR_IR1,
               SUBB_IR0, SUBB_IR1,
               XCH_IR0, XCH_IR1,
               XCHD_IR0, XCHD_IR1,
               MOVX_A_IR0, MOVX_A_IR1,
               MOVX_IR0_A, MOVX_IR1_A,
               RET, RETI :
                  begin
                  ram_oe <= 1'b1 ; 
                  end
               ADD_ADDR, ADDC_ADDR,
               SUBB_ADDR, INC_ADDR,
               DEC_ADDR, ANL_A_ADDR,
               ORL_A_ADDR, XRL_A_ADDR,
               ANL_ADDR_A, ANL_ADDR_N,
               ORL_ADDR_A, ORL_ADDR_N,
               XRL_ADDR_A, XRL_ADDR_N,
               MOV_A_ADDR, MOV_R0_ADDR,
               MOV_R1_ADDR, MOV_R2_ADDR,
               MOV_R3_ADDR, MOV_R4_ADDR,
               MOV_R5_ADDR, MOV_R6_ADDR,
               MOV_R7_ADDR, MOV_ADDR_ADDR,
               MOV_IR0_ADDR, MOV_IR1_ADDR,
               CJNE_A_ADDR, DJNZ_ADDR,
               XCH_ADDR, PUSH, CLR_BIT,
               SETB_BIT, ANL_C_BIT,
               ANL_C_NBIT, ORL_C_BIT,
               ORL_C_NBIT, MOV_C_BIT,
               MOV_BIT_C, CPL_BIT,
               JBC_BIT, JB_BIT,
               JNB_BIT :
                  begin
                  if (!(memdatai[7]))
                     begin
                     ram_oe <= 1'b1 ; 
                     end
                  else
                     begin
                     ram_oe <= 1'b0 ; 
                     end 
                  end
               
               default :
                  begin
                  ram_oe <= 1'b0 ; 
                  end
               
               endcase 
               end
            
            2 :
               begin
               case (instr)
               MOV_IR0_ADDR, MOV_IR1_ADDR :
                  begin
                  ram_oe <= 1'b1 ; 
                  end
               
               default :
                  begin
                  ram_oe <= 1'b0 ; 
                  end
               
               endcase 
               end
            
            default :
               begin
               ram_oe <= 1'b0 ; 
               end
            
            endcase 
            end 
         end
      end
   end 

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ram_we_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ram_we <= 1'b0 ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
      if (mempsackint)
         begin
         case (cycle)
         1 :
            begin
            case (instr)
            DJNZ_R0, DJNZ_R1,
            DJNZ_R2, DJNZ_R3,
            DJNZ_R4, DJNZ_R5,
            DJNZ_R6, DJNZ_R7,
            INC_R0, INC_R1,
            INC_R2, INC_R3,
            INC_R4, INC_R5,
            INC_R6, INC_R7,
            DEC_R0, DEC_R1,
            DEC_R2, DEC_R3,
            DEC_R4, DEC_R5,
            DEC_R6, DEC_R7,
            MOV_R0_A, MOV_R1_A,
            MOV_R2_A, MOV_R3_A,
            MOV_R4_A, MOV_R5_A,
            MOV_R6_A, MOV_R7_A,
            MOV_R0_N, MOV_R1_N,
            MOV_R2_N, MOV_R3_N,
            MOV_R4_N, MOV_R5_N,
            MOV_R6_N, MOV_R7_N,
            XCH_R0, XCH_R1,
            XCH_R2, XCH_R3,
            XCH_R4, XCH_R5,
            XCH_R6, XCH_R7 :
               begin
               ram_we <= 1'b1 ; 
               end
            
            default :
               begin
               ram_we <= 1'b0 ; 
               end
            
            endcase 
            end
         
         2 :
            begin
            case (instr)
            INC_IR0, INC_IR1,
            DEC_IR0, DEC_IR1,
            MOV_IR0_A, MOV_IR1_A,
            MOV_IR0_N, MOV_IR1_N,
            XCH_IR0, XCH_IR1,
            XCHD_IR0, XCHD_IR1,
            ACALL_0, ACALL_1,
            ACALL_2, ACALL_3,
            ACALL_4, ACALL_5,
            ACALL_6, ACALL_7,
            LCALL :
               begin
               ram_we <= 1'b1 ; 
               end
            INC_ADDR, DEC_ADDR,
            ANL_ADDR_A, ORL_ADDR_A,
            XRL_ADDR_A, MOV_ADDR_A,
            MOV_ADDR_N, MOV_ADDR_R0,
            MOV_ADDR_R1, MOV_ADDR_R2,
            MOV_ADDR_R3, MOV_ADDR_R4,
            MOV_ADDR_R5, MOV_ADDR_R6,
            MOV_ADDR_R7, POP,
            XCH_ADDR, CLR_BIT,
            SETB_BIT, CPL_BIT,
            MOV_BIT_C :
               begin
               if (!(ram_sfr_address[7]))
                  begin
                  ram_we <= 1'b1 ; 
                  end
               else
                  begin
                  ram_we <= 1'b0 ; 
                  end 
               end
            
            default :
               begin
               ram_we <= 1'b0 ; 
               end
            
            endcase 
            end
         
         3 :

⌨️ 快捷键说明

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