串口发送模块学习

学习视频链接:10A 串口发送应用之发送数据_哔哩哔哩_bilibili

//接口数量
module uart_byte_tx(
    Clk,
    Reset_n,
    Send_en,
    Baud_set,
    Uart_tx,
    Tx_done
);

    //接口类型 
    input Clk;
    input Reset_n;   
    input  Send_en;//发送指令为1工作
    input [2:0]Baud_set;
    output reg Uart_tx;//时序波型数据位
    output reg Tx_done;

    //中间变量
    reg [7:0]Data;
    reg [17:0]div_cnt;
    reg [17:0]bps_DR;
    reg [3:0]bps_cnt;
    reg [19:0]time_cnt;
    reg flag_bps_cnt;
    wire bps_clk;
    
    
    
    //Baud_set = 0 -> bps_DR = 9600;
    //Baud_set = 1 -> bps_DR = 19200;
    //Baud_set = 2 -> bps_DR = 38400;
    //Baud_set = 3 -> bps_DR = 57600;
    //Baud_set = 4 -> bps_DR = 115200;
    //10^9/bps_DR/20
    always@(*)
        case(Baud_set)
            0: bps_DR = 1000000000/9600/20;
            1: bps_DR = 1000000000/19200/20;
            2: bps_DR = 1000000000/38400/20;
            3: bps_DR = 1000000000/57600/20;
            4: bps_DR = 1000000000/115200/20;
            default:bps_DR = 1000000000/9600/20;
        endcase
    
    assign bps_clk = (div_cnt == 1);
    
    always@(posedge Clk or negedge Reset_n)   //10000000/20 10ms计时器
    if(!Reset_n)
        time_cnt <= 0;
    else if(time_cnt == 10000000/20 - 1)
        time_cnt <= 0;
    else
        time_cnt <= time_cnt+1;
    
    always@(posedge Clk or negedge Reset_n)   //内部产生的发射信号1、2、3
    if(!Reset_n)
        Data <= 0;
    else if(time_cnt == 1)begin
        Data <= Data+1;
    end
 
// 思考一下把flag改为Send_en //好像不行输入变量无法reg
//always@(posedge Clk or negedge Reset_n)   //唤醒flag 控制bps_cnt
//    if(!Reset_n)
//        flag_bps_cnt <= 0;
//    else if(time_cnt == 1)
//        flag_bps_cnt <=1;
    always@(posedge Clk or negedge Reset_n) 
        if(!Reset_n)                        
            flag_bps_cnt <= 0;              
        else if(time_cnt == 1)              
            flag_bps_cnt <=1;               
            
//cnt计数分隔段        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        div_cnt <= 0;
    else if(flag_bps_cnt)begin
        if(Send_en)begin
            if(div_cnt == bps_DR-1)
                div_cnt <= 0;
            else 
                div_cnt <= div_cnt + 1'b1;
        end
    end
    else
        div_cnt <= 0;
           
     // 计数发送1+8+1=10段  
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        bps_cnt <= 0;
    else if(flag_bps_cnt)begin
        if(Send_en)begin
             if( bps_clk)begin
                 if(bps_cnt == 12)
                     bps_cnt <= 0;
                 else 
                     bps_cnt <= bps_cnt + 1'b1;
             end 
        end
    end
    else
        bps_cnt <= 0;
    
//发送数据
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)begin
        Uart_tx <= 1'b1;
        Tx_done<= 1'b0;
    end
    else begin
        case(bps_cnt)
            0:Tx_done<= 1'b1;
            1:begin Uart_tx <= 0;end 
            2: Uart_tx <= Data[0];               
            3: Uart_tx <= Data[1];               
            4: Uart_tx <= Data[2];               
            5: Uart_tx <= Data[3];               
            6: Uart_tx <= Data[4];               
            7: Uart_tx <= Data[5];               
            8: Uart_tx <= Data[6];               
            9: Uart_tx <= Data[7];               
            10:Uart_tx <= 1;                     
            11:begin Uart_tx <= 1;Tx_done<= 1'b0;end
            12:flag_bps_cnt <=0;
               //结束空间                            
            default:Uart_tx <= 1;
         
        endcase
    end
             
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值