verilog串口接收多个数据进行处理的实现方法

本文探讨了在Verilog中如何处理串口接收多个数据的情况,不同于常见的单字符接收,文中提供了数据缓存的两种方法:使用移位寄存器存储,并在接收完整数据后触发处理。分享了具体的Verilog源代码片段,适用于需要批量接收串口数据的场景。
摘要由CSDN通过智能技术生成

关于使用串口接收多个数据进行处理的问题,目前网上存在的关于verilog串口通信的资料都是属于讲解对于使用串口实现单个字符的接收与发送。而往往在使用串口进行通信时,接数据端都需要通过串口来接收很多数据,然后当所有数据都接收完或者达到某种条件后开始自己的后续工作。所以在这里我把自己的一些具体实现过程以及verilog源代码分享一下,希望对大家有帮助。
(这里只讲利用串口接收数据并处理的部分,发送那部分后面再分享)
先贴上网上很多的串口接收的代码,如下;

module my_uart_rx(
                clk,rst_n,
                rs232_rx,rx_data,rx_int,
                clk_bps,bps_start
            );

input clk;      // 50MHz主时钟
input rst_n;    //低电平复位信号
input rs232_rx; // RS232接收数据信号
input clk_bps;  // clk_bps的高电平为接收或者发送数据位的中间采样点
output bps_start;       //接收到数据后,波特率时钟启动信号置位
output[7:0] rx_data;    //接收数据寄存器,保存直至下一个数据来到 
output rx_int;  //接收数据中断信号,接收到数据期间始终为高电平

//----------------------------------------------------------------
reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;    //接收数据寄存器,滤波用
wire neg_rs232_rx;  //表示数据线接收到下降沿

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
            rs232_rx0 <= 1'b0;
            rs232_rx1 <= 1'b0;
            rs232_rx2 <= 1'b0;
            rs232_rx3 <= 1'b0;
        end
    else begin
            rs232_rx0 <= rs232_rx;
            rs232_rx1 <= rs232_rx0;
            rs232_rx2 <= rs232_rx1;
            rs232_rx3 <= rs232_rx2;
        end
end
    //下面的下降沿检测可以滤掉<20ns-40ns的毛刺(包括高脉冲和低脉冲毛刺),
    //这里就是用资源换稳定(前提是我们对时间要求不是那么苛刻,因为输入信号打了好几拍) 
    //(当然我们的有效低脉冲信号肯定是远远大于40ns的)
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;    //接收到下降沿后neg_rs232_rx置高一个时钟周期

//----------------------------------------------------------------
reg bps_start_r;
reg[3:0] num;   //移位次数
reg rx_int;     //接收数据中断信号,接收到数据期间始终为高电平

always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
            bps_start_r <= 1'bz;
            rx_int <= 1'b0;
        end
    else if(neg_rs232_rx) begin     //接收到串口接收线rs232_rx的下降沿标志信号
            bps_start_r <= 1'b1;    //启动串口准备数据接收
            rx_int <= 1'b1;         //接收数据中断信号使能
        
Verilog中,串口接收数据通常是通过串口接收器(UART Receiver)模块来实现的。根据引用,串口发送端口空闲时为高,发送端口拉低表示数据传送即将开始,字节数据低位先发,字节发送后拉高表示字节传送结束。常用的波特率有4800、9600、115200等。 根据引用中的测试代码,UART_RXer_tb模块通过将串口接收数据RX连接到RX_send来模拟串口接收数据。在该测试代码中,RX_send表示接收到的串口数据的最低位。通过将RX_send[24:0]右移一位并将RX_send[25]设置为RX_send的值来模拟接收到连续的串口数据。 根据引用的说明,这个Verilog程序完成的是接收来自上位机发送的多字节串口数据,并将不同的字节分配给不同的寄存器,以完成相应的控制工作。 因此,Verilog中的串口接收数据是通过串口接收器模块来实现的,该模块根据发送端口的状态来接收串口数据,并将接收到的数据存储在相应的寄存器中进行后续处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Verilog——串口数据接收(状态机)](https://blog.csdn.net/weixin_41788560/article/details/118444413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [串口接收多字节 Verilog程序](https://download.csdn.net/download/zq18362902766/10361036)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值