结合uart串口的电子秤实现

明天验收lab5,想起自己实现该实验后就一直在忙着复习期末考试,借此梳理总结一下整个实验我个人的实现思路,以应付助教的"刁钻"提问。

总体框架

  1. 功能:实现板子和pc的互通,同时,板子需要处理pc传输的信息并将有效信息打印在数码管上面
  2. 模块:模块根据功能而定,要实现数据的互通,就要实现uart传输协议的收发器,要处理并且打印信息,就要有相依的GPU和寄存器
  3. 顶层模块:
  • divclk:分频模块,产生多种不同频率的信号
  • ajxd:按键消抖模块
  • uart_rx:接收pc传输的数据
  • frame_seg(无须自己实现): 接受上一个模块传出的一个字节,当处理完一个数据帧(7e开头和7e结尾的10个字节),将有效信息(单价和数量的数据)传出
  • DZC:该模块负责接受并处理单价和数量的数据,产生需要反馈给pc的数据包(如:“AC01000404010004”),同时将要求的数字显示在数码管上
  • sendinfo:负责周期将数据包一个字节一个字节的传输给uart_tx
  • uart_tx: 接受一个字节,并串行传输给pc机

模块间的关系

直接上图,虽然画的比较丑(轻喷)

Android 串口控制电子秤 电子秤串口线_16进制


实现细节

  1. 时钟同步:本人在做该实验的过程中发现,一个模块最好只有一个时钟频率是比较稳妥的,同时,收发器模块最好用同一个时钟频率,我用的是板子的时钟通过16倍波特率换算出来的时钟(clk_16x)。
  2. 收发器的实现:状态机!状态机!还是tmd状态机!这两个模块的状态机实现几乎一模一样,除了发送器要多定义两个状态(开始发送’0’和停止发送’1’)
  3. 如何协调不同模块之间的信号:在每个模块内定义一个反映当前模块状态的输出信号,下一个模块根据当前模块的状态信号执行相应的行为
  4. 如何将数据以十进制的形式打印:为了避免数码管上出现字母("AC"除外),需要将数字按十进制打印。由于数据是以二进制串的方式进行存储的,所以我们只能划分4bit为一个16进制数(0-f),我们无法真正的将数据按照十进制进行存储,但是我们可以将该16进制数转换成10进制的表示形式(任然为16进制数,只不过其形式为原16进制数的10进制的表示形式),说的有点绕,我们来举个例子:

假设我们现在有一串二进制数“0000_1111”,其对应的16进制数为“0f”,其对应的10进制为“15”,现在,对f % 10 = 5, f / 10 = 1, 前者为当前位的数值,后者为进位,调整过后," 0f " -> " 15 "

  1. 如何控制sendinfo的发送节奏:定义一个Send信号,其对应板子上的某个拨码开关,但该信号拉高时,sendinfo开始发送数据包的第一个字节,同时,uart_tx模块中的输出信号中定义一个tx_finish,传输完一个字节后将该信号拉高,同时该信号要传回sendinfo,当sendinfo检测到该信号拉高时,继续发送下一个字节,如此反复,以上的两个模块均用状态机实现。

代码

明天验收完成后我会把代码放上来~