目标
通过串口接收数据,对数据分析,控制8个LED灯按照设定时间闪烁。
- 8个LED灯可以任意设计,是否闪烁。
- 闪烁时间按ms计算,通过串口发送,可设置1~4,294,967,296ms,也就是4字节数据
- 协议自拟,有数据报文头和尾
实现
串口接收8字节数据,2字节头+4字节time+1字节LED+1字节尾
数据协议定义:
7 | 6 | 5 4 3 2 | 1 | 0 |
---|---|---|---|---|
0x55 | 0xA5 | time[31:0] | ctrl[7:0] | 0xF0 |
分析到一帧完整数据就可是提取并设置LED闪烁样式。
模块划分:
- 串口接收
- 串口数据分析
- LED控制
- 顶层连接
硬件
串口GPIO:
LEDGPIO:
软件
/****************顶层********************/
uart_rx_ctrl_led(
Clk,
Reset_n,
Led,
uart_rx
);
input Clk;
input Reset_n;
output wire[7:0]Led;
input uart_rx;
/****************led控制********************/
wire [7:0] ctrl;
wire [31:0] time_set;
counter_led counter_led(
.Clk(Clk),
.Reset_n(Reset_n),
.Ctrl_data(ctrl),
.Time(time_set),
.led(Led)
);
/****************串口接收********************/
wire [7:0]rx_data;
wire rx_done;
uart_rx uart_rx_in(
.Clk(Clk),
.Reset_n(Reset_n),
.Baund_set(4),
.uart_Rx(uart_rx),
.Data(rx_data),
.Rx_Done(rx_done)
);
/****************串口处理********************/
uart_cmd uart_cmd(
.Clk(Clk),
.Reset_n(Reset_n),
.rx_data(rx_data),
.rx_done(rx_done),
.ctrl(ctrl),
.time_set(time_set)
);
注意
- 数据分析采用——检测缓冲区,不断去检测该缓冲区首尾,是否符合要求。
- 在进行时间赋值时,采用 if(tims_ms == time_set)进行清空,不好的地方就是time_ms>time_set时不会进行清空,直到计数溢出重新计到设定值,所以这地方要改成if( time_ms >= time_set )时对time_ms清空。
- 对于判断中有数字与变量的判断要养成把数字写在前的习惯,能避免if( time = 10)这种错误,if(10 = time)就会提示编译错误,而第一种会赋值然后条件为真直接运行里面的程序。