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

📄 apb.v

📁 APB master verilog code
💻 V
字号:
`timescale 1ns / 1nsmodule apb(apb_write,apb_write_add,apb_write_data,apb_read,apb_read_add,apb_read_data_out,PCLK,PRESETn,PREADY,PADDR,PWRITE,PWDATA,PRDATA,PSEL,PENABLE,READ_DATA,WRITE_DATA);// Input output port declarationsinput apb_write,PCLK,PRESETn,PREADY,apb_read,READ_DATA,WRITE_DATA;//Environment side input input [31:0] apb_write_add,apb_write_data,apb_read_add,PRDATA;output [31:0] PADDR,PWDATA,apb_read_data_out;output PWRITE,PSEL,PENABLE;reg [31:0] PADDR,PWDATA,apb_read_data_out;reg PWRITE,PSEL,PENABLE;// FSM state declarationsreg [1:0] NEXT_STATE;reg [1:0] PRES_STATE;//state encodingparameter s0 = 2'b00;parameter s1 = 2'b01;parameter s2 = 2'b10;always @(*)begin    if(WRITE_DATA)   begin     case(PRES_STATE)     s0:       begin         if(PREADY == 1'b0 && apb_write == 1'b0)         begin         PWRITE = 1'b0;         PSEL = 1'b0;         PENABLE = 1'b0;         NEXT_STATE = s0;         end              else if (PREADY == 1'b0 && apb_write == 1'b1)         begin         NEXT_STATE = s1;          end      end         s1:       begin        if (PREADY == 1'b0 && apb_write == 1'b1)         begin         PADDR = apb_write_add;         PWDATA = apb_write_data;         PWRITE = 1'b1;         PSEL = 1'b1;         PENABLE = 1'b0;         NEXT_STATE = s2;         end              else if (PREADY == 1'b0 && apb_write == 1'b0)         begin         NEXT_STATE = s0;         end      end    s2:     begin       if(PREADY == 1'b0 && apb_write == 1'b1)        begin        PADDR = apb_write_add;        PWDATA = apb_write_data;        PWRITE = 1'b1;        PSEL = 1'b1;        PENABLE = 1'b1;        NEXT_STATE = s2;        end        else if(PREADY == 1'b1 && apb_write == 1'b1)        begin        NEXT_STATE = s1;        end       else if(PREADY == 1'b1 && apb_write == 1'b0)        begin        NEXT_STATE = s0;        end     end    default:NEXT_STATE = s0;   endcase    end     else if(READ_DATA)  begin        case(PRES_STATE)      s0:       begin         if(PREADY == 1'b0 && apb_read == 1'b0)         begin        //  PADDR = apb_read_add;        //  apb_read_data_out = PRDATA;         PWRITE = 1'b0;         PSEL = 1'b0;         PENABLE = 1'b0;         NEXT_STATE = s0;         end              else if (PREADY == 1'b0 && apb_read == 1'b1)         begin         NEXT_STATE = s1;          end      end       s1:      begin         if(PREADY == 1'b0 && apb_read == 1'b1)         begin         PADDR = apb_read_add;         PSEL = 1'b1;         PENABLE = 1'b0;         NEXT_STATE = s2;         end                  else if(PREADY == 1'b0 && apb_read == 1'b0)         begin         NEXT_STATE = s0;         end      end           s2:      begin         if(PREADY == 1'b1 && apb_read == 1'b1)          begin          apb_read_data_out = PRDATA;          PSEL = 1'b1;          PENABLE = 1'b1;          NEXT_STATE = s1;          end                   else if(PREADY == 1'b0 && apb_read == 1'b0)          begin          NEXT_STATE = s0;          end      end  endend         /*always @(*)begin   case (PRES_STATE)   s0:    //state = s0   begin        if(PREADY == 1'b0 && apb_write == 1'b0 && apb_read == 1'b0)           begin           apb_read_data_out = 32'bx;           PADDR = 32'bx;           PWDATA = 32'bx;            PWRITE = 1'b0;           PSEL = 1'b0;           PENABLE = 1'b0;           NEXT_STATE = s0;           end        else if(PREADY == 1'b0 && apb_write == 1'b1 && apb_read == 1'b0)           begin           NEXT_STATE = s1;           end        else if(PREADY == 1'b0 && apb_write == 1'b1 && apb_read == 1'b1)            begin            NEXT_STATE = s1;            end   end   s1:   //state = s1         begin           if(PREADY == 1'b0 && apb_write == 1'b1 && apb_read == 1'b0)          begin          PADDR = apb_write_add;          PWDATA = apb_write_data;          PWRITE = 1'b1;          PSEL = 1'b1;          PENABLE = 1'b0;          NEXT_STATE = s2;          end          else if (PREADY == 1'b0 && apb_write == 1'b0 && apb_read == 1'b0)          begin          NEXT_STATE = s0;          end          else if (PREADY == 1'b0 && apb_write == 1'b0 && apb_read == 1'b1)          begin          PADDR = apb_read_add;          apb_read_data_out = PRDATA;          PWRITE = 1'b0;          PSEL = 1'b1;          PENABLE = 1'b0;          NEXT_STATE = s2;          end      end   s2:  //state = s2   begin         if(PREADY == 1'b0 && apb_write == 1'b1 && apb_read == 1'b0)         begin          PADDR = apb_write_add;          PWDATA = apb_write_data;          PWRITE = 1'b1;          PSEL = 1'b1;          PENABLE = 1'b1;          NEXT_STATE = s2;         end         else if(PREADY == 1'b1 && apb_write == 1'b1 && apb_read == 1'b0)         begin          NEXT_STATE = s1;         end          else if(PREADY == 1'b0 && apb_write == 1'b0 && apb_read == 1'b0)         begin          NEXT_STATE = s0;         end         else if(PREADY == 1'b0 && apb_write == 1'b0 && apb_read == 1'b1)         begin          PADDR = apb_read_add;          apb_read_data_out = PRDATA;          PWRITE = 1'b0;          PSEL = 1'b1;          PENABLE = 1'b1;          NEXT_STATE = s2;         end         else if(PREADY == 1'b1 && apb_write == 1'b0 && apb_read == 1'b1)         begin          NEXT_STATE = s1;         end   end   default: NEXT_STATE = s0;   endcaseend  *///clock the state flip-flopsalways@(posedge PCLK)begin  if (PRESETn ==1'b1)     PRES_STATE <= s0;  else     PRES_STATE <= NEXT_STATE;endendmodule               

⌨️ 快捷键说明

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