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

📄 isr.v

📁 8051的Verilog实现
💻 V
📖 第 1 页 / 共 5 页
字号:
      end  
   end 

   //------------------------------------------------------------------
   // Interrupt Enable register 2
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ien2_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ien2 <= IEN0_RV ; 
      end
   else
      begin
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Special function register write
      //--------------------------------
      if (sfrwe & sfraddr == IEN2_ID)
         begin
         ien2 <= sfrdatai ; 
         end 
      end  
   end 

   //------------------------------------------------------------------
   // Interrupt Priority register 0
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ip0_write_proc
   //------------------------------------------------------------------
   if (wdts)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ip0 <= IP0_RW ; //set wdts flag (ip0(6))
      end
   else
      begin
      if (rst)
         begin
         ip0 <= IP0_RV ; 
         end
      else
         begin
         //-----------------------------------
         // Synchronous write
         //-----------------------------------
         // Special function register write
         //--------------------------------
         if (sfrwe & sfraddr == IP0_ID)
            begin
            ip0 <= sfrdatai ; 
            end 
         end 
      end  
   end 

   //------------------------------------------------------------------
   // Interrupt Priority register 1
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ip1_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ip1 <= IP1_RV ; 
      end
   else
      begin
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Special function register write
      //--------------------------------
      if (sfrwe & sfraddr == IP1_ID)
         begin
         ip1 <= sfrdatai ; 
         end 
      end  
   end 

   //------------------------------------------------------------------
   // Interrupt Request Control register
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : ircon_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      ircon <= IRCON_RV ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      // Special function register write
      //--------------------------------
      begin
      if (sfrwe & sfraddr == IRCON_ID)
         begin
         ircon <= sfrdatai ; 
         end
      else
         begin
         ircon[7] <= ircon[7] |  
                     (
                        (exf2 | exf2_ff) & ien1[7]
                     );
         ircon[6] <= ircon[6] | tf2 | tf2_ff;
         ircon[0] <= ircon[0] | iadc;
         if (intack)
            begin
            case (int_vect)
            VECT_EX6 : //iex6
               begin
               ircon[5] <= 1'b0 ; 
               end
            
            VECT_EX5 : //iex5
               begin
               ircon[4] <= 1'b0 ; 
               end
            
            VECT_EX4 : //iex4
               begin
               ircon[3] <= 1'b0 ; 
               end
            
            VECT_EX3 : //iex3
               begin
               ircon[2] <= 1'b0 ; 
               end
            
            VECT_EX2 : //iex2
               begin
               ircon[1] <= 1'b0 ; 
               end
            
            endcase 
            end
         else
            begin
            ircon[5:1] <= ({iex6, iex5, iex4, iex3, iex2}) |
               ircon[5:1] ; 
            end 
         end 
      end  
   end 

   //------------------------------------------------------------------
   // timer 2 overflow flip-flop
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : exf2_tf2_ff_proc
   //------------------------------------------------------------------
   //-----------------------------------
   // Synchronous reset
   //-----------------------------------
   if (rst)
      begin
      exf2_ff <= 1'b0;
      tf2_ff  <= 1'b0;
      end
   else
   //-----------------------------------
   // Synchronous write
   //-----------------------------------
      begin
      if (exf2)
         begin
         exf2_ff <= 1'b1;
         end
      else if (cycle == 1)
         begin
         exf2_ff <= 1'b0;
         end
      
      if (tf2)
         begin
         tf2_ff <= 1'b1;
         end
      else if (cycle == 1)
         begin
         tf2_ff <= 1'b0;
         end
      end
   end

   //------------------------------------------------------------------
   // External interrupt edge detect F/F
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : last_state_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      int2_p2 <= 1'b0 ; 
      int3_p2 <= 1'b0 ; 
      int4_p2 <= 1'b1 ; 
      int5_p2 <= 1'b1 ; 
      int6_p2 <= 1'b1 ; 
      
      int2_p0 <= 1'b0;
      int3_p0 <= 1'b0;
      int4_p0 <= 1'b1;
      int5_p0 <= 1'b1;
      int6_p0 <= 1'b1;
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
      int2_p0 <= int2;
      int3_p0 <= int3;
      int4_p0 <= int4;
      int5_p0 <= int5;
      int6_p0 <= int6;

      int2_p2 <= int2_p0;
      int3_p2 <= int3_p1;
      int4_p2 <= int4_p1;
      int5_p2 <= int5_p1;
      int6_p2 <= int6_p1;
      end  
   end 
   
   //------------------------------------------------------------------
   assign int3_p1 = (ccen10) ? com0 : int3_p0 ; 
   
   //------------------------------------------------------------------
   assign int4_p1 = (ccen32) ? com1 : int4_p0 ; 
   
   //------------------------------------------------------------------
   assign int5_p1 = (ccen54) ? com2 : int5_p0 ; 
   
   //------------------------------------------------------------------
   assign int6_p1 = (ccen76) ? com3 : int6_p0 ; 

   //------------------------------------------------------------------
   // External interrupt edge detect
   //------------------------------------------------------------------
   always @(posedge clk)
   begin : iex2_ff_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      iex2_ff <= 1'b0 ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
      if (cycle == 1)
         begin
         iex2_ff <= 1'b0 ; 
         end
      else if ((int2_p0 & !int2_p2 & i2fr) | // positive edge
              (!int2_p0 & int2_p2 & !i2fr))  // negative edge
         begin
         iex2_ff <= 1'b1 ; 
         end 
      end  
   end 
   
   //------------------------------------------------------------------
   // External interrupt edge detect
   //------------------------------------------------------------------
   
   assign iex2 = (i2fr) ? (int2_p0 & ~int2_p2) | iex2_ff // positive edge
      : (int2_p2 & ~int2_p0) | iex2_ff ;                 // negative edge

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : iex3_ff_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      iex3_ff <= 1'b0 ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
      if (~(ccen10_ff == ccen10) | cycle == 1)// compare <-> int3 switch
         begin
         iex3_ff <= 1'b0 ; 
         end
      else if ((int3_p1 & !int3_p2 & i3fr) | // positive edge
              (!int3_p1 & int3_p2 & !i3fr))  // negative edge
         begin
         iex3_ff <= 1'b1 ; 
         end 
      end  
   end 
   
   //------------------------------------------------------------------
   
   
   assign iex3 = (~(ccen10_ff == ccen10)) ? 1'b0 // compare <-> int3 switch
      : (i3fr) ? (int3_p1 & ~int3_p2) | iex3_ff :// positive edge
      (~int3_p1 & int3_p2) | iex3_ff ;           // negative edge

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : iex4_ff_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
         iex4_ff <= 1'b0 ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
      if (cycle == 1 | ~(ccen32_ff == ccen32)) // compare <-> int4 switch
         begin
         iex4_ff <= 1'b0 ; 
         end
      else if (int4_p1 & !int4_p2) // positive edge
         begin
         iex4_ff <= 1'b1 ; 
         end 
      end  
   end 
   
   //------------------------------------------------------------------
   assign iex4 = (~(ccen32_ff == ccen32)) ? 1'b0 // compare <-> int4 switch
      : (int4_p1 & ~int4_p2) | iex4_ff ;         // positive edge

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : iex5_ff_write_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin

⌨️ 快捷键说明

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