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

📄 mdu.v

📁 8051的Verilog实现
💻 V
📖 第 1 页 / 共 5 页
字号:
            lmdx_nxt = ST13 ; 
            end
         
         MD1_ID, MD2_ID, MD3_ID,
         MD4_ID, MD5_ID :
            begin
            lmdx_nxt = ST14 ; 
            end
         
         default :
            begin
            lmdx_nxt = ST7 ; 
            end
         
         endcase 
         end
      else
         begin
         if (opend & sfraddr == MD3_ID & sfroe)
            begin
            lmdx_nxt = ST0 ; 
            end
         else
            begin
            lmdx_nxt = ST7 ; 
            end 
         end 
      end
   
   ST8 :
      begin
      mdu_op = MDU_NOP ; 
      setmdef = 1'b0 ; 
      if (sfrwe)
         begin
         case (sfraddr)
         MD0_ID :
            begin
            lmdx_nxt = ST13 ; 
            end
         
         MD5_ID :
            begin
            lmdx_nxt = ST9 ; 
            end
         
         ARCON_ID :
            begin
            lmdx_nxt = ST7 ; 
            end
         
         default :
            begin
            lmdx_nxt = ST8 ; 
            end
         
         endcase 
         end
      else
         begin
         lmdx_nxt = ST8 ; 
         end 
      end
   
   ST9 :
      begin
      mdu_op = MDU_DIV16 ; 
      setmdef = 1'b0 ; 
      if (sfrwe)
         begin
         case (sfraddr)
         MD0_ID :
            begin
            lmdx_nxt = ST13 ; 
            end
         MD1_ID, MD2_ID, MD3_ID,
         MD4_ID, MD5_ID :
            begin
            lmdx_nxt = ST14 ; 
            end
         default :
            begin
            lmdx_nxt = ST9 ; 
            end
         endcase 
         end
      else
         begin
         if (opend & sfraddr == MD5_ID & sfroe)
            begin
            lmdx_nxt = ST0 ; 
            end
         else
            begin
            lmdx_nxt = ST9 ; 
            end 
         end 
      end
   
   ST10 :
      begin
      mdu_op = MDU_NOP ; 
      setmdef = 1'b0 ; 
      if (sfrwe)
         begin
         case (sfraddr)
         MD0_ID :
            begin
            lmdx_nxt = ST13 ; 
            end
         
         MD1_ID :
            begin
            lmdx_nxt = ST11 ; 
            end
         
         ARCON_ID :
            begin
            lmdx_nxt = ST7 ; 
            end
         
         default :
            begin
            lmdx_nxt = ST10 ; 
            end
         
         endcase 
         end
      else
         begin
         lmdx_nxt = ST10 ; 
         end 
      end
   
   ST11 :
      begin
      mdu_op = MDU_NOP ; 
      setmdef = 1'b0 ; 
      if (sfrwe)
         begin
         case (sfraddr)
         MD0_ID :
            begin
            lmdx_nxt = ST13 ; 
            end
         
         MD5_ID :
            begin
            lmdx_nxt = ST12 ; 
            end
         
         ARCON_ID :
            begin
            lmdx_nxt = ST7 ; 
            end
         
         default :
            begin
            lmdx_nxt = ST11 ; 
            end
         
         endcase 
         end
      else
         begin
         lmdx_nxt = ST11 ; 
         end 
      end
   
   ST12 :
      begin
      mdu_op = MDU_MUL ; 
      setmdef = 1'b0 ; 
      if (sfrwe)
         begin
         case (sfraddr)
         MD0_ID :
            begin
            lmdx_nxt = ST13 ; 
            end
         MD1_ID, MD2_ID, MD3_ID,
         MD4_ID, MD5_ID :
            begin
            lmdx_nxt = ST14 ; 
            end
         default :
            begin
            lmdx_nxt = ST12 ; 
            end
         endcase 
         end
      else
         begin
         if (opend & sfraddr == MD3_ID & sfroe)
            begin
            lmdx_nxt = ST0 ; 
            end
         else
            begin
            lmdx_nxt = ST12 ; 
            end 
         end 
      end
   
   ST13 :
      begin
      mdu_op = MDU_RST ; 
      setmdef = 1'b1 ; 
      lmdx_nxt = ST1 ; 
      end
   
   default : // ST14
      begin
      mdu_op = MDU_RST ; 
      setmdef = 1'b1 ; 
      lmdx_nxt = ST0 ; 
      end
   
   endcase 
   end 

   //------------------------------------------------------------------
   always @(posedge clk)
   begin : lmdx_sync_proc
   //------------------------------------------------------------------
   if (rst)
      //-----------------------------------
      // Synchronous reset
      //-----------------------------------
      begin
      lmdx_reg <= ST0 ; 
      end
   else
      //-----------------------------------
      // Synchronous write
      //-----------------------------------
      begin
         lmdx_reg <= lmdx_nxt ; 
      end  
   end 

   //------------------------------------------------------------------
   // arithmetic operation FSM 
   //------------------------------------------------------------------
   always @(oper_reg or md2 or md3 or md4 or md5 or counter_st or
      mdu_op or arcon)
   begin : oper_comb_proc
   //------------------------------------------------------------------
   case (oper_reg)
   ST1 :
      begin
      md30_sel = NOP_ ; 
      counter_sel = 2'b01 ;  //load(count<-sc)
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if (arcon[4:0] == 5'b00000)
         begin
         if (md3[7])
            begin
            oper_nxt = ST8 ; 
            end
         else
            begin
            oper_nxt = ST7 ; 
            end 
         end
      else
         begin
         if (arcon[5])
            begin
            oper_nxt = ST5 ; 
            end
         else
            begin
            oper_nxt = ST6 ; 
            end 
         end 
      end
   
   ST2 :
      begin
      md30_sel = MUL ; 
      counter_sel = 2'b11 ;  //dec
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if (counter_st == 5'b10010)
         begin
         oper_nxt = ST9 ; 
         end
      else
         begin
         oper_nxt = ST2 ; 
         end 
      end
   
   ST3 :
      begin
      md30_sel = DIV16 ; 
      counter_sel = 2'b11 ;  //dec
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if (counter_st == 5'b10100)
         begin
         oper_nxt = ST10 ; 
         end
      else
         begin
         oper_nxt = ST3 ; 
         end 
      end
   
   ST4 :
      begin
      md30_sel = DIV32 ; 
      counter_sel = 2'b11 ;  //dec
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if (counter_st == 5'b00100)
         begin
         oper_nxt = ST10 ; 
         end
      else
         begin
         oper_nxt = ST4 ; 
         end 
      end
   
   ST5 :
      begin
      md30_sel = SHR ; 
      counter_sel = 2'b11 ;  //dec
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if (counter_st == 5'b00001 |
         counter_st == 5'b00010 |
         counter_st == 5'b00000)
         begin
         oper_nxt = ST0 ; 
         end
      else
         begin
         oper_nxt = ST5 ; 
         end 
      end
   
   ST6 :
      begin
      md30_sel = SHL ; 
      counter_sel = 2'b11 ;  //dec
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if (counter_st == 5'b00001 |
         counter_st == 5'b00010 |
         counter_st == 5'b00000)
         begin
         oper_nxt = ST0 ; 
         end
      else
         begin
         oper_nxt = ST6 ; 
         end 
      end
   
   ST7 :
      begin
      md30_sel = NORM ; 
      counter_sel = 2'b11 ;  //dec
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      if ((md3[6]) | (md3[5]) | counter_st == 5'b00010)
         begin
         oper_nxt = ST11 ; 
         end
      else
         begin
         oper_nxt = ST7 ; 
         end 
      end
   
   ST8 :
      begin
      md30_sel = NOP_ ; 
      counter_sel = 2'b10 ;  //reset
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b1 ;       //set mdov flag
      oper_nxt = ST0 ; 
      end
   
   ST9 :
      begin
      md30_sel = NOP_ ; 
      counter_sel = 2'b10 ;  //reset
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = (md3[7] | md3[6] | md3[5] | md3[4] |
                  md3[3] | md3[2] | md3[1] | md3[0] |
                  md2[7] | md2[6] | md2[5] | md2[4] |
                  md2[3] | md2[2] | md2[1] | md2[0]) ; 
      oper_nxt = ST0 ; 
      end
   
   ST10 :
      begin
      md30_sel = LDRES ; 
      counter_sel = 2'b10 ;  //reset
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      if (md4 == 8'b00000000 & md5 == 8'b00000000)
         begin
         setmdov = 1'b1 ;    //set mdov flag
         end
      else
         begin
         setmdov = 1'b0 ; 
         end 
      
      oper_nxt = ST0 ; 
      end
   
   ST11 :
      begin
      md30_sel = NOP_ ; 
      counter_sel = 2'b10 ;  //reset
      ld_sc = 1'b1 ;         //load sc
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      oper_nxt = ST0 ; 
      end
   
   ST12 :
      begin
      md30_sel = NOP_ ; 
      counter_sel = 2'b10 ;  //reset
      ld_sc = 1'b0 ;         //nop
      opend = 1'b0 ;         //operation end
      setmdov = 1'b0 ;       //set mdov flag
      case (mdu_op)
      MDU_SHIFT :
 

⌨️ 快捷键说明

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