|
使用单片机和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, 杜汶泽)
|