|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU 系统来实现数据的处理功能,这就使FPGA 系统与其他CPU 系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL 语言实现 FPGA 与单片机的串口异步通信电路。整个设计采用模块化的设计思想,可分为四个模块:FPGA 数据发送模块,FPGA 波特率发生控制模块,FPGA 总体接口模块以及单片机数据接收模块。本文着重对FPGA 数据发送模块实现进行说明。6 n! l6 w: f6 d M" ~8 o* N
2 FPGA 数据发送模块的设计
: }- ~& d5 M9 l4 Y! y4 ]根据RS232 异步串行通信来的帧格式,在FPGA 发送模块中采用的每一帧格式为:1 位开始位+8 位数据位+1 位奇校验位+1 位停止位,波特率为2400。本系统设计的是将一个16 位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧, 再发送高位帧, 在传输数据时, 加上文件头和数据长度, 文件头用555555 来表示,只有单片机收到555555 时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是实现上述功能的VHDL 源程序。; d' a* ^. X1 Q+ i, }
Library ieee;
7 g t2 T) j, v8 l% puse ieee.std_logic_1164.all;
, g3 U/ k1 w8 n$ muse ieee.std_logic_arith.all;
4 L2 `6 _; n1 Vuse ieee.std_logic_unsigned.all;
) Q- t0 E6 \$ ?6 Q2 ~entity atel2_bin is: p3 i6 w1 O, F( w0 [
port( txclk: in std_logic; --2400Hz 的波特率时钟
3 P' \( ]% _. G5 @" O& {reset: in std_logic; --复位信号 ~2 ]6 `$ ?2 M0 _3 k
din: in std_logic_vector(15 downto 0); --发送的数据: b0 o- _# z' ~( D. Y
start: in std_logic; --允许传输信号
! p) r9 N4 {0 q% h$ n) msout: out std_logic --串行输出端口1 ^. t/ {5 K4 N) v
);7 q" y! A4 |" O4 t
end atel2_bin;
2 \+ F' q( {8 e: m" xarchitecture behav of atel2_bin is
9 o3 H* y4 v6 b9 P0 tsignal thr,len: std_logic_vector(15 downto 0);" M& B6 D/ A9 S. ?3 A2 I+ F1 q
signal txcnt_r: std_logic_vector(2 downto 0); ?* o. ~6 g* i6 d- o. M5 f7 H( q
signal sout1: std_logic;
' l- E* R9 A/ F: w4 v: m) q: xsignal cou: integer:=0;) z2 h& U1 h8 N) ?9 i' q( c$ [
signal oddb:std_logic;
. o& {3 C! K. b2 U9 R1 H! C1 Vtype s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);8 f, y- Y7 M& O
signal state:s:=start1;
, G# P: y, B& l& d: K& Z- Sbegin0 O1 T8 P3 q0 [/ w; x1 S
process(txclk)/ }) M1 e) Q6 h* l/ x# v* n K
begin
Z) \ `2 _$ t4 p0 Y0 a& jif rising_edge(txclk) then" P+ T) o# o, F0 I* W
if cou<3 then thr<="0000000001010101"; --发送的文件头1 h0 @1 K5 K. a0 J& Y9 G) E
elsif cou=3 then
* S! {- ^3 o, |0 f. f8 k3 h- Hthr<="0000000000000010"; --发送的文件长度
: S7 ~9 Y7 ^: v3 Xelsif (cou>3 and state=stop2) then thr<=din;--发送的数据
* w ^, h- R1 q; T7 k. j. tend if;
. Y! p, {5 Z8 s7 T/ eend if;. E2 L2 Y- y# r. C7 j
end process;
& m4 K7 h# `# K2 K( ? Wprocess(reset,txclk)0 A3 g8 t8 ^# ~! q ?
variable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);
+ @1 @2 G! J- m3 Z: R% jbegin
. |( J x( @0 C0 p, \if reset='1' then$ E. j1 [8 d/ m# N/ Q' K
txcnt_r<=(others=>'0');# J6 C& z& @! Z) v2 l8 H
sout1<='1';
: ~7 b& |; G7 l9 @# w) s! B+ Nstate<=start1;
; K+ k/ _& h w4 ^) O8 dcou<=0;4 E- ? ^, ?& T- a8 _" W4 p- s) d
elsif txclk'event and txclk='1' then3 P, N7 b5 O- Z" ^2 Q
case state is2 u. x! R9 B+ ~0 J. I" E
when start1=>* x# Z" m/ O* [& x: m- k. F7 h* x
if start='1' then
k& l9 Q8 o& Z- m! C! T9 qif cou=3 then
q9 h% b3 c/ ~& j+ e: wlen<=thr;
7 |7 L. ~& G" y8 W4 X) Yend if;
8 S+ j [& O& ]tsr:=thr(7 downto 0);
% R1 f# p) h8 j3 q: soddb1:=thr(7 downto 0);
( l6 {% A+ X# Dsout1<='0'; --起始位, O5 w* [7 Q; M; `2 d/ T
txcnt_r<=(others=>'0');- c* s( l3 Z1 |5 t$ X
state<=shift1;
O6 i- l2 ]; i+ n6 D# M0 qelse
9 I$ H+ v- n2 Mstate<=start1;( Y" w" |: Q0 l, Z8 m" G
end if;
8 v/ w& ^: [; X' }when shift1=>, }; V2 R3 J0 h( H( p+ {' e
oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor
: s: [( z- m+ G, f8 Loddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);* D+ Z# _* ~! N9 H9 n
sout1<=tsr(0); --数据位
- Z2 |7 F+ U& @/ o0 l% | `tsr(6 downto 0):=tsr(7 downto 1);
4 K, w; O3 A! m H" J( Utsr(7):='0';5 l$ u6 l7 F' J
txcnt_r<=txcnt_r+1;5 k) M2 y/ D- z% }- I! v
if (txcnt_r=7) then
% c0 i9 w" v s+ O1 p& rstate<=odd1;cou<=cou+1;
: B" y. q* W" @9 \end if;* ]+ B6 {0 j$ ` C4 P
when odd1=> --奇校验位# d2 L# Y+ D, v; T
if oddb='1' then
7 `7 ?9 F. U/ T% `1 G7 r i/ y8 zsout1<='0';state<=stop1;
4 F4 M3 {) A5 O8 i+ [7 ]' Belse
" T" D8 I4 @9 u, Q+ v) i0 Psout1<='1';state<=stop1;
: F/ t) a2 c, v5 m% h* K: \) [& ?end if;' t2 @( K( W+ ~ c0 z+ U6 E
when stop1=>
7 }2 ?' k7 {: ^& P$ gsout1<='1'; --停止位5 t/ R S% W# `' ?$ g: |
if cou<4 then4 X1 L3 j* B0 _5 F
state<=start1;
! H; o: ~7 h- o/ h, i- J+ I" _else
$ V8 f1 w1 o2 ^" }, v: _state<=start2;2 w$ K/ j7 S; I$ Z7 h4 k
end if;
G, N; ^. e r# }3 T8 S, k$ p2 V+ uwhen start2=>
5 z$ I% W' b$ i1 C7 w6 G2 J9 ~% c3 j. qtsr1:=thr(15 downto 8);
+ l/ w+ ]; q. [6 h5 \6 `1 Foddb2:=thr(15 downto 8);! ^4 }# d6 o* J+ e2 Q3 \
sout1<='0'; --起始位/ Q0 E) P2 Q! m8 j! Q
txcnt_r<=(others=>'0');. Q$ G' E9 d8 u$ g O% g$ x
state<=shift2;
6 \9 H6 Y2 b: y4 Q' Vwhen shift2=>
$ }$ n1 `! _1 @& F6 s' Loddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor
$ ]8 x0 `5 m7 Yoddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);
: k5 D! m, d) w4 ~sout1<=tsr1(0);--数据位
* O" m' d2 I9 M" L9 W @. ztsr1(6 downto 0):=tsr1(7 downto 1); w+ }8 r3 }1 p' S( r
tsr1(7):='0';- C4 Y( k0 M7 a+ E5 y) R4 K
txcnt_r<=txcnt_r+1;2 N$ P) [) Z- ^& G( h
if (txcnt_r=7) then" f7 v' b* Q5 V- N5 F
state<=odd2;
. J# u3 V# ~! {5 _7 s2 ^9 wend if;4 \% {% z1 ~( J) [% D
when odd2=> --奇校验位
' E9 ]) {! Z8 x0 m& Cif oddb='1' then
" M9 n7 q! C" Wsout1<='0';state<=stop2;
5 r8 a- `% e. Relse8 t) l* }- q* P9 ]* w# k0 I# i
sout1<='1';state<=stop2;1 h* o; I4 F& M% T/ O
end if;
' G7 k, ~+ X2 Z7 Awhen stop2=>
# t. i5 c2 _$ _& i: ksout1<='1'; --停止位
. @" J* s( C& @2 z$ K n& kif len="0000000000000000" then/ V1 G7 `/ k4 I" A# }- [
state<=stop2;* ~/ `0 h- K2 P% q, a. R
else* B( X" C. y. V. ?
state<=start1;
% n3 z9 i/ C: a# c4 n8 x/ W1 Q# [len<=len-1;
; x$ q" ?( e8 H# _) k0 b; ]. Nend if;- @1 C$ r& P* W# ]
end case;# S- z" w! S8 w4 l4 M, p2 j
end if;0 P4 R5 m$ g! m, J3 k! U
end process;
) _: s, o( o0 b+ g; q+ y0 Z; Asout<=sout1;
9 w5 n' f/ \- c% M* n( g* y, s( ]end behav;
4 _5 I- C( S( S+ A: N& i2 C4 u7 k" F. `其中各信号的说明已在程序中标明了。/ E' e* |9 G% k$ o& ]( x
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 位停位)。! o; z) i+ @. Q6 k) }, C. a- P
单片机部分先对FPGA 发送过来的文件头进行确认,正确就接收文件,否则放弃接收的数据。根据FPGA 发送模块的协议,对串口控制寄存器SCON 和波特率控制寄存器PCON 的设置即可实现。6 K8 g/ D7 _3 q* E" r2 ?7 l
9 i8 U% E5 V: k- B0 w# f8 f |
|