目标
通过串口接收数据,对数据分析,控制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控制
- 顶层连接
硬件
串口:
XC6206P332MR特点:
输出电压:3.3V(固定输出电压版本)
输入电压范围:2.5V - 6.0V
最大输出电流:约200mA
静态电流:典型值为30μA(在无负载时)
超低压降:具有较低的输入输出压差
过压保护:当输入电压超过设定阈值时自动切断输出
过电流保护:在输出短路或超过最大输出电流时自动切断输出
短路保护:在输出短路情况下自动切断输出,以保护芯片和其他电路
串口接两个LED灯:用于收发信息指示,最好使用两种颜色的灯。
稳压二极管:限制传输到FPGA的电压,防止电压过高,损坏FPGA。文章来源:https://www.toymoban.com/news/detail-681410.html
LEDGPIO:
文章来源地址https://www.toymoban.com/news/detail-681410.html
软件
/****************顶层********************/
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)就会提示编译错误,而第一种会赋值然后条件为真直接运行里面的程序。
到了这里,关于串口接收数据-控制LED灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!