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

📄 clkctrl.v

📁 8051的Verilog实现
💻 V
📖 第 1 页 / 共 3 页
字号:
   parameter[7:0] MOV_R6_A       = 8'b11111110; 
   parameter[7:0] MOV_R7_A       = 8'b11111111; 
   
   //-----------------------------------------------------------------
   // Interrupt reset values
   //-----------------------------------------------------------------
   parameter[4:0] VECT_RV        = 5'b00000; // Interrupt Vector reset value
   parameter[3:0] IS_REG_RV      = 4'b0000;  // In Service Register reset value

   //-----------------------------------------------------------------
   // Interrupt Vector locations
   //-----------------------------------------------------------------
   // external interrupt 0
   parameter[4:0] VECT_E0        = 5'b00000; 
   
   // timer 0 overflow
   parameter[4:0] VECT_TF0       = 5'b00001; 
   
   // external interrupt 1
   parameter[4:0] VECT_E1        = 5'b00010; 
   
   // timer 1 overflow
   parameter[4:0] VECT_TF1       = 5'b00011; 
   
   // serial channel 0
   parameter[4:0] VECT_SER0      = 5'b00100; 
   
   // timer 2 overflow/ext. reload
   parameter[4:0] VECT_TF2       = 5'b00101; 
   
   // A/D converter 
   parameter[4:0] VECT_ADC       = 5'b01000; 
   
   // external interrupt 2
   parameter[4:0] VECT_EX2       = 5'b01001; 
   
   // external interrupt 3
   parameter[4:0] VECT_EX3       = 5'b01010; 
   
   // external interrupt 4
   parameter[4:0] VECT_EX4       = 5'b01011; 
   
   // external interrupt 5
   parameter[4:0] VECT_EX5       = 5'b01100; 
   
   // external interrupt 6
   parameter[4:0] VECT_EX6       = 5'b01101; 
   
   // serial channel 1
   parameter[4:0] VECT_SER1      = 5'b10000; 

   //-----------------------------------------------------------------
   // Start address location
   //-----------------------------------------------------------------
   parameter[15:0] ADDR_RV       = 16'b0000000000000000; //


   //-----------------------------------------------------------------
   // RAM & SFR address reset value
   //-----------------------------------------------------------------
   parameter[7:0] RAM_SFR_ADDR_RV= 8'b00000000; //


   //-----------------------------------------------------------------
   // Data register reset value
   //-----------------------------------------------------------------
   parameter[7:0] DATAREG_RV     = 8'b00000000; //


   //-----------------------------------------------------------------
   // High ordered half of address during indirect addressing
   //-----------------------------------------------------------------
   parameter[7:0] ADDR_HIGH_RI   = 8'b00000000; //


   //-----------------------------------------------------------------
   // Watchdog Timer reset value
   //-----------------------------------------------------------------
   parameter[6:0] WDTH_RV        = 7'b0000000;  // High ordered WDT
   parameter[7:0] WDTL_RV        = 8'b00000000; // Low ordered WDT


   //-----------------------------------------------------------------
   // Watchdog Timer reset state
   //-----------------------------------------------------------------
   parameter[14:0] WDT_RS        = 15'b111111111111100; // X"7FFC"



//*******************************************************************--   
   //  Control signals inputs
   input       clk;     // Global clock input
   input       rst;     // Internal reset input

   //  Program memory read
   input       mempsrd;

   // Program memory write
   input       mempswr;

   //  Debug Request
   input       debugreq;
   
   //  Clock Control outputs
   output      smod;    // Baud rate Doubler
   wire        smod;
   output      pmw;     // Program memory write
   wire        pmw;
   output      [2:0] stretch; 
   wire        [2:0] stretch;
   output      [2:0] psstretch;
   wire        [2:0] psstretch;

   //  Program memory waitstates
   output      mempsackint;
   wire        mempsackint;
   input       mempsack;
   
   //  Special function register interface
   input       [7:0] sfrdatai; 
   output      [7:0] sfrdataclk; 
   wire        [7:0] sfrdataclk;
   input       [6:0] sfraddr; 
   input       sfrwe; 

   //------------------------------------------------------------------
   
   // Power Control register
   reg         [7:2] pcon; 
   
   // Clock Control register
   reg         [7:0] ckcon; 
   
   // Wait states counter
   reg         [2:0] waitcount;
   
   //------------------------------------------------------------------
   // Baud rate Doubler
   //------------------------------------------------------------------
   assign smod = pcon[7] ;

   //------------------------------------------------------------------
   // Program Memory Write flag
   //------------------------------------------------------------------
   assign pmw = pcon[4] ;
 
   //------------------------------------------------------------------
   // Data Memory cycle stretch control
   //------------------------------------------------------------------
   assign stretch = ckcon[2:0] ; 

   //------------------------------------------------------------------
   // Data Memory cycle stretch control
   //------------------------------------------------------------------
   assign psstretch = ckcon[6:4] ;

   //------------------------------------------------------------------
   // pcon register
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : pcon_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      pcon <= PCON_RV[7:2] ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Special function register write
      //--------------------------------
      begin
      if (sfrwe & sfraddr == PCON_ID)
         begin
         pcon <= sfrdatai[7:2] ; 
         end 
      end  
   end 

   //------------------------------------------------------------------
   // ckcon register
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ckcon_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ckcon <= CKCON_RV ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Special function register write
      //--------------------------------
      begin
      if (sfrwe & sfraddr == CKCON_ID)
         begin
         ckcon <= sfrdatai ; 
         end 
      end  
   end 

   //------------------------------------------------------------------
   // Wait states counter
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : waitcount_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      waitcount <= CKCON_RV[6:4];
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Current cycle count
      //--------------------------------
      begin
      if (mempsrd) // & (!debugreq)
         begin
         if (waitcount == 3'b000)
            begin
            if (mempsack)
              begin
              waitcount <= ckcon[6:4];
              end
            end
         else
            begin
            waitcount <= waitcount - 3'b001;
            end
         end
      else
         begin
         waitcount <= ckcon[6:4];
         end
      end
   end
      
   //------------------------------------------------------------------
   // Program memory acknowledge
   //------------------------------------------------------------------
   assign mempsackint = ((waitcount == 3'b000 | (!mempsrd &
                                                 !mempswr)) & 
                         (mempsack            | (!mempsrd &
                                                 !mempswr))) ? 1'b1 : 1'b0;
   
   //------------------------------------------------------------------
   // Special Function registers read
   //------------------------------------------------------------------
   assign sfrdataclk = (sfraddr == PCON_ID) ? {pcon, 2'b00} :
                       (sfraddr == CKCON_ID) ? ckcon :
                       "--------" ; 

endmodule  // module CLOCK_CONTROL

//*******************************************************************--

⌨️ 快捷键说明

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