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

FPGA是如何与单片机通讯的

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU 系统来实现数据的处理功能,这就使FPGA 系统与其他CPU 系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL 语言实现 FPGA 与单片机的串口异步通信电路。整个设计采用模块化的设计思想,可分为四个模块:FPGA 数据发送模块,FPGA 波特率发生控制模块,FPGA 总体接口模块以及单片机数据接收模块。本文着重对FPGA 数据发送模块实现进行说明。
, |: L) C- Z9 f: o/ l2 FPGA 数据发送模块的设计2 ~9 N) r' Z: W% P! y0 u
根据RS232 异步串行通信来的帧格式,在FPGA 发送模块中采用的每一帧格式为:1 位开始位+8 位数据位+1 位奇校验位+1 位停止位,波特率为2400。本系统设计的是将一个16 位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧, 再发送高位帧, 在传输数据时, 加上文件头和数据长度, 文件头用555555 来表示,只有单片机收到555555 时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。
下面是实现上述功能的VHDL 源程序。' s) R2 A$ p& R# d8 w
Library ieee;
4 Y2 t) `( W- a8 Y* G* R* T9 Yuse ieee.std_logic_1164.all;
0 j! Q% _' A; s8 F% j0 j& y" R3 buse ieee.std_logic_arith.all;
5 a! p! o  K/ {# E6 Iuse ieee.std_logic_unsigned.all;- {% i' x  }( N) q+ f: e
entity atel2_bin is
! i3 l' M! h) u$ {; S4 @8 vport( txclk: in std_logic; --2400Hz 的波特率时钟6 {. Z+ E& ]* ?9 L' t
reset: in std_logic; --复位信号
3 B+ s2 F- H) A6 l5 Ndin: in std_logic_vector(15 downto 0); --发送的数据, I# S) e3 L- I' G7 q& P
start: in std_logic; --允许传输信号: b" l7 H4 |1 R
sout: out std_logic --串行输出端口; v: `) R9 d1 W. B; a+ T
);# @0 w: |6 N0 y9 ^! J  B
end atel2_bin;! T0 [4 u, `! ~# J2 u9 M- g$ i
architecture behav of atel2_bin is8 `" Q8 C; Z% I' w% p
signal thr,len: std_logic_vector(15 downto 0);
3 K" c; q* f4 @% {$ g+ Z, hsignal txcnt_r: std_logic_vector(2 downto 0);
& N$ ~. W$ M! E% p7 i9 A( _signal sout1: std_logic;
! L6 ^, z! ~" Ysignal cou: integer:=0;
: m+ f+ X$ f$ ^signal oddb:std_logic;  B/ E9 S6 l. q# W. ?) v5 _4 r0 u
type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);
, V' `+ s9 c- j. a+ _7 a$ y+ Psignal state:s:=start1;+ f( g. W" B/ Z1 v. t+ ?( n
begin* G( F, i) W- N1 G& ~
process(txclk)8 `) |6 |: S; A& ]1 d7 F( G9 Z
begin
& V. O8 {6 J5 l, H) \$ {4 ~5 Yif rising_edge(txclk) then8 x4 w) V3 j4 N# k4 s
if cou<3 then thr<="0000000001010101"; --发送的文件头0 f" S* G" v( P" ^5 k3 K% S
elsif cou=3 then
' j4 j# _# ]3 `$ N* v9 ithr<="0000000000000010"; --发送的文件长度3 N3 H  W3 J! `' q
elsif (cou>3 and state=stop2) then thr<=din;--发送的数据
/ |1 w& f! }0 U7 U' h; }! ~7 Eend if;
  x' F4 F( U/ Z- X+ uend if;
4 G% _6 W7 |! [$ W9 u. [end process;+ V! L" B- K% D0 G# N' P
process(reset,txclk)
( l- l. w- z- N, L* K; qvariable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);% Y& v1 H# |' a, j
begin
1 j/ O0 }2 E4 yif reset='1' then  [0 ?1 S/ g5 N7 j2 D' \
txcnt_r<=(others=>'0');
4 _5 `0 Y  ?' q% @sout1<='1';  _# y! S! h& O; t* M, o' \8 ?
state<=start1;
7 z2 O4 O# I% A6 Rcou<=0;- m- k0 ^# ]" c: d
elsif txclk'event and txclk='1' then0 N% k. m8 k" c! U, V
case state is( I9 n" p* Q' P/ b
when start1=>
" K6 J0 m5 N% P# c; h, Z& Nif start='1' then
2 n- @: T5 c, K9 t+ Uif cou=3 then% s8 N& `' @1 d( @' n
len<=thr;$ `9 J  s9 t3 h! n
end if;
0 p6 F" M. ~; G) x* _5 N; E( K1 stsr:=thr(7 downto 0);
0 @$ Q" G, t0 `" u; m/ Ioddb1:=thr(7 downto 0);7 i& e5 C) p" i
sout1<='0'; --起始位
' [1 V! F* e/ D) ^" E9 I( _txcnt_r<=(others=>'0');
4 g6 w, O) _" T  p) A: D( k8 Sstate<=shift1;
, R) D7 A: _( J6 ?: Melse
; t4 a" V5 c, H/ k! }state<=start1;' j9 b4 k; q& q. G; c4 g6 D
end if;% X3 \. p& ?; C: N" L& ?. {! c! Y
when shift1=>3 k' W$ s/ B: T
oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor, {' ]+ u+ i1 }" K5 C
oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);
" U" Y: c+ S2 B# vsout1<=tsr(0); --数据位
$ p9 l; b1 b5 a+ k, q) ptsr(6 downto 0):=tsr(7 downto 1);$ o6 w3 M# K, ^
tsr(7):='0';* u% G  N; `7 J& _( b6 C
txcnt_r<=txcnt_r+1;  E  N* R3 h& r5 b( l
if (txcnt_r=7) then
" w' Y1 _: U( h$ ^" i9 [3 Ostate<=odd1;cou<=cou+1;8 V# l( h& u4 |$ g3 d
end if;! t6 W) v  x& ]+ K3 h5 E0 ^' Y! y
when odd1=> --奇校验位5 D0 {- r9 e4 Y7 ?5 E! F' L, K
if oddb='1' then  C' x; w! s/ f. c( f7 P* i
sout1<='0';state<=stop1;6 @+ Y+ }7 w. y7 ^" z5 K
else# E# M2 j. d6 e# x% D! L2 T9 t! J
sout1<='1';state<=stop1;0 R0 W7 ^$ v, t5 d# i. ]& m
end if;: F+ b, u5 s2 a) ^
when stop1=>- X! Q6 r' D4 _, d7 R/ U/ f6 E" V
sout1<='1'; --停止位
  U4 C2 p7 a  Q1 F6 H( vif cou<4 then) }! m/ c  n. g- Y5 S1 y
state<=start1;
' B. g+ J3 u& e0 ^" v& y  xelse
/ _& U+ l7 e5 Z* O. w8 `state<=start2;
* m3 J" d$ T2 K# {* Xend if;# _( l3 P) C# G1 h1 c
when start2=>
- w1 E" ~+ Q1 n7 ^3 X! ktsr1:=thr(15 downto 8);( b, K- C# i% {* B. y* y3 q( m
oddb2:=thr(15 downto 8);( i8 Z3 w2 [* Y; @
sout1<='0'; --起始位
$ G1 Z8 ]1 B6 ]6 vtxcnt_r<=(others=>'0');  S) ^7 V0 X2 N9 W
state<=shift2;% ?  \8 s# T, v! v3 F- ?+ O
when shift2=>% I/ b5 S( ]+ _
oddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor
; G. l9 f% X1 u- m( v+ zoddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);2 p& a0 R$ {4 z8 s$ O
sout1<=tsr1(0);--数据位4 }# J2 S' n8 a- _
tsr1(6 downto 0):=tsr1(7 downto 1);
9 {) ~. ^4 a; m& O4 Ktsr1(7):='0';
. g8 H7 Y# i' y( T, Ttxcnt_r<=txcnt_r+1;. A: K( ^* |3 l2 d* P4 j
if (txcnt_r=7) then$ Z( M+ D* `# r  b7 O4 f
state<=odd2;! N: N2 ^/ ~% v8 z% j2 w+ M
end if;
" c# H! F9 i; _when odd2=> --奇校验位
0 _' O" b4 c+ H6 A# U* n% ]if oddb='1' then
( w) b! Y. f: U" D6 gsout1<='0';state<=stop2;
% E; _( }" P3 `  P' Helse
$ [. ^5 M. |" X2 Esout1<='1';state<=stop2;4 Z) b5 F7 r% m1 n" F
end if;: Y0 O' E% j+ C, z% v, @
when stop2=>
, e$ X2 L- H! b6 Y+ qsout1<='1'; --停止位
8 e4 y& u2 v: Kif len="0000000000000000" then
6 ]3 I# V! T, U  D, |' `state<=stop2;6 }% ]. ^) q3 c( [. h; `
else1 G) |4 U1 @8 z8 j4 O( _. U* B
state<=start1;
. C. E; {0 a, z! n7 ?+ {( e6 ^len<=len-1;
; X4 z  @* e8 r' C' \$ {end if;
1 Y# H" O5 G! e( i5 H/ Y  fend case;
# e9 I: _) b, |+ m( c/ send if;
* R9 i4 I- f! N5 q5 }& D* _end process;' ~! Q0 j4 U' S$ R3 J* G
sout<=sout1;
. N% d: @9 U3 \: ~$ i8 {# Nend behav;! z3 N5 e4 c7 G4 O6 }1 S+ r
其中各信号的说明已在程序中标明了。
  D* M( [+ T! w' c' ZDin 写入值为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 位停位)。2 p* i' t4 a" c3 `8 z
单片机部分先对FPGA 发送过来的文件头进行确认,正确就接收文件,否则放弃接收的数据。根据FPGA 发送模块的协议,对串口控制寄存器SCON 和波特率控制寄存器PCON 的设置即可实现。
% l1 ]# r+ t) h- o
1 V2 |* F- {/ u; j" U7 j
  • 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 的设置即可实现
    8 E3 Q! s* T+ R' l. i* B  s2 N
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-2 06:27 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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