音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

CPLD 與51接口 急請(qǐng)教各位大俠!。。!

作者:wujianbo 欄目:EDA技術(shù)
CPLD 與51接口 急請(qǐng)教各位大俠。。。!
這段代碼老是告訴我TRI or opndrn buffer : can ONLY drive LOGIC if connected to a BIDIR pin,錯(cuò)在哪兒,怎么改阿??
LIBRARY ieee;                   
USE ieee.std_LOGIC_1164.ALL;    

ENTITY mcu_interface IS
    PORT(
        ncs,rs:   IN std_LOGIC;                           --地址線信號(hào)
        wr,rd:    IN std_LOGIC;                           --讀寫信號(hào)
        p0:       INOUT std_LOGIC_vector(7 downto 0);    --數(shù)據(jù)總線
        reg_ins:  out std_LOGIC_vector(7 downto 0);     --指令積存器
        reg_data: out std_LOGIC_vector(7 downto 0);     --數(shù)據(jù)寄存器
        rd_data:  IN std_LOGIC_vector(7 downto 0));
END ENTITY mcu_interface;

ARCHITECTURE   mcubus of mcu_interface IS

signal din,dout: std_LOGIC_vector(7 downto 0);
signal wr_new: std_LOGIC;
signal reg_ins_buf,reg_data_buf:std_LOGIC_vector(7 downto 0);

begin
    din <= p0 when wr = '1' else   --wr通過(guò)一反向器接入
        (others=>'Z');
    
    PROCESS(wr,ncs,rs)
    begin
        if wr'event and wr = '0' then --下降沿鎖存數(shù)據(jù)
            if ncs = '0' and rs = '0' then        
                reg_ins_buf <= din;
                reg_data_buf <= "ZZZZZZZZ";
            elsif ncs = '0' and rs = '1' then
                reg_ins_buf <= "ZZZZZZZZ";
                reg_data_buf <= din;
            else
                reg_ins_buf <= "ZZZZZZZZ";
                reg_data_buf <= "ZZZZZZZZ";
            end if;
        end if;
    end PROCESS;

    PROCESS(rd,ncs)
    begin
        if    rd'event and rd = '0' then
            if ncs = '0' then
                dout <= rd_data;
            else
                dout <= "ZZZZZZZZ";
            end if;
        end if;
    end PROCESS;
    
    reg_ins <= reg_ins_buf;
    reg_data <= reg_data_buf;
    p0 <= dout when (wr='0' and ncs = '1') else
           (others=>'Z');
    
end mcubus;


2樓: >>參與討論
oaipoaip
必須是bidir引腳才可以輸出高阻
reg_ins_buf和reg_data_buf不能置為高阻

3樓: >>參與討論
wujianbo
高手:CPLD 51接口繼續(xù)請(qǐng)教
改成如下了
可是老是有競(jìng)爭(zhēng),是在ncs = 1時(shí),為什么阿
LIBRARY ieee;                   
USE ieee.std_logic_1164.ALL;    

ENTITY mcu_interface IS
    PORT(
        ncs,rs:   IN std_logic;                           --地址線信號(hào)
        wr,rd:    IN std_logic;                           --讀寫信號(hào)
        p0:       INOUT std_logic_vector(7 downto 0);    --數(shù)據(jù)總線
        reg_ins:  out std_logic_vector(7 downto 0);     --指令積存器
        reg_data: out std_logic_vector(7 downto 0);     --數(shù)據(jù)寄存器
        rd_data:  IN std_logic_vector(7 downto 0));
END ENTITY mcu_interface;

ARCHITECTURE   mcubus of mcu_interface IS

signal din,dout: std_logic_vector(7 downto 0);
signal reg_ins_buf,reg_data_buf:std_logic_vector(7 downto 0);

begin
    din <= p0;
   
    PROCESS(wr,ncs,rs)
    begin
        if wr'event and wr = '0' then --下降沿鎖存數(shù)據(jù)
            if ncs = '0' and rs = '0' then        
                reg_ins_buf <= din;
            elsif ncs = '0' and rs = '1' then
                reg_data_buf <= din;
            else
                null;
            end if;
        end if;
    end PROCESS;

    PROCESS(rd,ncs)
    begin
        if rd'event and rd = '0' then
             dout <= rd_data;    
        end if;
    end PROCESS;
    
    reg_ins <= reg_ins_buf when ncs = '0' and rs = '0' and wr = '0'else
                  (others=>'0');
    reg_data <= reg_data_buf when ncs = '0' and rs = '0' and wr = '0' else
            (others=>'0');
    p0 <= dout;
    
end mcubus;


4樓: >>參與討論
oaipoaip
inout端口只有在輸出置為高阻時(shí)才能讀入數(shù)據(jù)
你可以寫個(gè)簡(jiǎn)單一點(diǎn)的程序,先把雙向端口的描述方法搞清楚再加入更多的功能。
舉個(gè)簡(jiǎn)單的例子給你參考一下,我沒(méi)有編譯過(guò),不保證沒(méi)有錯(cuò)誤,不過(guò)大概的控制方法差不多就是這樣。

entity mcu_interface is
    PORT(
        chipselect:in std_logic;
        read:in std_logic;
        write:in std_logic;
        data:inout std_logic_vector(7 downto 0);
        din:in std_logic_vector(7 downto 0);
        dout:out std_logic_vector(7 downto 0)
    );
end mcu_interface;

architecture mcubus of mcu_interface is
begin
    PROCESS(chipselect,read,write)
    begin
        if chipselect='1' and read='1' then  --輸出數(shù)據(jù)
            data<=din;
        elsif chipselect='1' and write='1' then  --輸入數(shù)據(jù)
            data<="ZZZZZZZZ";
            dout<=data;
        else  --總線隔離(高阻)
            data<="ZZZZZZZZ";
        end if;
    end PROCESS
end mcubus;

5樓: >>參與討論
wujianbo
總算弄出了一個(gè)差不多的程序,謝謝oaipoaip
參考了一篇文章FPGA-51接口的,網(wǎng)上找的,可是現(xiàn)在有一個(gè)問(wèn)題,當(dāng)單片機(jī)讀數(shù)據(jù)時(shí),我們一般是去讀寄存器的值,既然是寄存器,必然需要一個(gè)鎖存信號(hào),下面程序中用的鎖存信號(hào)是latch1:in std_logic,如果我是讀外部SRAM(也和CPLD做接口),這好像與讀SRAM的讀信號(hào)有關(guān)系了,一團(tuán)糟,想不明白了,先做SRAM接口把,有明白的人指點(diǎn)一下,oaipoaip好像很厲害,總能看出問(wèn)題。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity mcu_interface is  
PORT(
         p0:inout std_logic_vector(7 downto 0);
        addr:in std_logic_vector(1 downto 0);
         RD,WR:in std_logic;
         --ALE:in std_logic;
         ready:in std_logic;  
         datain:in std_logic_vector(7 downto 0);
         latch1:in std_logic;
         dataout1:out std_logic_vector(7 downto 0);
         dataout2:out std_logic_vector(7 downto 0));  
end mcu_interface;

architecture interface of mcu_interface is  

signal latch_ins:std_logic_vector(7 downto 0);
signal latch_data:std_logic_vector(7 downto 0);
signal latch_in:std_logic_vector(7 downto 0);
signal wr_ins_enable:std_logic;
signal wr_data_enable:std_logic;

begin  
     PROCESS(addr)
     begin
          if (addr="00") then
               wr_ins_enable<=WR;
          else
            wr_ins_enable<='1';
        end if;
      end PROCESS;

     PROCESS(wr_ins_enable)
     begin
      if wr_ins_enable'event and wr_ins_enable='1' then
        latch_ins<=p0;
        end if;
     end PROCESS;

    PROCESS(addr)
     begin
          if (addr="01") then
               wr_data_enable<=WR;
          else
            wr_data_enable<='1';
        end if;
      end PROCESS;

     PROCESS(wr_data_enable)
     begin
      if wr_data_enable'event and wr_data_enable='1' then
        latch_data<=p0;
        end if;
     end PROCESS;

     PROCESS(addr(1),ready,RD)
     begin
          if (addr(1)='0') and (ready='1') and (RD='0')then
               p0<=latch_in;
          else
            p0<="ZZZZZZZZ";
        end if;
     end PROCESS;

     PROCESS(latch1)
     begin
          if latch1'event and latch1='1' then
            latch_in<=datain;
        end if;
     end PROCESS;

     dataout1<=latch_ins;
     dataout2<=latch_data;
end interface;


6樓: >>參與討論
oaipoaip
你的問(wèn)題描述得不太清楚
如果你知道怎么用單片機(jī)控制SRAM的話,可以按照類似SRAM的時(shí)序做FPGA的接口時(shí)序,然后把SRAM和FPGA都掛在總線上就可以了,不知道你的問(wèn)題是不是這樣。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
如果讓一個(gè)邏輯的輸出,驅(qū)動(dòng)全局時(shí)鐘。
虛心請(qǐng)教!!!
求助:我MAXPLUSII編譯MAX7032s的器件
哪位用synplify碰到過(guò)這個(gè)綜合錯(cuò)誤?
關(guān)于signal的用法
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)