• Verilog HDL SPI通信——读


    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
  • 相关阅读:
    C# 1.0 到 C# 3.0 委托创建过程的发展
    C#禁用窗体最大化按钮
    TeamViewer 通过Internet进行远程访问和远程支持
    c# 匿名方法
    BeginInvoke会重新开一个线程
    c# 线程调用带参数的函数
    c# msdn 委托
    判断某张表是否存在在数据库中(access 2003 与sql server 2008)
    新浪微博自动发送微博 功能已实现(net)
    validateRequest="false" 在asp.net 4.0中失效的解决办法
  • 原文地址:https://www.cnblogs.com/Mungbohne/p/4386937.html
Copyright © 2020-2023  润新知