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

📄 cpld 与8051的总线接口vhdl源码.txt

📁 cpld 与8051的总线接口VHDL源码 非常好用 试过的
💻 TXT
字号:
                         cpld 与8051的总线接口VHDL源码
关于cpldbus51.VHD的说明:
    很久之前我也想在网上找一份cpld与8051的总线方式接口的VHD源码,可是没有找到,
只好自己写咯,
若是只用cpld做51系统的地址译码,会用cpld的都能写出代码来,可是cpld与51的总线接口
由于涉及到
时序就没有那么容易了,我也是郁闷了近3天才把接口电路K掉的,它现在工作得很好。
----------------------------
cpldbus51.sch  系统连接图
cpldbus51.awf  ACtive HDL的波形文件
cpldbus51.VHD  接口VHLD源码
cpldbus51_TB.VHD接口的测试文件 
MOVX_WR.gif
MOVC.gif
MOVX_RD.gif 我仿真时使用的MOVX指令的时序图
--------------------------------------------------------------------------------
-----------
关于我的系统的说明:
    8051工作于11.0592MHZ,RAM扩展为128KB的628128,FlashRom扩展为128KB的AT29C010A
    128KB的RAM分成4个区(Bank)       地址分配为0x0000-0x7FFF
    128KB的FlashRom分成8个区(Bank)  地址分配为0x8000-0xBFFF
    为了使8051能访问整个128KB的RAM空间和128KB的FlashRom空间,在CPLD内建两个寄存器
    RamBankReg和FlashRomBankReg用于存放高位地址

    RamBankReg-->A15 A16
    FlashRomBankReg-->A14 A15 A16 
    nCsFlashRam-->    FlashRom的片选
    CPLD使用EPM7128 时钟为16MHZ有源晶振
    地址0xC000--0xC003为8255
   
    8051的P0  P2  WR RD ALE 于CPLD连接
--------------------------------------------------------------------------------
------------
要点:
A. 使用同步复位.
      也许你也习惯于如下这样异步复位的描述:
      .....
      if Clr=\'1\' then
          FlashRomBankReg<="000";  --异步复位
      elsif Clk\'event and Clk=\'1\' then
          ........                
          ........
      end if;
      这样的描述是很好的,但前提是你的复位信号Reset没有毛刺干扰等,我一开始也是这
样写我的电路
的,可是我写入CPLD做实际测试时,发现寄存器FlashRomBankReg老是会异常复位,我一开始以
为是地址锁存
的问题,可是不是这样的,等我郁闷了近一个上午后我想到了使用同步复位试试.
      首先使用Clk对复位信号采样,我估算了一下,8051的复位信号要求是高电平维持2个机
器周期,2个机
器周期就是2*12=24个振荡周期,我对复位信号连续采样10次,若是一直为高电平,就产生片内
复位使能信号.
其它片内寄存器以这个复位信号做同步复位.代码如下写:
      .....
      if Clk\'event and Clk=\'1\' then
          if Clr_en=\'1\' then           --Clr_en为片内复位信号
              FlashRomBankReg<="000";  --同步复位
      elsif 
          ........                
              ........
            end if;
      end if;
      这样之后经实际测试它工作得很好.
B.一切以时钟为基准,对其它输入信号做采样处理.
      对WR  RD  ALE我做了采样,避免毛刺干扰.
C.8051对cpld写数据是在WR的低电平的中间写入cpld的内建寄存器.
      对WR信号采样后,经过数次延时后产生使能信号WR_en
------------------------------------------------------------------------
    其它的就没什么的了,自己看代码吧。 
                          --liandao
                            lycld@163.com
                            2003.06.02
-----------------------------------------------------------------------


--cpld 与8051的总线接口VHDL源码
--8051工作频率为11.0592MHZ  CPLD(EPM7128SLC15)的工作频率为16.0000MHZ(有源晶振)



library IEEE;
use IEEE.std_logic_1164.all;
use    IEEE.std_logic_unsigned.all;

entity cpldbus51 is
    port (                        
                  
        Clk: in STD_LOGIC;                   --Clock    
16MHZ  
        Clr: in STD_LOGIC;               --Clear     
high 
        P0: inout STD_LOGIC_VECTOR (7 downto 0);   --8052 Port 0
        P2: in STD_LOGIC_VECTOR (7 downto 0);       --8052 Port 2
        ALE: in STD_LOGIC;                         --8052 ALE
--        PSEN: in STD_LOGIC;               --8052\'Psen
--        INT0:out  STD_LOGIC;                       --8052 INT0
        Wr: in STD_LOGIC;               --8052\'Wr
        Rd: in STD_LOGIC;               --8052\'Rd
---------------------------
        Pina:out    STD_LOGIC;                 ---output 
-----------------------
        nCS8255: out STD_LOGIC;               --
select 8255
        RamBank: out STD_LOGIC_VECTOR (1 downto 0);--Ram68128a 
bank switch   A15 A16
        nCsFlashRam: out STD_LOGIC;            
       --select Flash Rom         CE
        FlashRomBank: out STD_LOGIC_VECTOR (2 downto 0) --Flash 
Rom switch     A14 A15 A16
    
    );
end cpldbus51;



architecture cpldbus51 of cpldbus51 is                
                            
------------------------------------------------------------------------------
signal Addr: std_logic_vector(15 downto 0);        --16bit address
signal ALE_Sample:STD_LOGIC;
signal RamBankReg: STD_LOGIC_VECTOR (1 downto 0);--Ram bank switch reg, 4 
banks, 4*32K=128k bytes
signal FlashRomBankReg: STD_LOGIC_VECTOR (2 downto 0);--Flash Rom bank switch 
reg, 8 banks, 8*16K=128k bytes
--Rd Sample
signal RdSample:std_logic;    --for Rd Sample
--WR Sample    
signal WrSample0:std_logic;    --Wr for Sample    
signal WrSample1:std_logic;    
signal WrSample2:std_logic;    
signal WrSample3:std_logic;
signal WrSample4:std_logic;    
signal WrSample5:std_logic;
--Wr Sample output
signal Wr_en:std_logic;    
--Clr Sample 
signal ClrSample0:std_logic;    -- for Clr Sample    
signal ClrSample1:std_logic;    
signal ClrSample2:std_logic;    
signal ClrSample3:std_logic;
signal ClrSample4:std_logic;    
signal ClrSample5:std_logic;
signal ClrSample6:std_logic;    
signal ClrSample7:std_logic;    
signal ClrSample8:std_logic;
signal ClrSample9:std_logic;    
--Clr Sample output
signal Clr_en:std_logic;
------------------------------------------------------------------------------
--output Reg
signal PinaReg:std_logic;

begin     
--------------------------------------------
--Sample Clr signal     
ClrSample_p:process(Clk)
begin
    if Clk\'event and Clk=\'1\' then
        ClrSample0<=Clr;
        ClrSample1<=ClrSample0;
        ClrSample2<=ClrSample1;
        ClrSample3<=ClrSample2;
        ClrSample4<=ClrSample3;
        ClrSample5<=ClrSample4;
        ClrSample6<=ClrSample5;
        ClrSample7<=ClrSample6;
        ClrSample8<=ClrSample7;
        ClrSample9<=ClrSample8;
    end if;
end process;                  
---------------------------------------
--Clr Enable Signal
Clr_en_p:process(Clk)
begin          
    if Clk\'event and Clk=\'1\' then
        if      ClrSample0=\'1\' and ClrSample1=\'1\'
            and ClrSample2=\'1\' and ClrSample3=\'1\'
            and ClrSample4=\'1\' and ClrSample5=\'1\'
            and ClrSample6=\'1\' and ClrSample7=\'1\'
            and ClrSample8=\'1\' and ClrSample9=\'1\' then
            Clr_en<=\'1\';
        else
            Clr_en<=\'0\';
        end if;
    end if;
end process;             
------------------------------------------------
--sample ALE signal 
ALE_p:process(Clk)
    begin
        if Clk\'event and Clk=\'1\' then
            if Clr_en=\'1\' then
                ALE_Sample<=\'0\';
            else
                ALE_Sample<=ALE;
            end if;
        end if;
end process;
-------------------------------------------------               
--Address Latch 
Address_p:process(Clk)
    begin
        if Clk\'event and Clk=\'1\' then
            if Clr_en=\'1\' then
                 Addr<="0000000000000000";
            elsif ALE_Sample=\'1\' then
                Addr<=P2&P0;
            end if;
        end if;
    end process;                    
                   
-------------------------------------
--Sample Wr
WrSample_p:process(Clk)
begin
    if Clk\'event and Clk=\'1\' then
        if Clr_en=\'1\' then
            WrSample0<=\'1\';
            WrSample1<=\'1\';
            WrSample2<=\'1\';
            WrSample3<=\'1\';
            WrSample4<=\'1\';
            WrSample5<=\'1\';
        else
            WrSample0<=Wr;
            WrSample1<=WrSample0;
            WrSample2<=WrSample1;
            WrSample3<=WrSample2;
            WrSample4<=WrSample3;
            WrSample5<=WrSample4;
        end if;
    end if;
end process;    
---------------------------------------
--internal Wr enable signal
WrEn_p:process(WrSample0,WrSample1,WrSample2,WrSample3,WrSample4,WrSample5)
begin
    if (WrSample0=\'0\' and  WrSample1=\'0\'
        and WrSample2=\'0\' and WrSample3=\'0\'
        and WrSample4=\'1\'and WrSample5=\'1\')then
        Wr_en<=\'1\';
    else
        Wr_en<=\'0\';
    end if;
end process;                        
    
----------------------------------------
--Rd Sample
RdSample_p:process(Clk)
begin
    if Clk\'event and Clk=\'1\' then
        if Clr_en=\'1\' then
            RdSample<=\'1\';
        else
            RdSample<=Rd;
        end if;
    end if;
end process;
    
-----------------------------------
--Flash Rom Chip select signal
CS_Flash_p:process(Addr)
begin
    if Addr(15 downto 14)="10" then            --Address:8000h--BFFFh
        nCsFlashRam<=\'0\';
    else
        nCsFlashRam<=\'1\';
    end if;
end process;
-----------------------------------
--    8255 Chip select signal
cs8255_p:process(Addr)
begin
        if Addr(15 downto 2)="11000000000000" then  --C000h--C003h
    
            nCS8255<=\'0\';
        else
            nCS8255<=\'1\';
        end if;
    end process;               
-----------------------------------
-----------------------------------    
-- Ram Bank Switch Reg    
Ram_bank_p:process(Clk)
begin                   
    if Clk\'event and Clk=\'1\' then
        if Clr_en=\'1\' then
               RamBankReg<="00";        
        elsif Addr="1100000000000100" and Wr_en=\'1\' then    --
Address:C004h
            RamBankReg<=P0(1 downto 0);
        end if;
    end if;
end process;
RamBank<=RamBankReg;             
----------------------------------
----------------------------------
--Flash Rom Switch Reg
Flash_bank_p:process(Clk)
begin                     
    if Clk\'event and Clk=\'1\' then
        if Clr_en=\'1\' then
            FlashRomBankReg<="000";
        elsif Addr="1100000000000101"  and Wr_en=\'1\' then      --
Address:C005h
            FlashRomBankReg<=P0(2 downto 0);
        end if;
    end if;
end process;
FlashRomBank<=FlashRomBankReg;      
--------------------------------
--------------------------------
--Rd process
-- now just two in-builde register
Rd_p:process(RdSample,Addr,RamBankReg,FlashRomBankReg)
begin
    if    Addr="1100000000000100"  and RdSample=\'0\' then    --C004h
        P0<="000000"&RamBankReg;
    elsif Addr="1100000000000101"  and RdSample=\'0\' then    --C005h
        P0<="00000"&FlashRomBankReg;
    else    
        P0<="ZZZZZZZZ";
    end if;
end process;                
-------------------------------                
Pina_p:process(Clk)
begin
    if Clk\'event and Clk=\'1\' then
        if Clr_en=\'1\' then
            PinaReg<=\'0\';
        elsif Addr="1100000000000110"  and Wr_en=\'1\' then      --
C006h    
            PinaReg<=P0(0);
        end if;
    end if;
end process;      
Pina<=PinaReg;             
end cpldbus51;
----------------------------------------------
--Pina是一个端口扩展,51中不是有Setb p1.0  Clr p1.0这样的语句吗?Pina就有类似这
样的特性
--置1   类似Setb p1.0
--Mov DPTR,#0C006H
--MovX @DPTR,#00000001B
--清0   类似Clr p1.0
--Mov DPTR,#0C006H
--MovX @DPTR,#00000000B

⌨️ 快捷键说明

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