时间:2024-08-07 来源:网络搜集 关于我们 0
串口接收参数:
波特率:115200(可选)
1位起始位
8位数据位
1位停止位
无校验位
采样方式:取每一位的中间6个点的值,超过4个正确则采样否则不采样。
实现功能:通过上位机串口助手发送多个数据到开发板(ACX720),开发板检测是否有效,有效则取中间数据位控制LED灯,无效则不理会。
参考小梅哥FPGA。
数据帧定义:
控制方式:
有效字节中前面32位作为LED亮灭时间,后面8位作为LED的亮灭方式
例如:
检测到有效帧:55 A5 02 FA F0 80 AA F0
LED亮灭时间:02 FA F0 80 =>十进制:50M
LED亮灭方式:AA=>二进制:1010 1010
表现出来的结果:LED亮1s灭1s循环4次(开发板时钟50MHz)
一般是根据你想控制的方式来计数出数据字节然后再发送。
改进:
1.加入一个结果显示控制开关SW0,功能:打开SW0后LED才会被控制。关闭SW0LED无反应。
2.加入一个接收到有效数据的提示信号LED1,功能:在SW0关闭时,接收到有效数据后LED1亮,提示接收到了有效数据,当SW0打开后,LED1灭,实现类似于新消息提示的功能。
部分代码展示:
testbench仿真验证:
板级验证:
仍未解决的小问题:
SW0关闭时,LED虽然不会继续被控制,但是会保持上一个状态不变
SW0关闭时,在接收到有些亮灭控制信号时例如FF,LED会立即亮,但不受数据控制.
思考原因应该是LED的初始化状态没有想全面.
总结:
做这个实验遇到的问题:
1.位计数器在时间计数器达到最大值的两个时钟都会计数,造成位计数器中奇数个数都只有一个时钟周期。解决方法:时间计数器延时1ns赋值,避开第一个时钟上升沿。
2.不加使能信号的情况下,时间计数器会在上电后立即开始计数,导致接收到有效数据后,计数器早已经超过了原有所设定的最大值,导致永远不会清零。解决方法:计数器清零条件由”等于设定的最大值“改为“大于等于最大值”。
3.语法错误、多加漏加”:;,“,信号名字写错,等一系列小卡拉米错误。解决方法:给自己吃个大嘴霸子。
最后想说,这个实验从开始学习到实现最终功能总共用时2天,其中debug的时间占了1天半,学的不是FPGA,学的是debug ,一直盯着电脑屏幕颈椎快断了T.T