|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU 系统来实现数据的处理功能,这就使FPGA 系统与其他CPU 系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL 语言实现 FPGA 与单片机的串口异步通信电路。整个设计采用模块化的设计思想,可分为四个模块:FPGA 数据发送模块,FPGA 波特率发生控制模块,FPGA 总体接口模块以及单片机数据接收模块。本文着重对FPGA 数据发送模块实现进行说明。
6 M6 R0 P7 w9 Q( e' v7 P2 FPGA 数据发送模块的设计
# ]) J: f4 T3 H8 y L* h* }根据RS232 异步串行通信来的帧格式,在FPGA 发送模块中采用的每一帧格式为:1 位开始位+8 位数据位+1 位奇校验位+1 位停止位,波特率为2400。本系统设计的是将一个16 位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧, 再发送高位帧, 在传输数据时, 加上文件头和数据长度, 文件头用555555 来表示,只有单片机收到555555 时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是实现上述功能的VHDL 源程序。4 |2 [* H0 q" {( g8 i5 w5 ~9 O
Library ieee;
0 u' O5 y: x) |: k" N$ W2 X* A/ {" `7 vuse ieee.std_logic_1164.all;0 f2 W' w% Q9 F# Z0 O* e
use ieee.std_logic_arith.all;7 \( L) [& V' ?/ B
use ieee.std_logic_unsigned.all;9 h; d2 K4 W8 r/ z. e; X
entity atel2_bin is
3 G! t- v( b! h2 F3 C+ }) tport( txclk: in std_logic; --2400Hz 的波特率时钟
7 r. W/ _8 ^2 @& Kreset: in std_logic; --复位信号. [ x% `) j' L" t' T, ]: i/ s
din: in std_logic_vector(15 downto 0); --发送的数据
0 K$ l3 J) [. h; k7 Nstart: in std_logic; --允许传输信号$ z, a- ~2 x. N+ z6 z7 W
sout: out std_logic --串行输出端口- i! e; z }8 q
);
8 R& J9 T/ d+ a$ eend atel2_bin;1 H" a) {' r+ Z) ^
architecture behav of atel2_bin is
4 W0 A: W+ I) o, g4 c$ Xsignal thr,len: std_logic_vector(15 downto 0);
- E" c$ P: [: Q+ M9 g) u5 f! M' asignal txcnt_r: std_logic_vector(2 downto 0);
3 z3 F# |& [' n% R0 Tsignal sout1: std_logic;
9 ]6 I* J+ M' M* V C' C5 m8 E* X) Xsignal cou: integer:=0;
: {7 @6 b' ]2 l2 g* s4 e% u* Ysignal oddb:std_logic;, m" v6 R: t3 X3 z; o& P
type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);
6 i' T$ D+ R x% hsignal state:s:=start1;: z8 p# E i' F
begin
$ h0 x5 H @+ e1 aprocess(txclk)
% i" Q; Z& o) O, Obegin
2 q; V! O; E: q$ V( l- V; Mif rising_edge(txclk) then
- U3 A3 \8 t. N2 Aif cou<3 then thr<="0000000001010101"; --发送的文件头2 U v O9 ~; H2 b; x
elsif cou=3 then7 a! o$ h4 b( ~ J' z5 ?
thr<="0000000000000010"; --发送的文件长度
+ _. |* Z$ o! y Q# v( S% h+ Felsif (cou>3 and state=stop2) then thr<=din;--发送的数据/ c- B e! t# E2 X/ U6 i
end if;' J4 X( n `2 w! G" K' G2 r. c
end if;
' b1 q( s5 L' u/ P/ G1 t$ r gend process;
* ]! S$ L0 L+ j0 k2 Dprocess(reset,txclk)
4 y l) q0 I( C+ Y/ Nvariable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);
! r- P9 _) a) Sbegin1 Y& a# W& e' y$ [, {; T9 T
if reset='1' then W- ?" q& I: w- h. U
txcnt_r<=(others=>'0');
: n7 H' W) Q, f* D0 K1 qsout1<='1';
8 l9 B; V5 u0 Xstate<=start1;# q: Q! ~2 g: g7 ?; @; r7 R
cou<=0;" G, z6 D' E& g3 R1 R# L
elsif txclk'event and txclk='1' then$ p; u: S$ K7 c$ @! m1 U
case state is, T R" o1 p* d
when start1=>8 n1 l+ r% J6 _8 T2 |/ Y( U3 L
if start='1' then7 G. ]0 h0 a7 b; C; B
if cou=3 then3 R* \) T0 ?; }
len<=thr;
& t9 Z7 v* e8 fend if;
+ |6 Y( a9 _9 x2 J4 y, Y" ctsr:=thr(7 downto 0);/ F1 I' e# e$ m6 `; Z
oddb1:=thr(7 downto 0);
. r" B! G! B* P6 Zsout1<='0'; --起始位
0 X9 K3 W; y7 a9 @' U. btxcnt_r<=(others=>'0');( K: K4 J. i. K5 O7 q$ s
state<=shift1;6 i1 {: o( s' _- W# h: b" k/ v5 l! L: w8 ^
else
$ B" O% y; i3 o* p8 a) y' \& B3 i2 Hstate<=start1;
0 F4 Q; @2 O/ I- q% b( d6 s) y& `0 y/ Dend if;( b) _( [( e3 b2 _
when shift1=>
& K" X7 @: Q6 ^oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor3 W' b! D& d" V H3 _( Z6 Z7 X
oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);6 [4 y$ R! [/ s
sout1<=tsr(0); --数据位* ^5 h5 F- X" o1 X2 h& U
tsr(6 downto 0):=tsr(7 downto 1);" ]( F2 y" O8 `- \1 o9 l. d- W; A
tsr(7):='0';, @" A: o4 u! p- I
txcnt_r<=txcnt_r+1;
; A. \% g, v$ J9 ?6 b; x4 fif (txcnt_r=7) then
/ ~/ @0 o# K- E9 c/ S6 ] @* ?. Bstate<=odd1;cou<=cou+1; a" h% Q8 J4 @( Z4 p
end if;2 r& G# z, o. v% p9 d( e! x
when odd1=> --奇校验位! e# k5 Y+ N4 l* ]
if oddb='1' then
9 n6 }4 ?" Y: T) vsout1<='0';state<=stop1;
8 {9 c/ @8 b1 e$ x: k7 Xelse
; }. ?- x. T7 m4 X+ }1 K) |: ]& Qsout1<='1';state<=stop1;+ ]$ D! W$ B" s
end if;" a6 m6 s/ {3 o0 D! ~
when stop1=>
1 E# @8 k: r9 m3 |' G# s; G& Fsout1<='1'; --停止位
8 j4 w% H' V; b. C% \! }if cou<4 then
. U( ]( N) Q8 {* k' U$ Kstate<=start1;3 S4 {1 s$ l1 ^; {7 {
else, H3 k4 Q {: p4 [" x, z
state<=start2;3 S0 i+ m8 Q7 Q% f `# w
end if;# i4 b: N; ~% F" g
when start2=>) y$ N" a3 h g% A. q
tsr1:=thr(15 downto 8);
# r4 n7 g! d, }8 U# T6 @$ n& Xoddb2:=thr(15 downto 8);
5 L0 Q: e, ]% Isout1<='0'; --起始位7 J0 X. R+ j7 o: v) x' j" q7 j/ @3 U
txcnt_r<=(others=>'0');
$ n% W1 d, k* Z$ _9 ?5 Q4 @state<=shift2;
( z: k4 l7 Z' {& Y7 w) Iwhen shift2=>0 \0 ^! C/ y v% p* B+ R
oddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor% w# c7 y% {+ e; r+ M
oddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0); g/ z: i/ ^5 n; L# v
sout1<=tsr1(0);--数据位
* y% C ~; i3 F% E2 o& `& Vtsr1(6 downto 0):=tsr1(7 downto 1);$ _4 z4 p; n) x, j6 f
tsr1(7):='0';/ T/ V# d; w9 D( H
txcnt_r<=txcnt_r+1;' v4 e0 l' U# h+ F9 q `' B) W
if (txcnt_r=7) then; R8 z! ` u$ d
state<=odd2;6 o0 ~0 W* ~# T* x1 |4 `3 A% }
end if;1 R+ [2 O7 F" W' W
when odd2=> --奇校验位
% ~: S& t( y1 Z: f# r w, \if oddb='1' then( F+ S0 }+ g- @9 l% E
sout1<='0';state<=stop2;0 v) i2 k8 i$ R
else" f1 I" B/ k; A( m, v; r8 B
sout1<='1';state<=stop2;' j+ I$ H4 Q) s5 Z4 O2 ?" Q6 a9 ?
end if;
/ O0 i. C% P1 Lwhen stop2=>
- j; ?0 j5 ^2 z8 a6 D% _sout1<='1'; --停止位% R$ G+ S4 O1 o- n. p( w
if len="0000000000000000" then
8 O: i3 ]5 Q5 b( x. ?4 xstate<=stop2;/ n1 v. V* T4 J9 I8 g) n
else
( N+ y3 x) B# b" [( t+ `6 N- fstate<=start1;# |6 g) P8 T. o( g
len<=len-1;
( z; h3 P+ F/ Q& Z" _3 Gend if;
( }% `. l* s# Uend case;+ O7 u2 ^! D& C, s5 G
end if;
! t ]$ M! L( r0 L/ R) ^end process;' c. O! ~/ ~9 t9 K
sout<=sout1;$ o: V+ }; _+ i7 l
end behav;& }% p( N* x2 K3 k2 w
其中各信号的说明已在程序中标明了。* V$ ^7 f0 t9 R# T C
Din 写入值为3355H,波特率为2400Hz,Start 信号始终置逻辑1,即随时都能发送数据。Reset 信号逻辑1 时复位,逻辑0 时电路开始工作。THR 是数据寄存器,文件头、数据长度以及数据位都先寄存到THR 中,Len 是数据长度,TSR是低8 位数据帧寄存器,TSR1 是高8 位数据帧寄存器。数据长度Len 定为02H,发送时先发送低8 位55H,后发送高8 位33H,一共发送两遍。发送的数据格式说明: 当发送55H 时, 其二进制为01010101, 则发送的数据的二进制数为00101010111( 1 位开始位+8 位数据位+1 位奇校验位+1 位停位)。
4 }1 S6 Y6 H4 T; q单片机部分先对FPGA 发送过来的文件头进行确认,正确就接收文件,否则放弃接收的数据。根据FPGA 发送模块的协议,对串口控制寄存器SCON 和波特率控制寄存器PCON 的设置即可实现。1 `2 M3 a+ w1 w2 ^
4 @ R8 k) S. |' m& n* u ?: n6 j |
|