那么下面我们开始讲解一下相应的程序语言吧。我用的单片机芯片是加强型的51单片机C8051F020,它都外扩了一些功能,如AD、DA、温度传感器,但是核心还是没有改变的。要与FPGA进行通信,我用Quartus II的VHDL语言进行编程。也就是说,单片机与FPGA都要进行相应的端口设置。
先讲解一下FPGA方面的编程,如图5,这是在Quartus II界面里的图形
其中端口含义如下:in_num[15..0]——代表要从FPGA向单片机传输的数据总线
out_num[15..0]——代表要从单片机传送给FPGA的数据总线,它与in_num[15..0]在直
接与其它的端口(软件界面里面)直接与其它端口连接
Mcu[15..0]——代表硬件上要与单片机连接的端口。
clk---则是时钟信号,
en--使能信号,当它为高的时候,则单片机向FPGA传输数据,否则传输方向相反。
对应的VHDL放言如下:
library ieee;
use ieee.std_logic_1164.all;
entity interface2 is
port(Mcu:inout std_logic_vector(15 downto 0);
in_num:in std_logic_vector(15 downto 0);
out_Num:out std_logic_vector(15 downto 0);
clk:in std_logic;
en:in std_logic);
end interface2;
architecture rtl of interface2 is
signal a,b:std_logic_vector(15 downto 0);
begin
common: process(clk)
begin
if(clkevent and clk=1)then
a<=in_num;
out_num<=b;
end if;
end process;
Wri_Read:process(en,Mcu)
begin
if(en=1)then
Mcu<=(others=>Z);--
b<=Mcu;
else
Mcu<=a;--当en=0的时候,就作为输出端口
end if;
end process;
end rtl;
这里有几个注意点:一、首先最好只用一个双向口,也就是我这里的Mcu[15..0],另外一个“双向口”则等效成一个输入口与一个输出口,也就是这里in_num[15..0]与out_num[15..0].否则会有麻烦的。 因为如果不这么做,那么在Quartus里面与这个双向口相连的端口必须都要设成双向口,这样的话,嘿嘿...
二、与那个Mcu[15..0]相联系的端口必须是双向口的,具体图解如下。
最后,进行单片机方面的设置了,其中最重要的就是端口初始化了。如下:
//这个是FPGA要求的,当从FPGA里读取数据时所要满足的条件
//众所周知,在双向口的设置中,对于端口的输入与输出的设置是最重要的
//输入时一定要记得把双向口的输出设置为高阻状态,在单片机中要记得设置为漏极开路
//当输出要记得把单片机设置为推挽输出,否则设置为漏极开路的话是达不到效果 的
voidReadData(void)
{
en=0;//这部分要与fpga联合起来设置P1MDOUT=0x00;//此时单片机设置为漏极开路,在对端口写1时才能呈现高阻状态
P74OUT=0x00;//这里我用的单片机是用P1口与P4口用来传输数据的
P1=0xff;//对应端口写1,设置成高阻状态
P4=0xff;//对应端口写1,设置成高阻状态
}
//这个也是FPGA要求的,当往FPGA里写入数据时所要满足的条件
voidWriteData(void)
{
en=1;//当en=1时,我要向fpga里面写数据了,
P1MDOUT=0xff;//写数据的时候,别忘记把对应的端口改成用推挽方式
P74OUT=0x03;//不用的引脚设成漏极开路的状态.当输出的方式时才把它设为推挽输出
}
好了,到现在为止,我已经把我知道都写在这里了。如果认为我这篇文章对你有帮助的话,还请多多支持。回贴是一种美德。