搜索
bottom↓
回复: 3

VHDL ISA和单片机的接口,求助

[复制链接]

出0入0汤圆

发表于 2009-5-28 00:18:21 | 显示全部楼层 |阅读模式
使用单片机和ISA总线通信,总是不通,向高手求助,代码如下:
-- USE ISA  
--use mcu as six channel 16bit counter  
--交换机制:
--pc机先检查isastatus是否置位,置位则等待,没有置位则根据上次的命令确定是否需要读取mcudata。然后发出新的命令
--通过对isacom和isadata赋值来发出新的命令,当两个赋值都完成后,引发单片机中断,isastaus两位置位,引起mcu中断
--mcu读取isacom和isadata,根据需求,若是要求读数,将所读的数放入mcudata,否则只是简单清除isastatus两位,
--清除 mcu中断,清楚中断通过写操作,将isastatus清零
--对于频率信号,在上升沿引发置位mcustatus各位,mcu读取后,发出命令清除响应位
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY  CPLDADA  IS
  PORT
     (
     SA:          IN     STD_LOGIC_VECTOR(11 DOWNTO 0);
     SD:          INOUT  STD_LOGIC_VECTOR(7 DOWNTO 0);
     IOW,IOR:     IN     STD_LOGIC;     
     CLK:       IN     STD_LOGIC;    ---SYSTEM CLK 改为CLK
     --PCIRQ:       OUT  STD_LOGIC;   ---SIGNAL INTERRUPT
     ----------------  ISA BUS  24 PIN----------------------
     
     MCUAD:          INOUT  STD_LOGIC_VECTOR(7 DOWNTO 0);     --接573输出,ad输出,245输入
     ALE,WR,RD:   IN     STD_LOGIC;
     MCUIRQ1:      OUT    STD_LOGIC;  ---SIGNAL INTERRUPT     
     MCUIRQ2:      OUT    STD_LOGIC;  ---SIGNAL INTERRUPT     
     ------------------MCUBUS   12 PIN ----------------------         
     CK1,CK2,CK3:            IN   STD_LOGIC;
     CK4,CK5,CK6:            IN   STD_LOGIC;     
     CK7A,CK7B:              IN   STD_LOGIC;     
     ----------- //六路单计数器,1路方向计数器-------------------            
     P573CS:               OUT      STD_LOGIC;              -----//片选信号,控制573   
     P245CS:               OUT      STD_LOGIC              -----//片选信号,控制245.            
     -----------------------24路------------------------------     
     );
  END CPLDADA;   

  ARCHITECTURE  ADIO OF CPLDADA IS  
  SIGNAL PCCS0:                               STD_LOGIC; --ISACOM  写片选 ,   ISASTATUS   读片选   
  SIGNAL PCCS1:                               STD_LOGIC; --ISADATA 写片选,   MCUDATA     读片选  
  --SIGNAL PCCS2:                               STD_LOGIC; --
  SIGNAL MCS0:                                STD_LOGIC; --ISACOM  读片选 ,  ISASTATUS 写片选
  SIGNAL MCS1:                                STD_LOGIC; --ISADATA 读片选 ,  MCUSTATUS 写片选
  --SIGNAL MCS2:                                STD_LOGIC; --BUSY    读片选      PSEL  写片选
  SIGNAL MCS3:                                STD_LOGIC; --        读片选 MCUDATA   写片选
  
  ---------------------------------------------------------------------  
  SIGNAL ISASTATUS:                           STD_LOGIC_VECTOR(1 DOWNTO 0);    --//系统状态,系统准备好
  SIGNAL MCUSTATUS:                           STD_LOGIC_VECTOR(7 DOWNTO 0);    --//系统状态,系统准备好
  SIGNAL ADRREG:                              STD_LOGIC_VECTOR(7 DOWNTO 0);    --//8951地位地址锁存
  SIGNAL ISACOM:                              STD_LOGIC_VECTOR(7 DOWNTO 0);    --//ISA命令寄存器,读写,7位地址;
  SIGNAL ISADATA:                             STD_LOGIC_VECTOR(7 DOWNTO 0);    --//ISA数据寄存器,读写,7位地址;
  SIGNAL MCUDATA:                             STD_LOGIC_VECTOR(7 DOWNTO 0);    --//MCU数据寄存器,读写,7位地址;
  ----------------------------------------------------------------------------------
  SIGNAL PSELCS,MDACS:                        STD_LOGIC;
  SIGNAL SDRBUS,SDWBUS:                       STD_LOGIC_VECTOR(7 DOWNTO 0);  
  SIGNAL MCURBUS,MCUWBUS:                     STD_LOGIC_VECTOR(7 DOWNTO 0);  
  
BEGIN   
PCCS0<='1'    WHEN   SA(11  DOWNTO 0) ="010000000000"       ELSE '0';
PCCS1<='1'    WHEN   SA(11  DOWNTO 0) ="010000000001"       ELSE '0';
--PCCS2<= '1'   WHEN   SA(11  DOWNTO 0) ="010000000010"       ELSE '0';

MCUIRQ1<= NOT(ISASTATUS(0)AND ISASTATUS(1));
MCUIRQ2<='1' WHEN MCUSTATUS="00000000" ELSE '0';

MCS0   <='1'     WHEN ADRREG(3 DOWNTO 0)="1000"  ELSE '0';
MCS1   <='1'     WHEN ADRREG(3 DOWNTO 0)="1001"  ELSE '0';  
--MCS2   <='1'     WHEN ADRREG(3 DOWNTO 0)="1010"  ELSE '0';  
MCS3   <='1'     WHEN ADRREG(3 DOWNTO 0)="1011"  ELSE '0';
   
P573CS <='1'     WHEN ADRREG(3 DOWNTO 0)="1100"  AND WR='0'  ELSE '0';
P245CS <='1'     WHEN ADRREG(3 DOWNTO 0)="1101"  AND RD='0'  ELSE '0';


MCUAD<=   ISACOM          WHEN MCS0 ='1'        AND RD='0'  ELSE
           ISADATA         WHEN MCS1 ='1'        AND RD='0'  ELSE           
           (others=>'Z');
SD<=      "000000"& ISASTATUS     WHEN  PCCS0='1' AND IOR='0' ELSE
           MCUDATA                 WHEN  PCCS1='1' AND IOR='0' ELSE         
          (others=>'Z');


------------锁存单片机地址
ALEADR_P:PROCESS(ALE)
BEGIN
      IF ALE'EVENT AND ALE='0' THEN
         ADRREG<=MCUAD;         
      END IF;   
END PROCESS;
----------------------------------------------------------------------
ISACOM_P: PROCESS(PCCS0,IOW,SD)
BEGIN
      IF IOW'EVENT AND IOW='1' THEN
         IF PCCS0 ='1' THEN
             ISACOM<=SD;      
         END IF;  
      END IF;   
END PROCESS;
------------------------------------------------------------------
ISADATA_P: PROCESS(PCCS1,IOW,SD)
BEGIN
    IF IOW'EVENT AND IOW='1' THEN
      IF PCCS1 ='1' THEN
         ISADATA<=SD;         
      END IF;   
    END IF;  
END PROCESS;
---------------------------------------
ISASTATUS1_P: PROCESS(PCCS1,IOW,WR,MCS0)
BEGIN
      IF MCS0='1' AND WR='0' THEN
            ISASTATUS(1)<='0';
      ELSIF IOW'EVENT AND IOW='1' THEN
         IF PCCS1 ='1'  THEN      
            ISASTATUS(1)<='1';
         END IF;
      END IF;   
END PROCESS;
---------------------------------------
ISASTATUS2_P: PROCESS(PCCS0,IOW,WR,MCS0)
BEGIN
      IF MCS0='1' AND WR='0' THEN
            ISASTATUS(0)<='0';
      ELSIF IOW'EVENT AND IOW='1' THEN      
         IF PCCS0 ='1' THEN
            ISASTATUS(0)<='1';
         END IF;
      END IF;   
END PROCESS;
-----ERROR WRITING-------------------------------------------------------------
--MCUDATA_P: PROCESS(MCS3,WR,MCUAD)
--BEGIN
    --  IF MCS3 ='1' AND WR='0' THEN
       --    MCUDATA<=MCUAD;         
     -- END IF;   
--END PROCESS;
-----CORRECT WRITING-------------------------------------------------------------
MCUDATA_P: PROCESS(MCS3,WR,MCUAD)
BEGIN
        IF WR'EVENT AND WR='1' THEN
            IF MCS3 ='1'  THEN
                MCUDATA<=MCUAD;         
            END IF;   
      END IF;      
END PROCESS;


------------------------------------------------------------------
CKSTATUS1_P: PROCESS(CK1,MCS1,WR,MCUAD)
BEGIN
      IF WR='0' AND MCUAD(1)='0' AND MCS1='1' THEN
           MCUSTATUS(0)<='0';
      ELSIF CK1'EVENT AND CK1='1' THEN
           MCUSTATUS(0)<='1';
      END IF;   
END PROCESS;
------------------------------------------------------------------
CKSTATUS2_P: PROCESS(CK2,MCS1,WR,MCUAD)
BEGIN      
      IF WR='0' AND MCUAD(1)='0' AND MCS1='1' THEN
           MCUSTATUS(1)<='0';
      ELSIF CK2'EVENT AND CK2='1' THEN
           MCUSTATUS(1)<='1';
      END IF;   
END PROCESS;
------------------------------------------------------------------
CKSTATUS3_P: PROCESS(CK3,MCS1,WR,MCUAD)
BEGIN
      
      IF WR='0' AND MCUAD(2)='0' AND MCS1='1' THEN
           MCUSTATUS(2)<='0';
      ELSIF CK3'EVENT AND CK3='1' THEN
           MCUSTATUS(2)<='1';
      END IF;   
END PROCESS;
------------------------------------------------------------------
CKSTATUS4_P: PROCESS(CK4,MCS1,WR,MCUAD)
BEGIN
      IF WR='0' AND MCUAD(3)='0' AND MCS1='1' THEN
           MCUSTATUS(3)<='0';
      ELSIF CK4'EVENT AND CK4='1' THEN
           MCUSTATUS(3)<='1';
      END IF;   
END PROCESS;
------------------------------------------------------------------
CKSTATUS5_P: PROCESS(CK5,MCS1,WR,MCUAD)
BEGIN
      IF WR='0' AND MCUAD(4)='0' AND MCS1='1' THEN
           MCUSTATUS(4)<='0';
      ELSIF CK5'EVENT AND CK5='1' THEN
           MCUSTATUS(4)<='1';
      END IF;   
END PROCESS;
CKSTATUS6_P: PROCESS(CK6,MCS1,WR,MCUAD)
BEGIN
      IF WR='0' AND MCUAD(5)='0' AND MCS1='1' THEN
           MCUSTATUS(5)<='0';
      ELSIF CK6'EVENT AND CK6='1' THEN
           MCUSTATUS(5)<='1';
      END IF;   
END PROCESS;
------------------------------------------------------
CKSTATUS7A_P: PROCESS(CK7A,MCS1,WR,MCUAD)
BEGIN
      IF WR='0' AND MCUAD(6)='0' AND MCS1='1' THEN
           MCUSTATUS(6)<='0';
      ELSIF CK7A'EVENT AND CK7A='1' THEN
           MCUSTATUS(6)<='1';
      END IF;   
END PROCESS;
------------------------------------------------------
CKSTATUS7B_P: PROCESS(CK7B,MCS1,WR,MCUAD)
BEGIN
      IF WR='0' AND MCUAD(7)='0' AND MCS1='1' THEN
           MCUSTATUS(7)<='0';
      ELSIF CK7B'EVENT AND CK7B='1' THEN
           MCUSTATUS(7)<='1';
      END IF;   
END PROCESS;


END;
------------------------------------------
接口电路如下:

(原文件名:CPLDIO.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-6-1 00:30:45 | 显示全部楼层
问题出在硬件的管脚定义上了,已经解决,上文程序基本正确,但繁琐,可精简

出0入0汤圆

发表于 2011-4-29 10:39:25 | 显示全部楼层
回复【1楼】xachf
-----------------------------------------------------------------------

楼主  在么?!

出0入0汤圆

发表于 2012-2-24 02:37:08 | 显示全部楼层
回复【楼主位】xachf
-----------------------------------------------------------------------

mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表