目标
通过串口接收数据,对数据分析,控制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; 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)就会提示编译错误,而第一种会赋值然后条件为真直接运行里面的程序。
来源地址:https://blog.csdn.net/qq_30255657/article/details/132563322