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

FPGA是如何与单片机通讯的

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU 系统来实现数据的处理功能,这就使FPGA 系统与其他CPU 系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL 语言实现 FPGA 与单片机的串口异步通信电路。整个设计采用模块化的设计思想,可分为四个模块:FPGA 数据发送模块,FPGA 波特率发生控制模块,FPGA 总体接口模块以及单片机数据接收模块。本文着重对FPGA 数据发送模块实现进行说明。2 a& L) \2 |5 g1 S
2 FPGA 数据发送模块的设计
7 m. P+ H4 r( P) d/ c) c根据RS232 异步串行通信来的帧格式,在FPGA 发送模块中采用的每一帧格式为:1 位开始位+8 位数据位+1 位奇校验位+1 位停止位,波特率为2400。本系统设计的是将一个16 位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧, 再发送高位帧, 在传输数据时, 加上文件头和数据长度, 文件头用555555 来表示,只有单片机收到555555 时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。
下面是实现上述功能的VHDL 源程序。$ p  ]* s1 w. G, l
Library ieee;: s" q/ h2 t' h
use ieee.std_logic_1164.all;
0 Q3 F8 H- U8 m! ^use ieee.std_logic_arith.all;
5 k- g2 c( f3 K9 ]' R5 u# guse ieee.std_logic_unsigned.all;$ l# k- j. [$ n! g$ m/ D
entity atel2_bin is
9 [3 V  l1 n* B& V6 z& iport( txclk: in std_logic; --2400Hz 的波特率时钟
+ y0 z1 s: D8 v, c, S3 S; Yreset: in std_logic; --复位信号
, V5 |- g/ S7 M' x1 ]/ odin: in std_logic_vector(15 downto 0); --发送的数据  e5 f( h: h1 ~  h2 P, h
start: in std_logic; --允许传输信号
7 x1 p% k: X% I5 F2 bsout: out std_logic --串行输出端口" ^. q6 m$ Y, ~  W0 ~- c
);" l7 L* i, m* S8 G) `
end atel2_bin;
& Z0 o& C. E  `+ Y; g" k& barchitecture behav of atel2_bin is
! P  l% y# J1 e, Isignal thr,len: std_logic_vector(15 downto 0);
- X' u% S0 C" i- [7 G$ ^8 Asignal txcnt_r: std_logic_vector(2 downto 0);
/ \) o. w7 y% ]signal sout1: std_logic;
5 T1 E. X1 W+ L, s4 _signal cou: integer:=0;
! R+ \, |# r, p: \3 k7 V0 esignal oddb:std_logic;9 `6 H' r! i4 d/ o/ w/ I  t, T0 Y
type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);
: ]$ f8 }& S8 o2 ysignal state:s:=start1;0 u4 D" G* J7 j. {- Z6 e1 y
begin' d$ q' F1 C' C2 F0 P
process(txclk)
5 u! e- F! r7 S3 Y! J0 ]& n7 Q" jbegin& P! h' B7 l) u: s" n9 @) g
if rising_edge(txclk) then
6 W, k* i! T- Y3 Q, Eif cou<3 then thr<="0000000001010101"; --发送的文件头! T2 U& z6 W+ n4 ^
elsif cou=3 then
3 c8 a! w1 J# y, y; x* Y, Cthr<="0000000000000010"; --发送的文件长度' c/ [4 A9 r' B1 o8 ^0 y
elsif (cou>3 and state=stop2) then thr<=din;--发送的数据) ~% I0 E2 l5 U
end if;
1 `9 R8 ?3 j! t& l* R! z+ E# ?- Zend if;2 @9 @9 y. r4 }3 \; |+ [5 \
end process;. V0 A+ d% `% w* k( q$ k; L2 R
process(reset,txclk)
6 m4 H6 e. Q# r( K. ]: }variable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);% H9 [- q& W4 Q1 O6 J
begin
' g5 @3 I2 L5 G- ]if reset='1' then
  [( ~+ X! A; _0 v' |9 ?1 t$ Atxcnt_r<=(others=>'0');
) \& H- O2 B% C" f0 J2 I! u& Hsout1<='1';
0 x4 ?& k* s4 b/ F0 W: H5 ostate<=start1;
+ ]# M6 |/ H3 [% ecou<=0;1 y# I4 Y" S' R/ B/ g
elsif txclk'event and txclk='1' then
6 `$ O* g. P7 G  Jcase state is+ ^0 u: Y" K" Z3 A# d
when start1=>
1 |( ]# o8 N% f, ^1 g8 Sif start='1' then
7 [. X/ z4 w/ [/ L  t; L8 Pif cou=3 then8 \7 N; r  c5 ?
len<=thr;( w/ H( R: ]) D( r! @
end if;
( F" h8 n8 l5 p" stsr:=thr(7 downto 0);
8 H* i5 }+ T+ S/ @6 \: x- Voddb1:=thr(7 downto 0);7 J* ]' s! m; c! a
sout1<='0'; --起始位
! X& Y% a$ p' i; _6 Etxcnt_r<=(others=>'0');0 q6 o5 c3 W( Q6 ]/ P8 A8 H5 w
state<=shift1;5 g# N* s; s- J( X) n  S. \
else" ~0 p5 ^/ ^  u4 v0 m$ q  ^
state<=start1;* [  L% d  U- I: k
end if;
) a: a+ f$ z6 |) w' l% o# \when shift1=>
* A, G8 e$ x! Z( |oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor+ k+ ]2 j, h2 l0 V2 q: H7 R& V1 j4 H
oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);# X) ^4 ~8 d* j' M& W
sout1<=tsr(0); --数据位
8 V7 b' z0 k; R1 ztsr(6 downto 0):=tsr(7 downto 1);
1 U2 F% Y8 {/ B0 ~9 R4 {tsr(7):='0';( U7 w' O$ h5 C; `
txcnt_r<=txcnt_r+1;, a. D; G  R$ a: N/ z
if (txcnt_r=7) then1 D9 D: A# x9 ~5 `
state<=odd1;cou<=cou+1;6 ~* e3 N* s4 F. i/ S
end if;/ Y, R) {- l1 |8 h1 f6 [" y/ i+ I# g
when odd1=> --奇校验位0 O( M/ X4 @" d7 d2 t- q
if oddb='1' then
: `0 b' K4 C5 I0 [+ |6 ysout1<='0';state<=stop1;* x* N8 S: q& E3 r
else. V3 Z5 q2 q7 A
sout1<='1';state<=stop1;* ^: @2 n  x; T  c% `  u
end if;
; ~2 |0 o6 W: bwhen stop1=>
8 ?6 v5 W: I; d. ~sout1<='1'; --停止位  e0 t) {( j6 \9 G
if cou<4 then5 ]4 g' a" a% D4 e, _$ x
state<=start1;
: [7 l& {! ^3 ^* Felse
8 l& i6 F; y+ S  m/ [' _state<=start2;
# X8 \' u( ~$ Aend if;) _; E6 {! G/ K. M/ u
when start2=>5 Q3 Q! V" P9 X3 `8 J0 n* ^$ T
tsr1:=thr(15 downto 8);- ]! @. x+ ?& R! p, h+ e) N, _
oddb2:=thr(15 downto 8);
9 D" f( D2 Z: S  y! Ksout1<='0'; --起始位
: t' Z( I" a+ ^! m  Wtxcnt_r<=(others=>'0');
$ s' M# V: p, P! i7 j/ Mstate<=shift2;
& L$ N2 a9 A) |+ |; gwhen shift2=>
7 O, \$ j* h) b- v, k' xoddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor
" `, ?7 }( _- z/ X% [+ A1 B$ P1 Soddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);
4 M# p" l2 f. ^2 Rsout1<=tsr1(0);--数据位. E& x, v1 p* c& J1 e% r- H
tsr1(6 downto 0):=tsr1(7 downto 1);
1 i, I2 A# t* a7 Y& a8 ttsr1(7):='0';8 ~( D2 K6 V. h. m5 G
txcnt_r<=txcnt_r+1;
1 g0 N* z1 D: p1 Q* \* Oif (txcnt_r=7) then
! w; [0 G9 H# I- F* Rstate<=odd2;
# x- p- H* z+ o2 e% b9 }* o& Kend if;
) P0 P8 O3 `5 ~0 K) f+ M7 [when odd2=> --奇校验位4 F5 R: L# u& }0 U3 o9 U* s0 X
if oddb='1' then
0 R6 [; W# G9 {0 K  ysout1<='0';state<=stop2;
& s7 c7 ~5 \% @) t: h+ Felse
4 C1 u# _6 }) t- }sout1<='1';state<=stop2;
( R7 F$ N% O  G$ N; \* q. iend if;
: j( Z0 ~1 L+ |2 X" x7 b* Bwhen stop2=>; y7 s. u1 ?* W( y2 B
sout1<='1'; --停止位
: F# F% r% K4 O1 ~; G  I$ }5 Kif len="0000000000000000" then3 K1 ]* Q' O9 _+ M
state<=stop2;# ]6 D- X3 r: D* C: h& v2 _* r
else6 `1 A: s' m7 P# h5 o* _
state<=start1;: s3 t" |5 U; J, b
len<=len-1;
; ]  Z* Z- [1 ^' S0 l2 Z- o. P) Send if;: Z+ J% u/ u/ N# ?$ A5 n8 H
end case;: m6 f. x, l8 z  u1 ?
end if;: L2 ^6 r' E8 }* o; E' v
end process;. I+ O/ a$ H0 \0 [' R( V& Y
sout<=sout1;
/ F# l7 A$ U& V+ Q8 Kend behav;' U1 B' K& O' h& x* g- `+ ^
其中各信号的说明已在程序中标明了。
+ {" B4 {$ v; U9 ]& D1 `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 位停位)。
  a4 f* Z5 I) s, a8 B, c4 U. |单片机部分先对FPGA 发送过来的文件头进行确认,正确就接收文件,否则放弃接收的数据。根据FPGA 发送模块的协议,对串口控制寄存器SCON 和波特率控制寄存器PCON 的设置即可实现。

' @2 |8 D8 Z( v& F# D& n( K7 C4 T3 P& m
  • TA的每日心情

    2019-11-19 15:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-12-9 13:50 | 只看该作者
    用VHDL 语言实现 FPGA 与单片机的串口异步通信

    该用户从未签到

    3#
    发表于 2021-12-9 18:30 | 只看该作者
    根据FPGA 发送模块的协议,对串口控制寄存器SCON 和波特率控制寄存器PCON 的设置即可实现2 y& c$ n( V( u; ~, G, v* B
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-28 18:37 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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