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

📄 spi_interface.v

📁 some example for verilog design
💻 V
字号:
module SPI_INTERFACE (do, iostrb_l, rw_l, io_wr, spi_rd, clkout, reset_l, dclk, cs_en, dio) ; 

input reset_l; 
inout do ; 
input iostrb_l ; 
input rw_l ; 
output io_wr,spi_rd; 
input clkout ; 
output dclk ; 
output cs_en ; 
inout dio ; 

// add your declarations here 
reg do_out; 
wire do; 
reg dio_out; 
wire dio; 
reg dclk; 
wire io_rd,io_wr; 
wire cs_en; 
reg [9:0] j; 
reg spi_wr,spi_rd; 
reg [7:0] buffer; 
reg buffer_full; 
reg [2:0] i; 
reg [5:0] main_state; 
parameter idle = 6'b000001, ready = 6'b000010, write_buffer = 6'b000100, read_buffer = 6'b001000, 
spi_write = 6'b010000, spi_read = 6'b100000; 

// add your code here 
assign io_rd = (!iostrb_l && rw_l)?1:0; 
assign io_wr = (!iostrb_l && !rw_l)?1:0; 
assign cs_en = (spi_wr || spi_rd)?1:0; 
assign do = ( io_rd )?do_out :1'bz; 
assign dio = ( spi_wr )?dio_out :1'bz; 

always @(posedge clkout or negedge reset_l) 
begin 
   if (!reset_l) 
     begin 
        buffer = 'b0; 
        buffer_full = 0; 
        spi_rd = 0; 
        spi_wr = 0; 
        main_state = idle; 
     end 
   else 
     begin 
        casex(main_state) 
            
           idle: 
             begin 
                buffer = 'b0; 
                buffer_full = 0; 
                spi_rd = 0; 
                spi_wr = 0; 
                if (iostrb_l == 1'b0) 
                 begin 
                    main_state = ready; 
                 end 
                else 
                 begin 
                    main_state = idle; 
                 end 
             end 
              
           ready: 
             begin 
                if (!rw_l) 
                  begin 
                     main_state = write_buffer; 
                     spi_wr = 1; 
                  end 
                else 
                  begin 
                     main_state = spi_read; 
                     spi_rd = 1; 
                  end 
             end 
              
           write_buffer: 
             begin 
                if (!buffer_full) 
                  begin 
                     for (i = 0; i <= 3'b111; i = i+1) 
                       begin 
                          buffer[ i ] = do; 
                       end 
                     buffer_full = 1; 
                     main_state = spi_write; 
                     spi_wr = 1; 
                  end 
                else 
                  begin 
                     main_state = idle; 
                  end 
             end 
              
           read_buffer: 
             begin 
                if (buffer_full) 
                  begin 
                     spi_rd = 0; 
                     for (i = 0; i <= 3'b111; i = i+1) 
                       begin 
                          do_out = buffer[ 7-i ]; 
                       end 
                     buffer_full = 0; 
                     main_state = idle; 
                  end 
                else 
                 begin 
                     main_state = spi_read; 
                  end 
             end 
              
           spi_write: 
             begin 
                if (buffer_full) 
                  begin 
            for (i = 0; i <= 3'b111; i = i+1) 
       begin 
          dclk=0; 
 for (j=0;j<='h3f7;j=j+1); 
          dclk=1; 
 if (dclk) 
                              begin 
                                 dio_out = buffer[ 7-i ];       
                              end 
 for (j=0;j<='h3f7;j=j+1); 
                         end 
                      buffer_full = 0; 
                      main_state = idle; 
                  end 
                else 
                  begin 
                     main_state = idle; 
                  end 
             end      
                  
           spi_read: 
              begin 
                if (!buffer_full) 
                  begin 
                     for (i = 0; i <= 3'b111; i = i+1) 
                       begin 
        dclk=1; 
                          for (j=0;j<='h3f7;j=j+1); 
        dclk=0; 
        if (!dclk) 
                            begin 
                               buffer[ i ] = dio;       
                            end 
        for (j=0;j<='h3f7;j=j+1); 
                        end 
                      buffer_full = 1; 
                      main_state = read_buffer; 
                  end 
                else 
                  begin 
                     main_state = idle; 
                  end 
             end 
              
           default: 
             begin 
                main_state = idle; 
             end  
              
        endcase     
     end                   
end                                    
     
endmodule 

⌨️ 快捷键说明

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