新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 實(shí)現(xiàn)單片機(jī)與FPGA的雙向并口通信

        實(shí)現(xiàn)單片機(jī)與FPGA的雙向并口通信

        作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏

        那么下面我們開(kāi)始講解一下相應(yīng)的程序語(yǔ)言吧。我用的單片機(jī)芯片是加強(qiáng)型的51單片機(jī)C8051F020,它都外擴(kuò)了一些功能,如AD、DA、溫度傳感器,但是核心還是沒(méi)有改變的。要與FPGA進(jìn)行通信,我用Quartus II的VHDL語(yǔ)言進(jìn)行編程。也就是說(shuō),單片機(jī)與FPGA都要進(jìn)行相應(yīng)的端口設(shè)置。

        先講解一下FPGA方面的編程,如圖5,這是在Quartus II界面里的圖形

        其中端口含義如下:in_num[15..0]——代表要從FPGA向單片機(jī)傳輸?shù)臄?shù)據(jù)總線(xiàn)

        out_num[15..0]——代表要從單片機(jī)傳送給FPGA的數(shù)據(jù)總線(xiàn),它與in_num[15..0]在直
        接與其它的端口(軟件界面里面)直接與其它端口連接

        Mcu[15..0]——代表硬件上要與單片機(jī)連接的端口。

        clk---則是時(shí)鐘信號(hào),

        en--使能信號(hào),當(dāng)它為高的時(shí)候,則單片機(jī)向FPGA傳輸數(shù)據(jù),否則傳輸方向相反。

        對(duì)應(yīng)的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;--當(dāng)en=0的時(shí)候,就作為輸出端口
        end if;
        end process;
        end rtl;

        這里有幾個(gè)注意點(diǎn):一、首先最好只用一個(gè)雙向口,也就是我這里的Mcu[15..0],另外一個(gè)“雙向口”則等效成一個(gè)輸入口與一個(gè)輸出口,也就是這里in_num[15..0]與out_num[15..0].否則會(huì)有麻煩的。 因?yàn)槿绻贿@么做,那么在Quartus里面與這個(gè)雙向口相連的端口必須都要設(shè)成雙向口,這樣的話(huà),嘿嘿...

        二、與那個(gè)Mcu[15..0]相聯(lián)系的端口必須是雙向口的,具體圖解如下。

        最后,進(jìn)行單片機(jī)方面的設(shè)置了,其中最重要的就是端口初始化了。如下:

        //這個(gè)是FPGA要求的,當(dāng)從FPGA里讀取數(shù)據(jù)時(shí)所要滿(mǎn)足的條件
        //眾所周知,在雙向口的設(shè)置中,對(duì)于端口的輸入與輸出的設(shè)置是最重要的
        //輸入時(shí)一定要記得把雙向口的輸出設(shè)置為高阻狀態(tài),在單片機(jī)中要記得設(shè)置為漏極開(kāi)路
        //當(dāng)輸出要記得把單片機(jī)設(shè)置為推挽輸出,否則設(shè)置為漏極開(kāi)路的話(huà)是達(dá)不到效果 的
        voidReadData(void)
        {
        en=0;//這部分要與fpga聯(lián)合起來(lái)設(shè)置P1MDOUT=0x00;//此時(shí)單片機(jī)設(shè)置為漏極開(kāi)路,在對(duì)端口寫(xiě)1時(shí)才能呈現(xiàn)高阻狀態(tài)
        P74OUT=0x00;//這里我用的單片機(jī)是用P1口與P4口用來(lái)傳輸數(shù)據(jù)的
        P1=0xff;//對(duì)應(yīng)端口寫(xiě)1,設(shè)置成高阻狀態(tài)
        P4=0xff;//對(duì)應(yīng)端口寫(xiě)1,設(shè)置成高阻狀態(tài)
        }

        //這個(gè)也是FPGA要求的,當(dāng)往FPGA里寫(xiě)入數(shù)據(jù)時(shí)所要滿(mǎn)足的條件
        voidWriteData(void)
        {
        en=1;//當(dāng)en=1時(shí),我要向fpga里面寫(xiě)數(shù)據(jù)了,
        P1MDOUT=0xff;//寫(xiě)數(shù)據(jù)的時(shí)候,別忘記把對(duì)應(yīng)的端口改成用推挽方式
        P74OUT=0x03;//不用的引腳設(shè)成漏極開(kāi)路的狀態(tài).當(dāng)輸出的方式時(shí)才把它設(shè)為推挽輸出
        }

        好了,到現(xiàn)在為止,我已經(jīng)把我知道都寫(xiě)在這里了。如果認(rèn)為我這篇文章對(duì)你有幫助的話(huà),還請(qǐng)多多支持?;刭N是一種美德。


        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 浮梁县| 东方市| 石柱| 西贡区| 平乐县| 西畴县| 西丰县| 浑源县| 饶阳县| 康马县| 德江县| 赣州市| 贵溪市| 鸡泽县| 重庆市| 砀山县| 遵化市| 通山县| 杭锦旗| 清水县| 延吉市| 新龙县| 公主岭市| 双江| 通化市| 衡南县| 兰州市| 常熟市| 浮梁县| 临桂县| 布拖县| 阿瓦提县| 通辽市| 星座| 呼玛县| 通化县| 拉萨市| 大方县| 江西省| 武汉市| 寿阳县|