Verilog HDL SPI通信——读_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Verilog HDL SPI通信——读

Verilog HDL SPI通信——读

 2015/4/2 16:04:32  Mungbohne  程序员俱乐部  我要评论(0)
  • 摘要:modulespi_read(inputclk,//systemclock:50Minputrst,outputregcs,//chipselectoutputregsck,//chipclock:50Kinputdin,//DOoutputregdout,//DIinputrflag,//readenableoutputreg[7:0]data);//generalchipclock:50K/*regtemp;reg[9:0]count;always@
  • 标签:
module spi_read(
    input clk,        //system clock:50M
    input rst,        
    output reg cs,        //chip select
    output reg sck,        //chip clock:50K
    input din,        //DO
    output reg dout,        //DI
    input rflag,        //read enable
    output reg[7:0] data
);

//general chip clock:50K
/*reg temp;
reg[9:0] count;
always@(posedge clk or posedge rst)
    if(rst) begin count <= 10'd0; temp <= 1'b0; end
    else
        begin
            count <= count+1'b1;
            if(count == 10'd999) begin temp <= 1'b1; count <= 10'd0; end
            else if(count == 10'd499) temp <= 1'b0;
        end
assign sck = temp;

`define    high (count == 10'd999)    // 时钟上升沿
`define    low (count == 10'd499)*/        // 时钟下降沿
reg[9:0] count;
always@(posedge clk or posedge rst)
    if(rst) 
        begin
            count <= 10'd0;
            sck <= 1'b0;
        end
    else if(count >= 10'd499)
        begin
            count <= 10'd0;
            sck <= ~sck;
        end
    else count <= count+1'b1;
    
//capture posedge and negedge of sck
reg sck_m;
wire high;
wire low;
always@(posedge clk or posedge rst)
    if(rst) sck_m <= 1'b0;
    else sck_m <= sck;
assign high = ~sck_m & sck;
assign low = sck_m & ~sck;

//start read
reg[7:0] rstate;
//reg[7:0] data;
always@(posedge clk or posedge rst)
    begin
        if(rst)
            begin
                rstate <= 8'd0;
                cs <= 1'b0;
                dout <= 1'b0;
                data <= 8'd0;
            end
        else
            begin
                case(rstate)
                    6'd0:    begin
                                if(rflag)
                                    begin
                                        rstate <= 6'd1;
                                        cs <= 1'b1;
                                        dout <= 1'b0;
                                    end
                                else
                                    begin
                                        rstate <= 1'b0;
                                        cs <= 1'b0;
                                        dout <= 1'b0;
                                    end
                            end
                    6'd1:    begin 
                                if(low) begin rstate <= 6'd2; dout <= 1'b1; cs <= 1'b1; end        //SB=1
                                else    begin rstate <= 6'd1; end        
                            end
                            
                    6'd2:    begin 
                                if(low) begin rstate <= 6'd3; dout <= 1'b1; cs <= 1'b1; end        //OP0=1
                                else    begin rstate <= 6'd2; end        
                            end    
                            
                    6'd3:    begin 
                                if(low) begin rstate <= 6'd4; dout <= 1'b0; cs <= 1'b1; end        //OP1=0
                                else    begin rstate <= 6'd3; end        
                            end
                            
                    6'd4:    begin 
                                if(low) begin rstate <= 6'd5; dout <= 1'b0; cs <= 1'b1; end        //A6=0
                                else    begin rstate <= 6'd4; end        
                            end    
                            
                    6'd5:    begin 
                                if(low) begin rstate <= 6'd6; dout <= 1'b0; cs <= 1'b1; end        //A5=0
                                else    begin rstate <= 6'd5; end        
                            end    
                            
                    6'd6:    begin 
                                if(low) begin rstate <= 6'd7; dout <= 1'b0; cs <= 1'b1; end        //A4=0
                                else    begin rstate <= 6'd6; end        
                            end    
                            
                    6'd7:    begin 
                                if(low) begin rstate <= 6'd8; dout <= 1'b0; cs <= 1'b1; end        //A3=0
                                else    begin rstate <= 6'd7; end        
                            end    
                            
                    6'd8:    begin 
                                if(low) begin rstate <= 6'd9; dout <= 1'b1; cs <= 1'b1; end        //A2=1
                                else    begin rstate <= 6'd8; end        
                            end    
                            
                    6'd9:    begin 
                                if(low) begin rstate <= 6'd10; dout <= 1'b0; cs <= 1'b1; end        //A1=0
                                else    begin rstate <= 6'd9; end        
                            end    
                            
                    6'd10:    begin 
                                if(low) begin rstate <= 6'd11; dout <= 1'b1; cs <= 1'b1; end        //A0=1
                                else    begin rstate <= 6'd10; end        
                            end    
                            
                    6'd11:    begin 
                                if(!din) begin rstate <= 6'd12; cs <= 1'b1; end        //
                                else    begin rstate <= 6'd11; end        
                            end
                            
                    6'd12:    begin 
                                if(low) begin rstate <= 6'd13; cs <= 1'b1; end        //invalid
                                else    begin rstate <= 6'd12; end        
                            end
                            
                    6'd13:    begin 
                                if(low) begin rstate <= 6'd14; data[7] <= din; cs <= 1'b1; end        //D7
                                else    begin rstate <= 6'd13; end        
                            end    
                            
                    6'd14:    begin 
                                if(low) begin rstate <= 6'd15; data[6] <= din; cs <= 1'b1; end        //D6
                                else    begin rstate <= 6'd14; end        
                            end    
                            
                    6'd15:    begin 
                                if(low) begin rstate <= 6'd16; data[5] <= din; cs <= 1'b1; end        //D5
                                else    begin rstate <= 6'd15; end        
                            end        
                            
                    6'd16:    begin 
                                if(low) begin rstate <= 6'd17; data[4] <= din; cs <= 1'b1; end        //D4
                                else    begin rstate <= 6'd16; end        
                            end    
                            
                    6'd17:    begin 
                                if(low) begin rstate <= 6'd18; data[3] <= din; cs <= 1'b1; end        //D3
                                else    begin rstate <= 6'd17; end        
                            end    
                            
                    6'd18:    begin 
                                if(low) begin rstate <= 6'd19; data[2] <= din; cs <= 1'b1; end        //D2
                                else    begin rstate <= 6'd18; end        
                            end    
                            
                    6'd19:    begin 
                                if(low) begin rstate <= 6'd20; data[1] <= din; cs <= 1'b1; end        //D1
                                else    begin rstate <= 6'd19; end        
                            end    
                            
                    6'd20:    begin 
                                if(low) begin rstate <= 6'd21; data[0] <= din; cs <= 1'b1; end        //D0
                                else    begin rstate <= 6'd20; end        
                            end    
                            
                    6'd21:    begin 
                                if(low) begin rstate <= 6'd22; cs <= 1'b0; end        //数据读完,拉低CS
                                else    begin rstate <= 6'd21; end        
                            end    
                            
                    6'd22:    begin 
                                if(low) begin rstate <= 6'd0; end        //stop 
                                else    begin rstate <= 6'd22; end        
                            end    
                            
                endcase
            end
    end
//assign data_out = data;
endmodule

 

  • 相关文章
发表评论
用户名: 匿名