FPGA project : usrt_rs232

文章详细描述了两个UART收发模块的实现,包括接收端的采样、计数器控制、数据处理和标志位生成,以及发送端的同步、数据发送和停止位设置。还展示了两个测试模块如何使用这些接口进行数据传输。

 

 

module uart_rx
#(
    parameter UART_BPS = 'd9600       ,
              CLK_FREQ = 'd50_000_000 
)(
    input       wire            sys_clk   ,
    input       wire            sys_rst_n ,
    input       wire            rx        ,

    output      reg     [7:0]   po_data   ,
    output      reg             po_flag 
);

    parameter BAUD_CNT_MAX = CLK_FREQ / UART_BPS ;
    // reg define signal
    reg                 rx_reg1     ;
    reg                 rx_reg2     ;
    reg                 rx_reg3     ;
    reg                 start       ;
    reg                 work_en     ;
    reg     [12:00]     baud_cnt    ;
    reg                 bit_flag    ;
    reg     [ 3: 0]     bit_cnt     ;
    reg     [ 7: 0]     rx_data     ;
    reg                 rx_flag     ;

    // rx_reg1     ;rx_reg2     ;rx_reg3     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            rx_reg1 <= 1'b1 ;
            rx_reg2 <= 1'b1 ;
            rx_reg3 <= 1'b1 ;
        end else begin
            rx_reg1 <= rx      ;
            rx_reg2 <= rx_reg1 ;
            rx_reg3 <= rx_reg2 ;
        end
    end
    // start       ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            start <= 1'b0 ;
        end else begin
            if(rx_reg3 == 1'b1 && rx_reg2 == 1'b0 && bit_cnt == 4'd0) begin // 或者bit_cnt换成 work_en == 0 
                start <= 1'b1 ;
            end else begin
                start <= 1'b0 ;
            end
        end
    end
    // work_en     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            work_en <= 1'b0 ;
        end else begin
            if(start == 1'b1) begin
                work_en <= 1'b1 ;
            end else begin
                if((bit_cnt == 4'd8) && (bit_flag == 1'b1)) begin
                    work_en <= 1'b0 ;
                end else begin
                    work_en <= work_en ;
                end
            end
        end
    end
    // [12:00]     baud_cnt    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            baud_cnt <= 13'd0 ;
        end else begin
            if(work_en == 1'b1 && baud_cnt == BAUD_CNT_MAX - 1'b1) begin
                baud_cnt <= 13'd0 ;
            end else begin
                if(work_en == 1'b1) begin
                    baud_cnt <= baud_cnt + 1'b1 ;
                end else begin
                    baud_cnt <= 13'd0 ;
                end
            end
        end
    end
    // always @(posedge sys_clk or negedge sys_rst_n) begin
    //     if(~sys_rst_n) begin
    //         baud_cnt <= 13'd
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值