目录
修改地方1:如果没有特殊需求的话,数据长度的增加,输出口数量也应相应地增加,因此需要根据自己的需求增加相应输出端口。
前言,正点原子的uart数据包收发实验例程程序只能实现数据长度为1的数据包接收,在实际中数据长度1是很难满足需求,因此需要对其进行修改。
本文章主要针对接收模块进行修改,若要看如何修改发送请转移到正点原子uart数据包收发实验例程修改---uart通信verilog实现2https://blog.youkuaiyun.com/MR_Colorful/article/details/140072411?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22140072411%22%2C%22source%22%3A%22MR_Colorful%22%7D
通信协议的制定
通信协议一般包括包头、命令、数据长度、数据与校验等,如表
所示:

包头:包头用于表示一帧的开始,此处我们定义为 8’h55;
命令:命令用来区分本次数据包的类型,如发送控制命令或者查询命令,本实验主要定义四种命令,
数据长度:定义后面紧跟着的数据字段的字节数;
数据:接收的有效数据;
校验:用来校验数据包的内容是否正确,本次采用的校验算法为校验和(Checksum),即
将包头、命 令、数据长度和数据进行累加,并取低 8 位作为校验的结果。
接收方通过对比自己计算的校验值和接收到 的校验值是否一致,来判断校验结果是否正确。
修改方案
只需在packet_decode模块进行修改,其余模块无需进行修改。
修改地方1:如果没有特殊需求的话,数据长度的增加,输出口数量也应相应地增加,因此需要根据自己的需求增加相应输出端口。
修改地方2:增加数据长度
在//reg define注释进行修改
//reg define
reg [5:0] cur_state; //状态机的现态
reg [5:0] next_state; //状态机的次态
reg [2:0] data_cnt; //接收到的数据计数器
reg [7:0] data_len; //接收的有效数据长度
//-----修改处1-------
reg [7:0] rec_data; //接收到的数据,表最后一个数据
reg [7:0] rec_data_t0; //接收的数据寄存一拍,表倒二个数据
reg [7:0] rec_data_t1;
......
reg [7:0] rec_data_tn;//接收的数据寄存n拍,表第一个数据
//-----修改处1-------
reg [7:0] checksum; //包的累加校验和
reg skip_en; //控制状态跳转使能信号
修改地方3:对数据进行解析,修改处2作为参考
//接收完成后处理数据
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
led_data <= 2'b0;
beep_data <= 1'b0;
breath_sw <= 1'b0;
breath_fre <= 8'b0;
cur_mode <= uart_wait;
end else if ((parse_result == PARSE_OK) && (parse_done == 1'b1)) begin
//解析命令
if (parse_cmd == LED_CMD) begin //灯
led_data <= {rec_data[4], rec_data[0]};
end else if (parse_cmd == BEEP_CMD) begin
cur_mode[0] <= ((rec_data[0]) ? breath_open : breath_close);
beep_data <= rec_data[0];
end else if (parse_cmd == BREATH_LED_CMD) begin
breath_sw <= rec_data_t0[0];
breath_fre <= rec_data;
cur_mode[1] <= ((rec_data_t0[0]) ? breath_open : breath_close);
end
//----修改处2------------
else if (parse_cmd == CAR_CMD) begin
car_sw <= rec_data_t0[0];
car_ctl <= rec_data;
cur_mode <= car_ctl;
end else if (parse_cmd == ARM_CMD) begin
arm_sw <= rec_data_t1;
arm_aim <= rec_data_t0;
arm_pro <= rec_data;
end
//----修改处2------------
end
end
修改处4:修改data_cnt的位宽
这边的位宽要根据自己的数据长度进行修改,现在位宽为5,即可以接受到数据长度为32的数据
reg [4:0] data_cnt; //接收到的数据计数器