• FPGA实现串口发送


    `timescale 1ns / 1ps
    //////////////////////////////////////////////////////////////////////////////////
    // Company: 
    // Engineer: 
    // 
    // Create Date:    15:18:50 01/01/2022 
    // Design Name: 
    // Module Name:    uart 
    // Project Name: 
    // Target Devices: 
    // Tool versions: 
    // Description: 
    //
    // Dependencies: 
    //
    // Revision: 
    // Revision 0.01 - File Created
    // Additional Comments: 
    //
    //////////////////////////////////////////////////////////////////////////////////
    module uart(
            clk,
            Reset_n,
            Data,
            Send_en,
            Bund_set,
            uart_tx,
            Tx_Done
        );
        input clk;
        input Reset_n;
        input [7:0]Data;
        input Send_en;
        input [2:0]Bund_set;
        output reg uart_tx;
        output reg Tx_Done;
        
        reg[17:0] div_cnt;//分频得到基本时钟
        reg[17:0] bps_DR;
        
        
        
        
        //译码,将波特率选择翻译成为计数器bps_DR的值    
        //前提:时钟周期为50Mhz,所以时钟周期为20ns
        //波特率:指的是一秒中能发送多少数据,以115200为例。
        //所以每个数据的发送需要占多少个时钟周期 div_cnt负责计数:1000000000/115200/20 = 434,而bps_DR则是其计数的门限
        //所以bpd_DR的多少是取决于Bund_set
        
        always@(posedge clk or negedge Reset_n)
        if(!Reset_n)
            div_cnt <= 0;
        else if(Send_en)begin
            if(div_cnt == bps_DR - 1)
                div_cnt <= 0;
            else
                div_cnt <= div_cnt + 1'b1;
            end
        else
            div_cnt <= 0;
        always@(*)
            case(Bund_set)
                4 : bps_DR <= 434;  //115200
                3 : bps_DR <= 868;  //57600
                2 : bps_DR <= 1302; //38400
                1 : bps_DR <= 2604; //19200
                0 : bps_DR <= 5208; //9600
                default:bps_DR <= 5208;
            endcase
        
        reg [3:0]bps_counter;
       always@(posedge clk or negedge Reset_n)
        if(!Reset_n)
            bps_counter <= 0;
        else if(Send_en)begin
            if(div_cnt == 1)begin
                if(bps_counter == 11)
                    bps_counter <= 0;
                else
                    bps_counter <= bps_counter + 1'b1;
            end
        end
        else
            bps_counter <= 0;
        always@(posedge clk or negedge Reset_n)
        if(!Reset_n)
            uart_tx <= 1'b0;
        else begin
            case(bps_counter) 
                1:uart_tx <= 1'b0;
                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:uart_tx <= 1; 
                default: uart_tx <= 1;
            endcase
        end
        always@(posedge clk or negedge Reset_n)
        if(!Reset_n)
            Tx_Done <= 1'b0;
        else if((div_cnt == 1) && (bps_counter == 10))
            Tx_Done <= 1'b1;
        else
            Tx_Done <= 1'b0;
            
    endmodule
    `timescale 1ns / 1ps
    
    ////////////////////////////////////////////////////////////////////////////////
    // Company: 
    // Engineer:
    //
    // Create Date:   21:37:13 01/01/2022
    // Design Name:   uart
    // Module Name:   E:/FPGA_WORKSPACE/uart/uart_test.v
    // Project Name:  uart
    // Target Device:  
    // Tool versions:  
    // Description: 
    //
    // Verilog Test Fixture created by ISE for module: uart
    //
    // Dependencies:
    // 
    // Revision:
    // Revision 0.01 - File Created
    // Additional Comments:
    // 
    ////////////////////////////////////////////////////////////////////////////////
    
    module uart_test;
    
        // Inputs
        reg clk;
        reg Reset_n;
        reg [7:0] Data;
        reg Send_en;
        reg [2:0] Bund_set;
    
        // Outputs
        wire uart_tx;
        wire Tx_Done;
    
        // Instantiate the Unit Under Test (UUT)
        uart uut (
            .clk(clk), 
            .Reset_n(Reset_n), 
            .Data(Data), 
            .Send_en(Send_en), 
            .Bund_set(Bund_set), 
            .uart_tx(uart_tx), 
            .Tx_Done(Tx_Done)
        );
        initial clk = 1;
        always #10 clk = !clk;
        initial begin
            // Initialize Inputs
            Reset_n = 0;
            Data = 0;
            Send_en = 0;
            Bund_set = 0;
    
            // Wait 100 ns for global reset to finish
            #201;
          Reset_n = 1;
            #200;
            Data = 8'h57;
            Send_en = 1;
            Bund_set = 3;
            // Add stimulus here
    
        end
          
    endmodule
  • 相关阅读:
    python 抓取网页
    Vim XDebug调试PHP php远程调试
    10 条 nmap 技巧
    Linux修改文件及文件夹权限
    mysql 常用命令 汇总
    VS2010打开过多的IntelliTrace.exe进程导致虚拟内存不足的解决办法
    黄聪:MYSQL远程连接失败:ERROR 1130: mysql 1130连接错误的有效解決方法
    黄聪:WordPress搬家更换域名教程
    黄聪:使用 ALinq 实现 Linq to MySQL【转】
    黄聪:Filezilla 二进制上传设定
  • 原文地址:https://www.cnblogs.com/qkqBeer/p/15759334.html
Copyright © 2020-2023  润新知