Verilog编写的串口收发程序工作稳定。 代码经过实际应用验证经过高低温等环境实验验证。 有需要的可以联系了 接收帧格式: 帧头 帧长 控制字 数据 校验和 帧尾 EB90 XX XXXX XXXX SUM 146F 发送帧格式 帧头 帧长 数据 校验和 帧尾 EB90 XX XXXX SUM 146F最近在项目中捣鼓出了一个Verilog编写的串口收发程序经过各种“严刑拷打”高低温等环境实验验证工作那叫一个稳定今天就来和大家分享分享。接收帧格式探秘咱先来看看接收帧格式帧头 帧长 控制字 数据 校验和 帧尾EB90 XX XXXX XXXX SUM 146F帧头EB90就像是一把钥匙告诉系统“嘿我开始传输啦”。帧长XX明确了这一帧数据到底有多长控制字XXXX则像是交通指挥员对数据传输进行各种控制数据XXXX是真正的“干货”校验和SUM用来检查数据有没有传错最后帧尾146F就宣告这一帧传输结束。发送帧格式解析发送帧格式也不复杂Verilog编写的串口收发程序工作稳定。 代码经过实际应用验证经过高低温等环境实验验证。 有需要的可以联系了 接收帧格式: 帧头 帧长 控制字 数据 校验和 帧尾 EB90 XX XXXX XXXX SUM 146F 发送帧格式 帧头 帧长 数据 校验和 帧尾 EB90 XX XXXX SUM 146F帧头 帧长 数据 校验和 帧尾EB90 XX XXXX SUM 146F同样以EB90作为帧头开启传输帧长XX说明数据长度接着是数据XXXX校验和SUM保障数据准确性最后146F收尾。关键代码片段及分析下面给大家上点关键代码瞅瞅为简化展示只取部分核心逻辑module uart_receiver ( input wire clk, // 时钟信号 input wire rst_n, // 复位信号低电平有效 input wire rx, // 接收数据引脚 output reg [7:0] data_out, // 输出数据 output reg data_valid // 数据有效信号 ); reg [3:0] bit_counter; // 位计数器 reg [7:0] shift_reg; // 移位寄存器 always (posedge clk or negedge rst_n) begin if (!rst_n) begin bit_counter 4b0000; shift_reg 8b00000000; data_valid 1b0; end else begin if (rx 1b0) begin // 检测到起始位 if (bit_counter 8) begin shift_reg {rx, shift_reg[7:1]}; // 移位操作将接收到的数据移入移位寄存器 bit_counter bit_counter 1; end else begin data_out shift_reg; // 接收完8位数据赋值给输出 data_valid 1b1; bit_counter 4b0000; end end end end endmodule这段接收代码中通过时钟信号clk和复位信号rstn来控制接收过程。bitcounter就像一个小闹钟记录接收的位数shiftreg则像一个传送带把接收到的数据一位一位地“传送”进来。当检测到起始位rx 1b0时就开始把接收到的数据一位一位移入shiftreg等收满8位就把数据给到dataout并拉高datavalid告诉系统数据准备好了。发送部分代码类似通过设置状态机按照发送帧格式依次发送帧头、帧长、数据、校验和和帧尾。module uart_transmitter ( input wire clk, input wire rst_n, input wire [7:0] data_in, input wire send_en, output reg tx ); reg [3:0] state; // 定义状态 typedef enum reg [3:0] { IDLE 4b0000, SEND_HEADER 4b0001, SEND_LENGTH 4b0010, SEND_DATA 4b0011, SEND_CHECKSUM 4b0100, SEND_TAIL 4b0101 } state_type; always (posedge clk or negedge rst_n) begin if (!rst_n) begin state IDLE; tx 1b1; end else begin case (state) IDLE: begin if (send_en) begin state SEND_HEADER; tx 1b0; // 起始位 end end SEND_HEADER: begin // 发送帧头相关逻辑 state SEND_LENGTH; end // 后续状态类似依次发送帧长、数据、校验和、帧尾 default: state IDLE; endcase end end endmodule在发送模块里state状态机决定了当前处于发送流程的哪一步。IDLE状态下等待发送使能信号senden一旦使能就进入SENDHEADER状态发送帧头之后按顺序完成整个发送流程。这个串口收发程序经过实际应用验证稳定性杠杠的。要是有需要的小伙伴可以联系我呀大家一起交流学习~说不定能碰撞出更多火花呢
超稳Verilog串口收发程序,你值得拥有
Verilog编写的串口收发程序工作稳定。 代码经过实际应用验证经过高低温等环境实验验证。 有需要的可以联系了 接收帧格式: 帧头 帧长 控制字 数据 校验和 帧尾 EB90 XX XXXX XXXX SUM 146F 发送帧格式 帧头 帧长 数据 校验和 帧尾 EB90 XX XXXX SUM 146F最近在项目中捣鼓出了一个Verilog编写的串口收发程序经过各种“严刑拷打”高低温等环境实验验证工作那叫一个稳定今天就来和大家分享分享。接收帧格式探秘咱先来看看接收帧格式帧头 帧长 控制字 数据 校验和 帧尾EB90 XX XXXX XXXX SUM 146F帧头EB90就像是一把钥匙告诉系统“嘿我开始传输啦”。帧长XX明确了这一帧数据到底有多长控制字XXXX则像是交通指挥员对数据传输进行各种控制数据XXXX是真正的“干货”校验和SUM用来检查数据有没有传错最后帧尾146F就宣告这一帧传输结束。发送帧格式解析发送帧格式也不复杂Verilog编写的串口收发程序工作稳定。 代码经过实际应用验证经过高低温等环境实验验证。 有需要的可以联系了 接收帧格式: 帧头 帧长 控制字 数据 校验和 帧尾 EB90 XX XXXX XXXX SUM 146F 发送帧格式 帧头 帧长 数据 校验和 帧尾 EB90 XX XXXX SUM 146F帧头 帧长 数据 校验和 帧尾EB90 XX XXXX SUM 146F同样以EB90作为帧头开启传输帧长XX说明数据长度接着是数据XXXX校验和SUM保障数据准确性最后146F收尾。关键代码片段及分析下面给大家上点关键代码瞅瞅为简化展示只取部分核心逻辑module uart_receiver ( input wire clk, // 时钟信号 input wire rst_n, // 复位信号低电平有效 input wire rx, // 接收数据引脚 output reg [7:0] data_out, // 输出数据 output reg data_valid // 数据有效信号 ); reg [3:0] bit_counter; // 位计数器 reg [7:0] shift_reg; // 移位寄存器 always (posedge clk or negedge rst_n) begin if (!rst_n) begin bit_counter 4b0000; shift_reg 8b00000000; data_valid 1b0; end else begin if (rx 1b0) begin // 检测到起始位 if (bit_counter 8) begin shift_reg {rx, shift_reg[7:1]}; // 移位操作将接收到的数据移入移位寄存器 bit_counter bit_counter 1; end else begin data_out shift_reg; // 接收完8位数据赋值给输出 data_valid 1b1; bit_counter 4b0000; end end end end endmodule这段接收代码中通过时钟信号clk和复位信号rstn来控制接收过程。bitcounter就像一个小闹钟记录接收的位数shiftreg则像一个传送带把接收到的数据一位一位地“传送”进来。当检测到起始位rx 1b0时就开始把接收到的数据一位一位移入shiftreg等收满8位就把数据给到dataout并拉高datavalid告诉系统数据准备好了。发送部分代码类似通过设置状态机按照发送帧格式依次发送帧头、帧长、数据、校验和和帧尾。module uart_transmitter ( input wire clk, input wire rst_n, input wire [7:0] data_in, input wire send_en, output reg tx ); reg [3:0] state; // 定义状态 typedef enum reg [3:0] { IDLE 4b0000, SEND_HEADER 4b0001, SEND_LENGTH 4b0010, SEND_DATA 4b0011, SEND_CHECKSUM 4b0100, SEND_TAIL 4b0101 } state_type; always (posedge clk or negedge rst_n) begin if (!rst_n) begin state IDLE; tx 1b1; end else begin case (state) IDLE: begin if (send_en) begin state SEND_HEADER; tx 1b0; // 起始位 end end SEND_HEADER: begin // 发送帧头相关逻辑 state SEND_LENGTH; end // 后续状态类似依次发送帧长、数据、校验和、帧尾 default: state IDLE; endcase end end endmodule在发送模块里state状态机决定了当前处于发送流程的哪一步。IDLE状态下等待发送使能信号senden一旦使能就进入SENDHEADER状态发送帧头之后按顺序完成整个发送流程。这个串口收发程序经过实际应用验证稳定性杠杠的。要是有需要的小伙伴可以联系我呀大家一起交流学习~说不定能碰撞出更多火花呢