趙德宇
摘要:電子秤是商家們不可或缺的一項工具,從如何提升測出重量的精度以及如何優(yōu)化電子秤的使用方法的目的出發(fā),我設計了一款基于FPGA的多功能電子秤,有效簡化了制作工藝和操作方式,有效提高了電子秤的效率。整個工程是以FPGA為基礎,接以外設,還有上位機來工作的,選擇的開發(fā)環(huán)境為Vivado 2016.3,作為一個較大的工程,所使用的是分模塊的寫法,最后將其在top文件中連線。
關(guān)鍵詞:電子秤;FPGA;模塊設計;串口通信;通信協(xié)議
中圖分類號:TP368 文獻標識碼:A 文章編號:1007-9416(2019)07-0131-03
0 引言
隨著人們生活水平的提高,商業(yè)的日益發(fā)展,電子秤種類也越來越多。此次的基于FPGA的電子秤設計,是電子秤工作模式的一種變相呈現(xiàn),在理解的基礎上做出的一些改動。一是能夠加深對電子秤等物件的了解,二是改善電子秤的工作步驟,達到簡單的優(yōu)化作用,為了全面優(yōu)化打下基礎。
1 關(guān)鍵模塊簡介
1.1 Hx711稱重模塊簡介
(1)Hx711有四根引出線:VCC線供電;GND線接地;SCK線給予時鐘;DT線輸出數(shù)據(jù)。
(2)Hx711時序圖如圖1。當數(shù)據(jù)輸出管腳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結(jié)構(gòu);1,800 Kbits 快速RAM塊;5個時鐘管理單元,均各含一個鎖相環(huán) (PLL);90個DSP slices;內(nèi)部時鐘最高可達450MHz;1個片上模數(shù)轉(zhuǎn)換器 (XADC)。
1.3 上位機操作模塊簡介
(1)上位機界面圖如圖2所示。
上位機通過輸入單價,向FPGA下發(fā)單價信息,讓FPGA計算出單價乘重量的總價,再由上位機顯示出來,同時還可以選擇匹配串口號。
(2)上位機通信方式簡介:上位機和basys3之間采用串口通信,需要用到串口通信的協(xié)議。
2 關(guān)鍵技術(shù)涉及
2.1 串口通信技術(shù)
(1)串口通信的基本流程:
發(fā)送數(shù)據(jù)的過程:空閑狀態(tài),處于高電位,收到發(fā)送數(shù)據(jù)使能后,拉低一個數(shù)據(jù)位的時間,從高位到低位依次發(fā)送,數(shù)據(jù)位發(fā)送結(jié)束發(fā)送奇偶校驗位和停止位,一幀發(fā)完。[2]
接收數(shù)據(jù)的過程:檢測到下降沿時,按一定速率從低位到高位接受數(shù)據(jù),數(shù)據(jù)接收結(jié)束比較奇偶校驗位是否正確,若正確則存入緩存,錯誤則跳過緩存。
(2)選擇串口通信的理由:
串口通信程序編寫簡單,硬件接口簡單,且用電腦顯示相關(guān)的調(diào)試信息,不需要借助其他外部硬件,可以很方便地進行程序調(diào)試。
2.2 簡單通信協(xié)議技術(shù)
(1)通信協(xié)議的定義:通信協(xié)議是指雙方實體完成通信或服務所必須遵循的規(guī)則和約定。
(2)寫通信協(xié)議的注意事項:定時規(guī)則(時序):即何時通信,明確通信的順序、速率匹配和排序。
(3)簡單通信協(xié)議的寫法:位于底層的串口通信協(xié)議。
(4)常用串行通信連接標準類型簡介:
1)RS-232:RS-232是大部分兼容Windows的桌面計算機的一個標準組件。
2)RS-422:RS-422 (EIA RS-422-A Standard)是傳統(tǒng)Apple計算機的串口連接標準。
3)RS-485:RS-485是RS-422的擴展集,對這些能力進行了擴展。
3 整個電子秤體系的實現(xiàn)
3.1 開發(fā)環(huán)境以及物件的選擇
(1)開發(fā)環(huán)境——選用Vivado 2016.3;
(2)稱重模塊——選用hx711;
(3)FPGA——選用Basys3;
(4)上位機開發(fā)——選用C#和Visual Studio 2017。
3.2 hx711模塊與FPGA之間通信的實現(xiàn)
(1)基本原理:
采用hx711規(guī)定的時序通信示意圖如圖1。
通過自設時鐘PD_SCK,讀取DOUT的數(shù)據(jù)去定義上升沿處在什么位置即可。
(2)重要代碼:
代碼段一(hx711模塊):
always@(posedge clk) din_ff1<=din;//給數(shù)據(jù)做延遲
always@(posedge clk) din_ff2<=din_ff1;//延遲
assign din_fall=din_ff2&(!din_ff1);
這是一個延時檢測下降沿的代碼。
3.3 FPGA與上位機之間通信的實現(xiàn)
(1)FPGA向上位機上發(fā)。
1)基本原理:
每8位組成一個字節(jié)后,12個字節(jié)組成一幀數(shù)據(jù)。起始位字節(jié)是aa,之后的5位字節(jié)是數(shù)據(jù)位,隨后0字節(jié)填充,最后結(jié)束字節(jié)為55。
2)重要代碼(data_gen模塊):
1,parameter ?word_num = 8'd12;//發(fā)送字節(jié)數(shù)
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(傳輸)狀態(tài)時,若一幀數(shù)據(jù)還沒有組完,每過一個時鐘沿,word_cnt都會加1。[3]
(2)上位機向FPGA下發(fā)。
1)基本原理:
起始位字節(jié)aa,12字節(jié),第二位字節(jié)為下發(fā)的單價信息,之后補零字節(jié),結(jié)束位為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
上述代碼解釋了在空閑狀態(tài)st_rx_idle時會循環(huán)讀取數(shù)據(jù),當讀到aa時視為開始接受整幀數(shù)據(jù)(沒有讀到aa會自動這個狀態(tài)中循環(huán))。
3.4 實現(xiàn)邏輯簡介
再Top文件里:hx711中得到的zl(重量數(shù)據(jù))和價格計算模塊的zl連在一起作為價格計算模塊的輸入。單價price乘重量zl的總價再取模得出Money的各十百千,price(單價)和Uart receive模塊里的rxd_data1連在一起,price即VS里描述的str_danjia,對應到rxd_data1。Uart_data_gen模塊里的數(shù)據(jù)位通過連線接在了價格計算模塊數(shù)據(jù)上,再加上一些標志位,形成了一幀含有總價的標準數(shù)據(jù)發(fā)給上位機。
4 結(jié)語
本文詳細闡述了基于FPGA的多功能電子秤的開發(fā)過程,整個工程采用了Verilog語言,主要在Vivado上進行編寫程序,而上位機是在Visual Studio軟件上進行制作。
本文一開始介紹了整個工程各部分關(guān)鍵模塊的工作方法和特點,如hx711,F(xiàn)PGA Basys3,上位機模塊等。此后通過對此次工程技術(shù)需求的分析,介紹了最重要的通信技術(shù)之一:串口通信,從時序,工作方法,使用優(yōu)勢各方面對其進行闡述。還介紹了另一個實用的技術(shù):通信協(xié)議,并從它的定義,寫法,類型進行了分析。之后就是系統(tǒng)的實現(xiàn)部分,詳細給出了實現(xiàn)過程中的環(huán)境,方法,并根據(jù)模塊之間的關(guān)系分塊進行了描述,包括FPGA和hx711模塊之間通信的實現(xiàn),F(xiàn)PGA與上位機之間通信的實現(xiàn),還有整個工程的邏輯連線是怎樣的,都給予了較為詳細的闡述。
綜上所述,本文就設計一個具體的基于FPGA多功能電子秤作了一個較為詳細的闡述,同時也給出了對FPGA和串口進行相關(guān)操作的應用實例,滿足進行FPGA項目設計的所有基本要求。
參考文獻
[1] 尹玲玉.基于單片機的多功能電子秤設計[J].科技經(jīng)濟導刊,2018(14):61.
[2] 于濤.基于單片機的多功能電子秤的設計[J].價值工程,2012(3):136.
[3] 張爭剛,熊剛.基于單片機的多功能電子秤設計[J].機械與電子,2016(11):58-61.