⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abc.txt

📁 文中给出了cPLD与单片机的串行通信的C语言代码与VHDL代码有一定的使用价值
💻 TXT
📖 第 1 页 / 共 2 页
字号:
2.4.1CPLD 与单片机双向串行通信原理
单片机到CPLD的串行通信接口电路是利用VHDL语言在CPLD中设计一
个串行输入并行输出的八位移位寄存器,其端口与单片机P1.4~P1.7 相连。如
图2-12 所示。CS 为单片机片选信号,当其为低时使能八位寄存器;当CPLD
发出READEY 信号有效CLK1 信号的上升沿到达DCLK 端口时,八位移位寄
存器就会将单片机输出到ram 的一位数据移入;当单片机将寄存器中的八位数
据欲传送给CPLD 时,就在P1.6 连续产生八次上升沿,单片机便顺序地将寄存
器中的数据移到ram,八次后单片机寄存器中的数据段就会出现在CPLD 的led
中。CPLD 除了接收数据以外还要进行数据处理,控制显示。显示口需要大约
1 秒中的延时,在实验过程中用了单片机CLK2 提供的2MHZ 的晶振。经过计
算得出计数器计到2×106 时延时可达到1S。而实际上当计数器计数到503 时就
会产生毛刺,这将影响整个系统,因此采用3 个同时延时的方法达到1S 钟的
延时,即500 × 8× 500。利用VHDL 语言中并行语句PROCESS 来实现。其VHDL
原程序如下:
图2-12 单片机到CPLD 的串行通信接口电路
entity test is
port(ena:in std_logic;
clk,dats,dclk:in std_logic;
ready:out std_logic;
led:out std_logic_vector(6 downto 0));
end test;
*******************************************************
architecture beh of test is
signal s,ss,sss:integer range 0 to 7;
signal so:std_logic;
signal ready_in:std_logic;
signal ram:std_logic_vector(7 downto 0);
signal aa,cc:integer range 0 to 499;
signal bb:integer range 0 to 7;
signal ao,bo,co:std_logic;
begin
*******************************************************
yan_2:process(co,ena,dclk)
begin
if(dclk'event and dclk='1')then
if(co='0')then
*******************************************************
if(ss=7)then
ss<=6;
ready_in<='0';
ram(7)<=dats;
else
ss<=ss-1;
null;
ram(ss)<=dats;
end if;
********************************************************
elsif(co='1')then
ss<=7;
end if;
end if;
end process yan_2;
--*******************************************************
ready<=ready_in;
--*******************************************************
del_1:process(clk)
begin
if(clk'event and clk='1')then
if(ena='1')then
if(aa=499)then
aa<=0;
else
aa<=aa+1;
end if;
else
aa<=0;
end if;
end if;
end process del_1;
ao<='1' when aa=499 else
'0';
--*******************************************************
del_2:process(ao)
begin
if(ao'event and ao='1')then
if(bb=7)then
bb<=0;
else
bb<=bb+1;
end if;
end if;
end process del_2;
--8888888888888888888888888888888888888888888888888888888
bo<='1' when bb=7 else
'0';
--*******************************************************
del_3:process(bo)
begin
if(bo'event and bo='1')then
if(cc=499)then
cc<=0;
else
cc<=cc+1;
end if;
end if;
end process del_3;
--8888888888888888888888888888888888888888888888888888888888
co<='1' when cc=499 else
'0';
--*******************************************************
else
null;
end if;
end process dis;
--*******************************************************
end beh;
单片机输出数据到CPLD 的工作程序如下(用C51 编写):
#include <reg51.h>
void main(void)
{
int i,j;
sbit ready=P1^7;
sbit clk=P1^6;
sbit dat=P1^5;
unsigned char dats[10]={};
unsigned char *pd=dats;
unsigned char temp;
if(ready=1)
{
for(i=0;i<10;i++)
{
temp=dats[i];
for(j=0;j<8;j++)
{
dat=temp^7;
clk=1;
;
temp<<1;
clk=0;
}
}
}
else if(ready=0)
{ dat=0;
}
}
CPLD 到单片机的串行通信与单片机到CPLD 的串行通信类似,只不过八
位寄存器改为并入串出,端口如图2-13 所示。当单片机的CS=1 时,寄存器被
选中;当LOAD=1 时,待发的数据被加载到bxin 上;当上升沿到来时,将数
据一位一位移出至bout 上,与此同时,单片机一位一位接收来至bout 上的数
据。在CLK 八个上升沿后加载到bxin 的数据便被传送至单片机的A 寄存器中。
图2-13 由CPLD 到单片机的并入串出移位寄存器
2.4.2 双控制系统的实现原理
由于单片机端口有限,所以大部分外围器件的连线靠CPLD 来完成,而对
时序控制要求较高的那些外围器件则靠单片机来间接控制。所谓间接控制就是
对应用者可以自定义很多命令字,每个命令字对应着CPLD 一项或一系列操作。
当单片机想让某些外部器件实现某种功能时,可以通过串行通信把命令字传送
给可编程逻辑器件CPLD。CPLD 收到该命令字并判断该命令字后,便在EN
的上升沿到来后执行相应的操作。这里值得一提的是:命令字传送给CPLD 后,
只有在EN 的上升沿到来后CPLD 才能执行相应操作。这是为了防止命令字在
字传送期间使CPLD 误动作[37]。
当外部器件有中断信息反馈到控制器时,也可将特定的命令字由CPLD
传送给单片机,使8031 产生中断进行处理。但无论有多少外围器件需产生中
断控制,都应由CPLD 在8031 的INT0 处产生一个中断。在8031 中断子程序
load
bxin
enable
clk
bout
中,运行由CPLD 向单片机的串行通信程序,将特定的命令字读到寄存器中,
从而可知是哪个外围器件产生的中断,进而可知需何种外部器件。
本双控制系统在项目设计中应用起来非常灵活方便,这里采用的八位命令
字,最多可自定义256 个命令字。由于同时采用了单片机和CPLD,因此编程
非常灵活方便。单片机的编程过程就是对A 寄存器写不同命令字,然后调用串
行通信子程序的过程。若是VHDL 的命令字对应程序简单些,则要完成对某特
定外围器件的操作所需要的命令字调用会多一些。反之亦然。
2.5 输出模块的设计
试验台滚筒的驱动是靠电机带动执行机构完成的,用单片机系统实现对交
流电机的控制是一个弱电控制强电的问题,由于单片机端口有限,所以外围器
件的连线靠CPLD 来完成,因此决定采用内部带有光电隔离的固态继电器来实
现与CPLD 的I/O 输出接口,控制电机的启停。
实际电路框图如图2-14 所示,我们通过CPLD 的I/O 口来控制左右电机正
转时的启停和左右电机反转时的启停。I/O 口和固态继电器中间设计了光隔环
节和驱动环节以增强系统抗干扰能力和带载能力。数码管显示口和键盘控制由
CPLD 的I/O 来控制。
2.6 汽车制动性测控系统软件设计
到这里我们已经基本把硬件设计中一些重点问题做了介绍,而一个检测系
统要实现其预定功能,除了必要、合理的硬件环节之外离不开软件的支持。软
件的设计是建立在本系统实际硬件资源基础之上对系统资源的充分利用和调
图2-14 固态继电器接口电路
CPLD 的
I/O 口
光电耦合
器TLP521
固态
继电器
电机
控制电路
驱动
电路
     FPGA源程序部分代码
FPGA源程序:
%%----------------------FP(分频器)----------------------------%%
library ieee;
use ieee.std_logic_1164.all;
entity fp is
port(clk:in std_logic;
      cp:out std_logic);
end fp;
architecture des of fp is
signal h:std_logic;
begin     --------------20分频
process(clk)
variable n:integer range 0 to 9;
begin
if clk'event and clk='1' then
  if n<9 then
  n:=n+1;
  elsif n=9 then
   n:=0;h<=not h;
 end if;
end if;
end process;
cp<=h;
end des;
%%-----------------BC----------------------------%%
-----"8寄存器"
library ieee;
use ieee.std_logic_1164.all;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -