找回密码
 注册
关于网站域名变更的通知
查看: 376|回复: 1
打印 上一主题 下一主题

转——【小梅哥FPGA进阶教程】第十三章 四通道数字电压表

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-28 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Zedd 于 2019-3-30 16:02 编辑
  j$ J3 M( m9 g7 @6 r5 ?( V$ {  }% c5 W' A1 c% ^3 O
十三、四通道数字电压表
0 c9 r/ [+ u2 x- B( H

- _) g; g% i. v! x1 I
' n: B( y5 Z0 t. E- n$ ?
0 G+ g' g$ O- h
本文由山东大学研友袁卓贡献,特此感谢

- a8 }; x& B4 ], U9 D实验目的

3 p9 r9 m" \7 g) T) E7 j设计一个四通道的数字电压表( L! K5 O! |; _  Z' S& b3 o

2 K  q/ |) Z9 {3 |6 w1 _实验平台3 y# J) C2 V1 L  D4 m" w
芯航线FPGA核心板、AD/DA模块
9 T) E3 ~9 U: H* W5 _8 b

. A. A/ C: A, k4 @8 h, d1 m  p: c
* g8 T( B- x; ?" Z3 }/ x: L

8 ?  B0 k7 m7 r0 i( @( E/ R实验现象
. o/ {8 E- {  ]' B9 R实现一个四通道的数字电压表,其中可以用按键切换测量通道并在4位数码管上显示对应的测量值。
! i+ ], K% I: E5 |1 j) H实验原理及步骤" ^: d$ D5 |+ {% L. c8 ~
数字电压表的工作原理即为,被测信号接入ADC模块的输入引脚,FPGA控制ADC的转换进程以及原始数据的采集,并将其采集到的二进制数据转换为数码管的显示数据。其中按键可以选择ADC模块不同的通道。其系统工作原理图如图1所示。
( M7 u% j. A- {7 ]) c
# w* `, Z! n4 F8 n, N

) |9 Y* @6 c# x: R0 [6 }& D
图1 系统工作原理图
由工作原理图可以暂时将本系统划分为ADC控制模块、码制转换模块、按键数据模块以及数码管驱动模块组成。
5 \8 E1 I( R, D
ADC控制模块之TLV1544

: U9 L1 h* n3 g* @3 r1 {0 _
本系统采用的是TLV1544芯片,其为10位的ADC。因此其理论测量精度为

0 @" j+ a$ X, K  x# d
4 h- r! [6 ^0 b% b- f- B( m9 f
,且当其输出为’d
  Y3 g1 f3 E+ o# Y( r* c! N
时,实际电压为
, e: B7 B) c% Z2 M. v. e1 P

5 o' z. g8 w; e5 j$ o3 u
+ i, t# ?3 \+ T
V。本模块的设计在基础课程已经讲解,此处不再详述。其模块接口示意图如下所示。

; b+ b9 H, C% D  {
" L! e' `8 G5 G2 M
( }) a0 b" B' }* s8 H
图2 ADC模块接口示意图
数据预处理模块

* w: Y$ z( K% ?/ w( E1 S1 h
ADC模块输出还是一个十位二进制数,因此需要先将数据转换成实际电压值。
6 h- d* F  L- i- C1 }5 j, T. f

. ?7 M6 p6 z+ a4 l6 ]上式中3.42为满量程电压,data为输出的二进制数,1024为ADC总的阶梯数。之所以是3.42,是本模块基准电源TL341输出电压。
# @* S3 _! G1 ~这样得出的数据太小,因此先将其放大 倍。这里也可以放大其他倍数。0 Q9 V" t/ N% X. f

3 ^! J0 k5 t! e$ {经过上式的转换, 还是一个小数,这里再放大1000倍以消除小数。即实际显示的数据为实际电压的1000倍。这样就完成了二进制数到实际电压的转换。
  j& w/ t% U1 `2 p0 }- c' L
% z) o' K. S( S8 M$ I- {4 j
: a! N, {3 o6 m+ e
由于在上面TLV1544驱动设计中,数据更新速度为4000ns/次。这样已足够用做电压表显示,但是此处为了使数据稳定,加入均值滤波程序。本模块接口示意图如图3所示,其接口功能列表如表1所示。
2 I6 B- J- I3 R: ~5 U

) c* ]5 \: ?) t8 r4 K
图3 数据预处理模块接口示意图

: D  x9 _  Z- F& a
表1 数据预处理模块接口功能描述
先将原始数据进行累加1024次。
' W) m  `* p* ]- @

" n  M. y, ]2 e+ ]3 F3 D将累加后的数据除以1024,也就是右移10位,这里数据总位数为20直接取其高10位即可。
' F+ D$ q( I. G8 G& J0 u

& s! T( z5 W; Z7 U: G5 o, s利用上面推导的公式即可输出最后的数据。3 P1 Y0 m- G/ e- J6 ]- a4 _

' H' q7 M! k0 ~5 A: e, t码制转换模块  {$ ~3 S; h/ m! q
由于ADC输出的为10位二进制数而数码管需要的是BCD码的格式,因此需要将其进行码制的转换。
# @% C8 s6 q9 ?& h$ L, l. B首先,先了解二进制与BCD码的位数对应关系。比如一个8位二进制码,可以表示的最大十进制数为255,转换成BCD码为 0010_0101_0101,共需12位,其中每4位组成一个BCD单元。n位二进制码转换成D个BCD码的n~D对应关系表见表2。" Z. @$ s# N- p$ O0 O) r: y) r+ ]
) O: {$ E9 ?& b' H
0 \# D$ @, b& z/ R7 W
表2  n~D对应关系
此处采用加3移位法进行转换,附件中列举了另一种方式来进行转换。以8位二进制转换为3位BCD码为例,转换步骤是:将待转换的二进制码从最高位开始左移BCD的寄存器(从高位到低位排列),每移一次,检查每一位BCD码是否大于4,是则加上3,否则不变。左移8次后,即完成了转换。需要注意的是第八次移位后不需要检查是否大于5。
$ g; [! m7 c3 H9 s  O. w1 |
注意:为什么检查每一个BCD码是否大于4,因为如果大于 4(比如 5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。

+ {& \' D7 `* {9 q9 W( p
表3给出了一个二进制码11101011转换成8421BCD码的时序。
" m: |4 N; f" [9 t

8 |7 R2 W" s5 W; o9 m7 `) S
表3  B/BCD时序
首先进行判断一个BCD码是否大于4,是则进行加3处理,否则输出原来数值。

3 a  e' z/ z+ S" A' E( k2 ?  @
0 o/ J0 U8 Z' h$ s+ K, s8 n
由以上原理可看出,这里需要定义一个10+12位的寄存器。同时从表3克拿出有几位二进制数就需移位几次。这里为了增加适用范围,将输入定位20位的二进制数,因此输出为7*4位BCD数。这样定义一个48位的移位寄存器。低20位为二进制数,高28位为BCD码。
/ a4 m8 p& Y  t* w) ]* _2 s( {) d每移位一次就需验证高28位BCD码是否大于4因此,编写以下代码。
1 K7 P0 ^. r8 e& @; m3 s

/ w8 ]( {: g5 P4 L2 x/ i* ]1 k现在编写顶层文件,其端口示意图及功能描述如下所示/
3 `+ b, e' p$ D* U( Q

. b5 U" Y; u# z0 c9 Z9 C; g/ Q- v
图4 码制转换模块接口示意图
" e5 s) d' t3 w" z1 r
表4 码制转换模块接口功能描述

% [. g& t! \% Z  ]: t! j向左移位20次。  i) Z  u; g  T9 G$ q  v
, ?9 z2 }3 {- `# O$ q7 W/ g
) y: [8 X2 w4 q# z

2 Y/ m) r# v) I% k( m5 X/ @; J3 Z* L

& K- ~/ g! G3 h# `& P$ F1 l2 E5 L, c& j4 \: f
! k3 ?1 `7 ]" V
校验以及输出最终输出数据。
& F: ~5 T8 }6 P& F8 x8 Y$ j8 t! V

$ i+ V( x0 f/ {, @按键输入模块
- h; \, m3 D  W  H本部分在基础课程中也有介绍,此处只给出其端口示意图。
* U+ G* v8 I6 b9 i1 a
图5 按键输入模块接口示意图
通道选择模块
, V/ }2 d: p; ?. J通过按键进行ADC四通道的选择,本模块接口示意图以及功能描述如下所示。
8 G, p7 d( S& Y& m* R
* o) U/ C1 a" X( y+ V
- z& B( n: C6 y$ R4 d3 E+ W. w
图6 通道选择模块接口示意图

* |7 T, ^: b$ A' f) U% j
, j  q& I8 V( b3 s
表5 通道选择模块接口功能描述
内部除了例化还需产生通道选择信号,这里用的模块有四个通道但是为何按键一来就加’d2,是因为通道选择实际信号需为0000、0010、0100、1000,这样我们就需要加’d2。

- u1 }5 Y* @: I6 G; q
6 Y  A4 D5 \) Z- e7 Z9 O7 N) l  k0 `
数码管驱动模块, w2 y4 P; e0 ]1 m
本部分在基础课程中也有介绍,此处只给出其端口示意图。, n+ w  H5 V: l+ Y

9 l' _( W. q2 n+ u4 V' Y. G; H* B! N3 A
图7 数码管模块接口示意图
顶层设计

5 Z- O+ _. Z3 s3 P# ~
此处只需例化各个模块即可,顶层模块接口示意图如下所示。
  A9 K4 I4 d! v6 ~$ Z. ]

, `6 H9 q! O1 L0 p
+ ?% G3 G4 L& J6 v4 e
图8 顶层模块接口示意图
综合后的RTL视图如图9所示。

# A% z8 m. m" W1 }2 n+ Y

/ n: g% }# v4 Z: p$ Q7 E  I  g% |
图9 RTL Viewer视图
分配好引脚下载后可以看到改变输入电压,数码管上均有正常的显示,且切换通道时数据可以随之更新。

  p7 K' l, `; m  F/ K5 x

$ u+ P& b. Z0 K- W* \  B至此一个四通道数字电压表设计完毕。
" ]) U" d* U2 \! ~9 d# |附:基于查找表的数据电压换算+ z4 K0 x' Y8 R: e
前面指出了一种数据处理及码制的方式,这里再列举利用查找表的实现方式。0 h: f9 H; F3 E' u" C/ c
这里因为是输入的10位二进制数,也就是说每一位变化对应的变化量为即为精度,这样就可以得出以下待转换数据与实际电压的对照表。这样当3.296v# {" h0 o, Y1 }) a

. h4 w8 U! G$ w/ t2 h

1 j: S) b2 y( m, U7 V4 E% Y( h# N" l9 F. e' V
  n  u6 R( f8 h5 k# r
这样就可以建立一个查找表,来分别计算其对应位的电压值的BCD码,然后相加。
; @. p: b0 Z1 `* Y5 \1 R
4 B# s7 L7 s) Y) G4 Y
  X2 A- m$ j7 n- j- c! C
9 ^$ J: P/ w! B1 I

5 v) E$ M) k* Z- |% P9 a0 D  h/ u8 ?如果0~3位相加大于9,则加6调整为BCD码,并产生进位信号。再进行4~7位相加加上进位信号判断,再判断8-9位。% O' O; I/ k/ ]) }
  h  y. V5 Q# |  B1 k; P

. C* B' h8 o; W% W
8 G9 @, C# B9 i& A9 t5 l

# ], P0 U% [2 U! T8 L4 R; ]. p/ l; I- E
这样再将以上两个部分放置到一个always块中即可。同样可以看到实际效果。将输入数据显示格式修改为十进制后,输入512时输出0001_0110_0101_0000。此时实际电压为512*3.296/1024=1.648,显示为1.650。输入256时实际电压0.824,显示为0.825。) @4 ?) c4 i9 T
% s0 X! O2 u* @- T1 F

+ _9 |. M8 Q# w3 _' H3 |( f/ a

: ]! k4 f, B6 v, \) M0 k" W
7 V) S/ G8 n5 q) J! b* I. Z  M
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
小梅哥
芯航线电子工作室$ w5 G/ _6 l1 S2 r5 {( F# t+ B
游客,如果您要查看本帖隐藏内容请回复
: M- k- i6 \; A% v8 p- R& D. G

1 h2 e0 q  w5 H  b$ V
7 d. S2 t" f2 Q) z, w$ @; r2 L
$ l  o; i( a- I* H, f% _5 @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-29 22:22 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表