xachf 发表于 2009-5-28 00:18:21

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

使用单片机和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;
ENTITYCPLDADAIS
PORT
   (
   SA:          IN   STD_LOGIC_VECTOR(11 DOWNTO 0);
   SD:          INOUTSTD_LOGIC_VECTOR(7 DOWNTO 0);
   IOW,IOR:   IN   STD_LOGIC;   
   CLK:       IN   STD_LOGIC;    ---SYSTEM CLK 改为CLK
   --PCIRQ:       OUTSTD_LOGIC;   ---SIGNAL INTERRUPT
   ----------------ISA BUS24 PIN----------------------
   
   MCUAD:          INOUTSTD_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;   

ARCHITECTUREADIO 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(11DOWNTO 0) ="010000000000"       ELSE '0';
PCCS1<='1'    WHEN   SA(11DOWNTO 0) ="010000000001"       ELSE '0';
--PCCS2<= '1'   WHEN   SA(11DOWNTO 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   WHENPCCS0='1' AND IOR='0' ELSE
         MCUDATA               WHENPCCS1='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;
------------------------------------------
接口电路如下:
http://cache.amobbs.com/bbs_upload782111/files_15/ourdev_448677.jpg
(原文件名:CPLDIO.jpg)

xachf 发表于 2009-6-1 00:30:45

问题出在硬件的管脚定义上了,已经解决,上文程序基本正确,但繁琐,可精简

hangelhao 发表于 2011-4-29 10:39:25

回复【1楼】xachf
-----------------------------------------------------------------------

楼主在么?!

beck_ck 发表于 2012-2-24 02:37:08

回复【楼主位】xachf
-----------------------------------------------------------------------

mark
页: [1]
查看完整版本: VHDL ISA和单片机的接口,求助