基于FPGA的多功能电子秤设计
2019-11-01赵德宇
赵德宇
摘要:电子秤是商家们不可或缺的一项工具,从如何提升测出重量的精度以及如何优化电子秤的使用方法的目的出发,我设计了一款基于FPGA的多功能电子秤,有效简化了制作工艺和操作方式,有效提高了电子秤的效率。整个工程是以FPGA为基础,接以外设,还有上位机来工作的,选择的开发环境为Vivado 2016.3,作为一个较大的工程,所使用的是分模块的写法,最后将其在top文件中连线。
关键词:电子秤;FPGA;模块设计;串口通信;通信协议
中图分类号:TP368 文献标识码:A 文章编号:1007-9416(2019)07-0131-03
0 引言
随着人们生活水平的提高,商业的日益发展,电子秤种类也越来越多。此次的基于FPGA的电子秤设计,是电子秤工作模式的一种变相呈现,在理解的基础上做出的一些改动。一是能够加深对电子秤等物件的了解,二是改善电子秤的工作步骤,达到简单的优化作用,为了全面优化打下基础。
1 关键模块简介
1.1 Hx711称重模块简介
(1)Hx711有四根引出线:VCC线供电;GND线接地;SCK线给予时钟;DT线输出数据。
(2)Hx711时序图如图1。当数据输出管脚DOUT为高电平时,串口时钟输入信号PD_SCK应为低电平。当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲。[1]
1.2 Basys3 FPGA简介
(1)Basys3 FPGA的外形与起源:BASYS 3包含所有BASYS板中的标准功能:完成准备使用的硬件,收集了大量的板载I/O设备,所有需要FPGA支持电路。
(2)Basys3 的特点:33,280个逻辑单元,六输入LUT结构;1,800 Kbits 快速RAM块;5个时钟管理单元,均各含一个锁相环 (PLL);90个DSP slices;内部时钟最高可达450MHz;1个片上模数转换器 (XADC)。
1.3 上位机操作模块简介
(1)上位机界面图如图2所示。
上位机通过输入单价,向FPGA下发单价信息,让FPGA计算出单价乘重量的总价,再由上位机显示出来,同时还可以选择匹配串口号。
(2)上位机通信方式简介:上位机和basys3之间采用串口通信,需要用到串口通信的协议。
2 关键技术涉及
2.1 串口通信技术
(1)串口通信的基本流程:
发送数据的过程:空闲状态,处于高电位,收到发送数据使能后,拉低一个数据位的时间,从高位到低位依次发送,数据位发送结束发送奇偶校验位和停止位,一帧发完。[2]
接收数据的过程:检测到下降沿时,按一定速率从低位到高位接受数据,数据接收结束比较奇偶校验位是否正确,若正确则存入缓存,错误则跳过缓存。
(2)选择串口通信的理由:
串口通信程序编写简单,硬件接口简单,且用电脑显示相关的调试信息,不需要借助其他外部硬件,可以很方便地进行程序调试。
2.2 简单通信协议技术
(1)通信協议的定义:通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。
(2)写通信协议的注意事项:定时规则(时序):即何时通信,明确通信的顺序、速率匹配和排序。
(3)简单通信协议的写法:位于底层的串口通信协议。
(4)常用串行通信连接标准类型简介:
1)RS-232:RS-232是大部分兼容Windows的桌面计算机的一个标准组件。
2)RS-422:RS-422 (EIA RS-422-A Standard)是传统Apple计算机的串口连接标准。
3)RS-485:RS-485是RS-422的扩展集,对这些能力进行了扩展。
3 整个电子秤体系的实现
3.1 开发环境以及物件的选择
(1)开发环境——选用Vivado 2016.3;
(2)称重模块——选用hx711;
(3)FPGA——选用Basys3;
(4)上位机开发——选用C#和Visual Studio 2017。
3.2 hx711模块与FPGA之间通信的实现
(1)基本原理:
采用hx711规定的时序通信示意图如图1。
通过自设时钟PD_SCK,读取DOUT的数据去定义上升沿处在什么位置即可。
(2)重要代码:
代码段一(hx711模块):
always@(posedge clk) din_ff1<=din;//给数据做延迟
always@(posedge clk) din_ff2<=din_ff1;//延迟
assign din_fall=din_ff2&(!din_ff1);
这是一个延时检测下降沿的代码。
3.3 FPGA与上位机之间通信的实现
(1)FPGA向上位机上发。
1)基本原理:
每8位组成一个字节后,12个字节组成一帧数据。起始位字节是aa,之后的5位字节是数据位,随后0字节填充,最后结束字节为55。
2)重要代码(data_gen模块):
1,parameter word_num = 8'd12;//发送字节数
2,word1:
begin
if(word_cnt==word_num)
curr_st<=word1_gap;
else ;
end
3,always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
word_cnt<=0;
else if(curr_st==idle||curr_st==word1_gap)
word_cnt<=0;
else if((curr_st==word1)&byte_end_rise)
word_cnt<=word_cnt+1;
else ;
end
4,else case({curr_st,word_cnt})
{word1,8'h0}:begin data<=din0;data_valid<=1;end
{word1,8'h1}:begin data<=din1;data_valid<=1;end
{word1,8'h2}:begin data<=din2;data_valid<=1;end
{word1,8'h3}:begin data<=din3;data_valid<=1;end
{word1,8'h4}:begin data<=din4;data_valid<=1;end
{word1,8'h5}:begin data<=din5;data_valid<=1;end
{word1,8'h6}:begin data<=din6;data_valid<=1;end
{word1,8'h7}:begin data<=din7;data_valid<=1;end
{word1,8'h8}:begin data<=din8;data_valid<=1;end
{word1,8'h9}:begin data<=din9;data_valid<=1;end
{word1,8'ha}:begin data<=din10;data_valid<=1;end
{word1,8'hb}:begin data<=din11;data_valid<=1;end
default: begin data<=8'h00;data_valid<=0;end
endcase
上述代码在word1(传输)状态时,若一帧数据还没有组完,每过一个时钟沿,word_cnt都会加1。[3]
(2)上位机向FPGA下发。
1)基本原理:
起始位字节aa,12字节,第二位字节为下发的单价信息,之后补零字节,结束位为55。
2)重要代码(uart_rece模塊):
1,st_rx_idle:
begin
rxd_data_vld<=1'b0;
check_sum<=0;
if(rxd_data_rdy&&rxd_data==8'haa)
begin
rxd_data0<=8'haa;
curr_st<=st_rx1;
end
else if(timeout_cnt==TIMEOUT_NUM)
curr_st<=st_rx_idle;
else;
end
2,st_rx1:
begin
if(rxd_data_rdy)
begin
check_sum<=check_sum^rxd_data;
rxd_data1<=rxd_data;
curr_st<=st_rx2;
end
else if(timeout_cnt==TIMEOUT_NUM)
curr_st<=st_rx_idle;
else;
end
3,st_tail:
begin
if(rxd_data_rdy&&rxd_data==8'h55)
begin
rxd_data11<=8'h55;
curr_st<=st_rx_idle;
rxd_data_vld<=1;
end
else if(timeout_cnt==TIMEOUT_NUM)
curr_st<=st_rx_idle;
else;
end
4,always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
timeout_cnt<=0;
else if(curr_st==st_rx_idle)
timeout_cnt<=0;
else if(rxd_data_rdy)
timeout_cnt<=0;
else
imeout_cnt<=timeout_cnt+1;
end
上述代码解释了在空闲状态st_rx_idle时会循环读取数据,当读到aa时视为开始接受整帧数据(没有读到aa会自动这个状态中循环)。
3.4 实现逻辑简介
再Top文件里:hx711中得到的zl(重量数据)和价格计算模块的zl连在一起作为价格计算模块的输入。单价price乘重量zl的总价再取模得出Money的各十百千,price(单价)和Uart receive模块里的rxd_data1连在一起,price即VS里描述的str_danjia,对应到rxd_data1。Uart_data_gen模块里的数据位通过连线接在了价格计算模块数据上,再加上一些标志位,形成了一帧含有总价的标准数据发给上位机。
4 结语
本文详细阐述了基于FPGA的多功能电子秤的开发过程,整个工程采用了Verilog语言,主要在Vivado上进行编写程序,而上位机是在Visual Studio软件上进行制作。
本文一开始介绍了整个工程各部分关键模块的工作方法和特点,如hx711,FPGA Basys3,上位机模块等。此后通过对此次工程技術需求的分析,介绍了最重要的通信技术之一:串口通信,从时序,工作方法,使用优势各方面对其进行阐述。还介绍了另一个实用的技术:通信协议,并从它的定义,写法,类型进行了分析。之后就是系统的实现部分,详细给出了实现过程中的环境,方法,并根据模块之间的关系分块进行了描述,包括FPGA和hx711模块之间通信的实现,FPGA与上位机之间通信的实现,还有整个工程的逻辑连线是怎样的,都给予了较为详细的阐述。
综上所述,本文就设计一个具体的基于FPGA多功能电子秤作了一个较为详细的阐述,同时也给出了对FPGA和串口进行相关操作的应用实例,满足进行FPGA项目设计的所有基本要求。
参考文献
[1] 尹玲玉.基于单片机的多功能电子秤设计[J].科技经济导刊,2018(14):61.
[2] 于涛.基于单片机的多功能电子秤的设计[J].价值工程,2012(3):136.
[3] 张争刚,熊刚.基于单片机的多功能电子秤设计[J].机械与电子,2016(11):58-61.