長(zhǎng)期以來(lái),單片機(jī)以其性能價(jià)格比高、體積小、功能靈活、可靠性高、易于人機(jī)對(duì)話和良好的數(shù)據(jù)處理能力等方面所具有的獨(dú)特優(yōu)點(diǎn),被廣泛應(yīng)用于各個(gè)領(lǐng)域。但受其內(nèi)部資源的限制,在很多應(yīng)用中,單片機(jī)需要在片外擴(kuò)展相關(guān)資源,如程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器、I/O口以及中斷源等。隨著可編程邏輯器件(PLD)及EDA技術(shù)的發(fā)展,在系統(tǒng)設(shè)計(jì)中經(jīng)常會(huì)用到FPGA/CPLD來(lái)擴(kuò)展單片機(jī)的相關(guān)資源,使其有機(jī)結(jié)合,縮短開(kāi)發(fā)周期,適應(yīng)市場(chǎng)需要。FPGA/CPLD具有高速、高可靠以及開(kāi)發(fā)便捷、規(guī)范等優(yōu)點(diǎn),在功能上與單片機(jī)有很強(qiáng)的互補(bǔ)性。以此兩類器件相結(jié)合的電路結(jié)構(gòu)在許多高性能儀器儀表和電子產(chǎn)品中被廣泛應(yīng)用?;谶@種需求,筆者設(shè)計(jì)了MCS51單片機(jī)與FPGA/CPLD的總線接口邏輯電路,實(shí)現(xiàn)了單片機(jī)與FPGA/CPLD數(shù)據(jù)與控制信息的可靠通信,使FPGA/CPLD與單片機(jī)優(yōu)勢(shì)互補(bǔ),組成靈活的、軟硬件都可現(xiàn)場(chǎng)編程的控制系統(tǒng)。
1 單片機(jī)與FPGA/CPLD的接口方式
單片機(jī)與FPGA/CPLD的接口方式一般有兩種,即總線方式與獨(dú)立方式。
1.1 總線方式
MCS51單片機(jī)具有很強(qiáng)的外部總線擴(kuò)展能力,利用片外三總線結(jié)構(gòu)(即數(shù)據(jù)總線、地址總線、控制總線)很容易實(shí)現(xiàn)單片機(jī)與FPGA/CPLD的總線接口。其基本原理框圖如圖1所示。
?
圖1 總線方式原理框圖
單片機(jī)與FPGA/CPLD以總線方式通信的邏輯設(shè)計(jì),重要的是要詳細(xì)了解單片機(jī)的總線讀寫時(shí)序,根據(jù)時(shí)序圖來(lái)設(shè)計(jì)邏輯結(jié)構(gòu),其通信的時(shí)序必須遵循單片機(jī)內(nèi)固定的總線方式讀/寫時(shí)序。FPGA/CPLD的邏輯設(shè)計(jì)也相對(duì)比較復(fù)雜,在程序設(shè)計(jì)上必須與接口的單片機(jī)程序相結(jié)合,嚴(yán)格安排單片機(jī)能訪問(wèn)的I/O空間。但是,單片機(jī)以總線方式與FPGA/CPLD進(jìn)行數(shù)據(jù)與控制信息通信也有許多優(yōu)點(diǎn):
◆ 速度快。其通信工作時(shí)序是純硬件行為,對(duì)于MCS51單片機(jī),只需一條單字節(jié)指令就能完成所需的讀/寫時(shí)序,如“MOV @DPTR,A”和“MOV A,@DPTR”。
◆ 節(jié)省PLD芯片的I/O口線。僅通過(guò)19根I/O口線,就能在FPGA/CPLD與單片機(jī)之間進(jìn)行各種類型的數(shù)據(jù)與控制信息交換。
◆ 相對(duì)于非總線方式,單片機(jī)編程簡(jiǎn)捷,控制可靠。
◆ 在CPLD/FPGA中通過(guò)邏輯切換,單片機(jī)易于與SRAM或ROM接口。這種方式有許多實(shí)用之處,如利用類似于微處理器系統(tǒng)的DMA的工作方式,首先由FPGA/CPLD與接口的高速器件進(jìn)行高速數(shù)據(jù)采樣,并將數(shù)據(jù)暫存于SRAM中采樣結(jié)束后,通過(guò)切換,使單片機(jī)與SRAM以總線方式進(jìn)行數(shù)據(jù)通信,以便發(fā)揮單片機(jī)強(qiáng)大的數(shù)據(jù)處理能力。
1.2 獨(dú)立方式
與總線接口方式不同,幾乎所有單片機(jī)都能以獨(dú)立接口方式與FPGA/CPLD進(jìn)行通信,其通信的時(shí)序方式可由所設(shè)計(jì)的軟件自由決定,形式靈活多樣。其最大的優(yōu)點(diǎn)是FPGA/CPLD中的接口邏輯無(wú)需遵循單片機(jī)內(nèi)固定總線方式的讀/寫時(shí)序。FPGA/CPLD的邏輯設(shè)計(jì)與接口的單片機(jī)程序設(shè)計(jì)可以分先后相對(duì)獨(dú)立地完成。事實(shí)上,目前許多流行的單片機(jī)已無(wú)總線工作方式,采用獨(dú)立方式可以很好地使它們與FPGA/CPLD結(jié)合。獨(dú)立方式的接口設(shè)計(jì)方法比較簡(jiǎn)單,其基本原理框圖如圖2所示。直接將單片機(jī)的I/O端口線與FPGA/CPLD的I/O相連即可。
圖2 獨(dú)立方式原理框圖
2 總線接口邏輯設(shè)計(jì)
由于單片機(jī)以總線方式與FPGA/CPLD進(jìn)行數(shù)據(jù)與控制信息通信有許多優(yōu)點(diǎn),因此在設(shè)計(jì)中,單片機(jī)與FPGA/CPLD接口采用總線方式。
2.1 接口設(shè)計(jì)思想
對(duì)MCS51單片機(jī)與FPGA/CPLD以總線方式通信的邏輯接口設(shè)計(jì),應(yīng)該詳細(xì)了解MCS51單片機(jī)的總線讀/寫時(shí)序,并根據(jù)時(shí)序圖來(lái)設(shè)計(jì)邏輯結(jié)構(gòu)。MCS51單片機(jī)總線讀/寫的時(shí)序如圖3所示,其時(shí)序電平變化速度與單片機(jī)工作時(shí)鐘頻率有關(guān)。
?
圖3 MCS51單片機(jī)總線讀/寫時(shí)序
CLK為單片機(jī)時(shí)鐘信號(hào),ALE為地址鎖存使能信號(hào)。在讀/寫周期開(kāi)始后,CPU把低8位地址送到P0口總線上,把高8位地址送到P2口總線上,利用ALE下降沿可將低8位地址鎖存于地址鎖存器中,而高8位地址信息一直鎖存在P2口鎖存器中;同時(shí)單片機(jī)利用讀指令允許信號(hào)PSEN的低電平從ROM中將指令從P0口讀入,其指令讀入的時(shí)機(jī)是在PSEN的上升沿之前。接下來(lái),由P2口和P0口分別輸出高8位和低8位數(shù)據(jù)地址,并由ALE的下降沿將P0口的低8位地址鎖存于地址鎖存器。然后根據(jù)讀/寫信號(hào)的狀態(tài)讀寫外部數(shù)據(jù),把數(shù)據(jù)送到P0口總線上;數(shù)據(jù)讀/寫的時(shí)機(jī)是在讀/寫信號(hào)的上升沿之前,將數(shù)據(jù)讀入單片機(jī)或?qū)懭氡粚ぶ返牡刂穯卧.?dāng)讀/寫信號(hào)變?yōu)闊o(wú)效電平后,P0口總線變?yōu)閼腋顟B(tài),為下次總線讀/寫做好準(zhǔn)備。
通過(guò)對(duì)MCS51單片機(jī)總線讀/寫時(shí)序的分析,可以在FPGA/CPLD中設(shè)計(jì)一個(gè)總線接口模塊,實(shí)現(xiàn)單片機(jī)三總線信號(hào)的編碼。由于在總線應(yīng)用時(shí),MCS51單片機(jī)的P0口是作為地址/數(shù)據(jù)總線分時(shí)復(fù)用的,因此應(yīng)在總線接口模塊中設(shè)計(jì)一個(gè)三態(tài)緩沖器,實(shí)現(xiàn)P0口的三態(tài)接口;又因?yàn)镸CS51單片機(jī)在訪問(wèn)外部空間時(shí),它的地址為16位,因此借助地址鎖存使能信號(hào)ALE在FPGA/CPLD中實(shí)現(xiàn)高8位與低8位地址的編碼,組合成16位地址,然后再根據(jù)MCS51單片機(jī)的讀/寫信號(hào),實(shí)現(xiàn)對(duì)FPGA/CPLD的讀寫操作。
2.2 總線接口設(shè)計(jì)
通過(guò)對(duì)MCS51單片機(jī)總線讀/寫時(shí)序的分析,設(shè)計(jì)了圖4所示的接口電路。在FPGA/CPLD中,設(shè)計(jì)了兩個(gè)模塊:一個(gè)是總線接口模塊,負(fù)責(zé)單片機(jī)與FPGA/CPLD的總線接口邏輯;另一個(gè)是寄存器單元及外部接口模塊,運(yùn)用總線接口模塊來(lái)操作此模塊。
?
圖4 MCS51單片機(jī)與FPGA/CPLD總線接口框圖
圖中整個(gè)總線接口邏輯模塊將MCS51單片機(jī)的三總線信號(hào)編碼成5個(gè)信號(hào)輸出:16位地址信號(hào)addr16、讀使能信號(hào)RD_EN、寫使能信號(hào)WR_EN、數(shù)據(jù)輸出信號(hào)Din及數(shù)據(jù)輸入信號(hào)Dout。
在總線接口模塊中,又分為3個(gè)小模塊:三態(tài)緩沖模塊、鎖存器模塊及編碼模塊。三態(tài)緩沖模塊實(shí)現(xiàn)與單片機(jī)P0口接口;鎖存器模塊利用ALE信號(hào)鎖存單片機(jī)輸出的低8位地址。利用其下降沿將低8位地址鎖存于FPGA/CPLD中的地址鎖存器(address latch)中;當(dāng)ALE將低8位地址通過(guò)P0及三態(tài)緩沖器鎖存的同時(shí),高8位地址已穩(wěn)定建立于P2口;通過(guò)編碼模塊將高8位與低8位地址組合成16位地址addr16。同時(shí)根據(jù)單片機(jī)的讀/寫控制信號(hào)編碼成RD_EN與WR_EN使能信號(hào)。
若需從FPGA/CPLD中讀出數(shù)據(jù),單片機(jī)則通過(guò)指令“MOVXA,@DPTR”使RD信號(hào)為低電平,使能RD_EN信號(hào),由P0口將圖中地址addr16所指單元的數(shù)據(jù)讀入累加器A;但若將累加器A的數(shù)據(jù)寫進(jìn)FPGA/CPLD中,單片機(jī)則需通過(guò)指令“MOVX @DPTR,A”和寫允許信號(hào)WR。這時(shí),DPTR中的高8位和低8位數(shù)據(jù)作為高、低8位地址分別向P2和P0口輸出,然后經(jīng)ALE信號(hào)下降沿鎖存,產(chǎn)生16位地址addr16。再由WR的低電平使能WR_EN信號(hào),將累加器A的數(shù)據(jù)經(jīng)P0口及三態(tài)緩沖器寫入圖中16位地址addr16所對(duì)應(yīng)的單元中。實(shí)現(xiàn)單片機(jī)對(duì)FPGA/CPLD的讀/寫操作。
2.3 接口VHDL實(shí)現(xiàn)及仿真
在總線接口設(shè)計(jì)中,采用VHDL語(yǔ)言實(shí)現(xiàn)其接口邏輯。用VHDL編寫接口程序,往往會(huì)很方便,但在編寫時(shí)卻要注意讀完數(shù)據(jù)時(shí),要把數(shù)據(jù)總線釋放掉以免造成總線沖突。其源程序如下:
-FPGA/CPLD內(nèi)部寄存器地址定義
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
PACKAGEInterfaceIS
CONSTANT ADDR_REG1 :STD_LOGIC_VECTOR(15 DOWNTO 0):=X"FFF1";
CONSTANT ADDR_REG2 :STD_LOGIC_VECTOR(15 DOWNTO 0):=X"FFF2";
CONSTANT ADDR_REG3 :STD_LOGIC_VECTOR(15 DOWNTO 0):=X"FFF3";
CONSTANT ADDR_REG4 :STD_LOGIC_VECTOR(15 DOWNTO 0):=X"FFF4";
ENDInterface;
-FPGA/CPLD讀/寫操作
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use work.Interface.all;
entity MCS51_FPGA is
port (
P0 : inout STD_LOGIC_VECTOR (7 downto 0);
P2 : inSTD_LOGIC_VECTOR (7 downto 0);
ALE: inSTD_LOGIC;
WR : inSTD_LOGIC;
RD : inSTD_LOGIC;
LED: outSTD_LOGIC_VECTOR (2 downto 0)
);
end MCS51_FPGA;
ArchitectureC51_FPGA_BUS OF MCS51_FPGA IS
-16位地址
signalC51_Addr16 : STD_LOGIC_VECTOR(15 downto 0);
-內(nèi)部寄存器
signal Data: STD_LOGIC_VECTOR (31 downto 0);
-WR/RD 使能
signalWR_EN:STD_LOGIC;
signalRD_EN:STD_LOGIC;
Begin
-地址鎖存
Address_p:process(ALE)
begin
if ALE′event and ALE='0' and ALE'LAST_VALUE='1' then
C51_Addr16<=P2&P0;
end if;
end process;
-WR/RD 使能
WR_EN<= (WR AND RD) OR WR;
RD_EN<= (WR AND RD) ORRD;
-讀FPGA內(nèi)部寄存器
P0 <=
Data(7 downto 0)when C51_Addr16=ADDR_REG1 and RD_EN ='0'ELSE
Data(15 downto 8) when C51_Addr16=ADDR_REG2 and RD_EN ='0'ELSE
Data(23 downto 16)when C51_Addr16=ADDR_REG3 and RD_EN ='0'ELSE
Data(31 downto 24)when C51_Addr16=ADDR_REG4 and RD_EN ='0'ELSE
"ZZZZZZZZ"; 在未讀時(shí)釋放總線,實(shí)現(xiàn)總線的三態(tài)
-寫FPGA內(nèi)部寄存器
C51_Write_FPGA:process(WR_EN)
begin
IF WR'EVENT and WR'LAST_VALUE='1' and WR_EN ='0' THEN
CASE C51_Addr16 IS
when ADDR_REG1=>Data(7 downto 0)<=P0;
when ADDR_REG2=>Data(15 downto 8)<=P0;
when ADDR_REG3=>Data(23 downto 16)<=P0;
when ADDR_REG4=>Data(31 downto 24)<=P0;
when OTHERS=>NULL;
END CASE;
END IF;
END process;
-LED控制
LED<=Data(2 downto 0);
END C51_FPGA_BUS;
總線接口讀/寫仿真如圖5所示,(a)為總線接口寫仿真,(b)為總線接口讀仿真。
?
圖5 總線接口讀/寫仿真圖
結(jié)語(yǔ)
本文實(shí)現(xiàn)單片機(jī)與FPGA/CPLD的總線接口邏輯設(shè)計(jì),是設(shè)計(jì)的高速采樣設(shè)備的一部分。經(jīng)仿真驗(yàn)證以及實(shí)際應(yīng)用,證明該接口原理應(yīng)用完全正確、可行。在筆者設(shè)計(jì)的多個(gè)系統(tǒng)中,也已經(jīng)成功地進(jìn)行了應(yīng)用。該電路由于接口簡(jiǎn)單容易控制,因此,在涉及FPGA與單片機(jī)系統(tǒng)的接口電路中,可以靈活地應(yīng)用。
評(píng)論
查看更多