9212|14

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

8255的VHDL描述----请高手指点! [复制链接]

我对此程序有所怀疑,不知道是否能实现其功能,请高手指点,其仿真波形又是什么样的呢?编译后有一警告,不知道是什么意思?
谢谢指教!
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cipc IS
  PORT(reset,rd,wr,cs,a0,a1:IN STD_ULOGIC;
       Pa:INOUT STD_ULOGIC_VECTOR(7 DOWNTO 0);
       Pb:INOUT STD_ULOGIC_VECTOR(7 DOWNTO 0);
       Pcl:INOUT STD_ULOGIC_VECTOR(3 DOWNTO 0);
       Pch:INOUT STD_ULOGIC_VECTOR(3 DOWNTO 0);
       d:INOUT STD_ULOGIC_VECTOR(7 DOWNTO 0));
END cipc;
ARCHITECTURE I8255 OF cipc IS
  SIgNAL internal_bus_out:STD_ULOGIC_VECTOR(7 DOWNTO 0);
  SIgNAL internal_bus_in:STD_ULOGIC_VECTOR(7 DOWNTO 0); 
  SIgNAL st,ad,flag:STD_ULOGIC_VECTOR(1 DOWNTO 0);
  SIgNAL ctrreg:STD_ULOGIC_VECTOR(7 DOWNTO 0);
  SIgNAL Pa_latch,Pb_latch,Pc_latch:STD_ULOGIC_VECTOR(7 DOWNTO 0);
BEGIN
P1:PROCESS(rd,cs,ctrreg,a0,a1,st,internal_bus_in,pa,pb,pcl,pch)
  BEGIN
    st<=ctrreg(3) & ctrreg(0);
    IF(cs='0' AND rd='0')THEN
      IF(a0='0' AND a1='0' AND ctrreg(4)='1')THEN
        internal_bus_in<=Pa;
      ELSIF(a0='1' AND a1='0' AND ctrreg(1)='1')THEN
        internal_bus_in<=Pb;
      ELSIF(a0='0' AND a1='1' AND st="01")THEN
        internal_bus_in(3 DOWNTO 0)<=Pcl(3 DOWNTO 0);
      ELSIF(a0='0' AND a1='1' AND st="10")THEN
        internal_bus_in(7 DOWNTO 4)<=Pch(3 DOWNTO 0);
      ELSIF(a0='0' AND a1='0' AND st="01" AND ctrreg(7)='1')THEN
        internal_bus_in(3 DOWNTO 0)<=Pcl(3 DOWNTO 0);
        internal_bus_in(7 DOWNTO 4)<=Pch(3 DOWNTO 0);
     END IF;
    ELSE
     internal_bus_in<="ZZZZZZZZ";
    END IF;
    D<=internal_bus_in;
  END PROCESS;

P2:PROCESS(cs,wr,reset,a0,a1,d)
   VARIABLE ctrregF:STD_ULOGIC;
   VARIABLE Bctrreg_V:STD_ULOGIC_VECTOR(3 DOWNTO 0);
 BEGIN
  IF (cs='0' AND wr='0') THEN
    ad<=a1&a0;
    ctrregF:=D(7);
    internal_bus_out<=d;
  END IF;
 IF (reset='1')THEN
    Pa_latch<="00000000";
    Pb_latch<="00000000";
    Pc_latch<="00000000";
    ctrreg<="10011011";
    Bctrreg_V:="0000";
    ctrregF:='0';
  ELSIF(wr'EVENT AND wr='1')THEN
      IF (ctrregF='1' AND cs='0' AND ad="11")THEN
        ctrreg<=internal_bus_out;
       ELSIF(ctrreg(7)='1' AND cs='0' AND ad="00")THEN
        Pa_latch<=internal_bus_out;
       ELSIF(ctrreg(7)='1' AND cs='0' AND ad="01")THEN
        Pb_latch<=internal_bus_out;
       ELSIF(ctrreg(7)='1' AND cs='0' AND ad="10")THEN
        PC_latch<=internal_bus_out;
       END IF;
       IF(ctrregF='0' AND cs='0' AND ad="11")THEN
        Bctrreg_V:=internal_bus_out(3 DOWNTO 0);
        CASE Bctrreg_V IS
         WHEN "0000"=>PC_latch(0)<='0';
         WHEN "0010"=>PC_latch(1)<='0';
         WHEN "0100"=>PC_latch(2)<='0';
         WHEN "0110"=>PC_latch(3)<='0';
         WHEN "1000"=>PC_latch(4)<='0';
         WHEN "1010"=>PC_latch(5)<='0';
         WHEN "1100"=>PC_latch(6)<='0';
         WHEN "1110"=>PC_latch(7)<='0';
         WHEN "0001"=>PC_latch(0)<='0';
         WHEN "0011"=>PC_latch(1)<='0';
         WHEN "0101"=>PC_latch(2)<='0';
         WHEN "0111"=>PC_latch(3)<='0';
         WHEN "1001"=>PC_latch(4)<='0';
         WHEN "1011"=>PC_latch(5)<='0';
         WHEN "1101"=>PC_latch(6)<='0';
         WHEN "1111"=>PC_latch(7)<='0';
         WHEN others=>flag<="11";
        END CASE;
       END IF;
      END IF;
  END PROCESS P2;

P3:PROCESS(Pa_latch,ctrreg)
 BEGIN
 IF(ctrreg(4)='0') THEN
   Pa<=(Pa_latch);
 ELSE
   Pa<="ZZZZZZZZ";
 END IF;
END PROCESS P3;

P4:PROCESS(Pb_latch,ctrreg)
  BEGIN
  IF(ctrreg(1)='0') THEN
   Pb<=Pb_latch;
 ELSE
   Pb<="ZZZZZZZZ";
 END IF;
END PROCESS P4;

P5:PROCESS(Pb_latch,ctrreg,pc_latch)
  BEGIN
  IF(ctrreg(0)='0') THEN
   Pcl<=PC_latch(3 DOWNTO 0);
 ELSE
   Pcl<="ZZZZ";
 END IF;
END PROCESS P5;

P6:PROCESS(PC_latch,ctrreg)
  BEGIN
  IF(ctrreg(3)='0') THEN
   Pch<=PC_latch(7 DOWNTO 4);
 ELSE
   Pch<="ZZZZ";
 END IF;
END PROCESS P6;
END I8255;

最新回复

altera的原版的程序中有下面的一段程序,编译时会出错,在网上说是WAIT FOR 语句不可以进行综合。是这样的吗 ? ---------------------------------         -- Process for free-running clock         ---------------------------------           CLKClockPrc : PROCESS         BEGIN                 clk   详情 回复 发表于 2010-4-11 20:15
点赞 关注

回复
举报

1759

帖子

0

TA的资源

裸片初长成(高级)

沙发
 

Re: 8255的VHDL描述----请高手指点!

vhdl很简单的 你要是怀疑的话 自己写一下就可以了 没必要对别人的程序将信将疑的
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

Re: 8255的VHDL描述----请高手指点!

任何事物都有初学者,更何况都已说明是请教高手指点,并不曾说编程者的不是,请好打报不平者,不要轻易回帖,避免浪费网站空间!
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

4
 

Re: 8255的VHDL描述----请高手指点!

你可以自己仿真阿 结果一看就知道了 只要你熟悉8255 熟悉eda软件就可以了 没必要这么牛吧 我不是高手 请见谅 仅仅搞了4年的vhdl而已 对于我来说vhdl逻辑方面的东西 真的很简单的
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

173

帖子

0

TA的资源

一粒金砂(高级)

5
 

Re: 8255的VHDL描述----请高手指点!

顶一下,我现在没有时间来写这个,大家不要在这里来吵架啊!文明空间! 有时间的时候帮你写一个。
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

6
 

Re: 8255的VHDL描述----请高手指点!

小S既然如此厉害,只要你2分钟的时间,就帮初学者写一个好了,帮忙嘛!!
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

7
 

Re: 8255的VHDL描述----请高手指点!

这个语言只是一些逻辑关系,关系错了,编译就会出错,没有搞洞一个语言之前,不能就想跑啦,好好把基础的好好学学,人不能一口就吃个胖子,从头来,要脚踏实地。你可以的
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

8
 

Re: 8255的VHDL描述----请高手指点!

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY a8255tb IS
  GENERIC (
          CLKOffset  : TIME :=   0 ns;
          CLKPeriod  : TIME := 200 ns;
          LoopDelay  : TIME :=  50 ns
          );
  PORT (
      RESET_Stim : OUT std_logic;
      CLK_Stim   : OUT std_logic;
      nCS_Stim   : OUT std_logic;
      nRD_Stim   : OUT std_logic;
      nWR_Stim   : OUT std_logic;
      A_Stim     : OUT std_logic_vector (1 DOWNTO 0);
      DIN_Stim   : OUT std_logic_vector (7 DOWNTO 0);
      PAIN_Stim  : OUT std_logic_vector (7 DOWNTO 0);
      PBIN_Stim  : OUT std_logic_vector (7 DOWNTO 0);
      PCIN_Stim  : OUT std_logic_vector (7 DOWNTO 0);

      DOUT_Resp  : IN std_logic_vector (7 DOWNTO 0);
      PAOUT_Resp : IN std_logic_vector (7 DOWNTO 0);
      PAEN_Resp  : IN std_logic;
      PBOUT_Resp : IN std_logic_vector (7 DOWNTO 0);
      PBEN_Resp  : IN std_logic;
      PCOUT_Resp : IN std_logic_vector (7 DOWNTO 0);
      PCEN_Resp  : IN std_logic_vector (7 DOWNTO 0)
       );
END a8255tb;

-----------------------------
-- Architecture Body
-----------------------------
ARCHITECTURE MainTest OF a8255tb IS

SIGNAL PA : std_logic_vector (7 DOWNTO 0);
SIGNAL PB : std_logic_vector (7 DOWNTO 0);
SIGNAL PC : std_logic_vector (7 DOWNTO 0);

TYPE LoopBackModeType IS (Mode0, Mode1_AToB, Mode1_BToA, Mode2_AToB, Mode2_BToA);
SIGNAL LoopBackMode : LoopBackModeType;

BEGIN


  CLKClockPrc : PROCESS
    BEGIN
    CLK_Stim <= '0';
    WAIT FOR CLKOffset;
    LOOP
      CLK_Stim <= '0';
      WAIT FOR CLKPeriod/2;
      CLK_Stim <= '1';
      WAIT FOR CLKPeriod/2;
    END LOOP;
  END PROCESS CLKClockPrc;

  GeneralStimulus : PROCESS
    CONSTANT  PortA      : std_logic_vector(1 DOWNTO 0) := "00";
    CONSTANT  PortB      : std_logic_vector(1 DOWNTO 0) := "01";
    CONSTANT  PortC      : std_logic_vector(1 DOWNTO 0) := "10";
    CONSTANT  ControlReg : std_logic_vector(1 DOWNTO 0) := "11";
    CONSTANT  ChangeBit  : std_logic_vector(1 DOWNTO 0) := "11";

    -----------------------------------------------------------------------
    -- Define procedure to initialize inputs to default values and reset
    -----------------------------------------------------------------------
    PROCEDURE InitInputsAndReset IS
      BEGIN
        nCS_Stim  <= '1';
        nRD_Stim  <= '1';
        nWR_Stim  <= '1';
        A_Stim    <= "00";
        DIN_Stim  <= "00000000";

        RESET_Stim <= '1';
        WAIT FOR CLKPeriod * 2;
        RESET_Stim <= '0';
        WAIT FOR CLKPeriod * 2;
         
    END InitInputsAndReset;

    -----------------------------------------------------------------------
    -- Define procedure to read any register and compare to an expected value
    -----------------------------------------------------------------------
    PROCEDURE  ReadReg (Address      : IN std_logic_vector(1 DOWNTO 0);
                        ExpectedData : IN bit_vector(7 DOWNTO 0)
                        ) IS
      BEGIN
        A_Stim <= Address;
        WAIT FOR CLKPeriod;

        nCS_Stim <= '0';
        nRD_Stim <= '0';
        WAIT FOR CLKPeriod;

        ASSERT (DOUT_Resp = to_stdlogicvector(ExpectedData))
            REPORT "Read Data does not match Expected Data" SEVERITY WARNING;

        nCS_Stim <= '1';
        nRD_Stim <= '1';
        WAIT FOR CLKPeriod;
            
      END ReadReg;

    -----------------------------------------------------------------------
    -- Define procedure to write any register
    -----------------------------------------------------------------------
    PROCEDURE  WriteReg(Address  : IN std_logic_vector(1 DOWNTO 0);
                        Data     : IN bit_vector(7 DOWNTO 0)
                        ) IS
      BEGIN

        A_Stim <= Address;
        nCS_Stim <= '0';
        DIN_Stim <= to_stdlogicvector(Data);
        WAIT FOR CLKPeriod;


        nWR_Stim <= '0';
        WAIT FOR CLKPeriod;

        nWR_Stim <= '1';
        WAIT FOR CLKPeriod * 2;

        nCS_Stim <= '1';
        WAIT FOR CLKPeriod * 2;
            
      END  WriteReg;


    ---------------------------------------------------------------
    -- Main Test Program
    ---------------------------------------------------------------
    BEGIN

      ASSERT false REPORT "START MODE 0 TEST" SEVERITY NOTE;

      -- Set Loop Back Mode
          LoopBackMode <= Mode0;

      -- Reset chip and set inputs to default values
      InitInputsAndReset;

      -- Read Control Reg after reset
      ReadReg(ControlReg,   x"9B");    -- Resets to Mode 0, all inputs

      -- Load Port output registers before changing mode and direction
          WriteReg(PortA, x"AA");
          WriteReg(PortB, x"55");
          WriteReg(PortC, x"F0");

          -- Set Mode 0, Port A out, B in, C upper in, C lower out
          WriteReg(ControlReg,   x"8A");

      -- Read all ports
      ReadReg(PortA,   x"AA");
      ReadReg(PortB,   x"AA");
      ReadReg(PortC,   x"00");

          -- Set Mode 0, Port A in, B out, C upper out, C lower in
      WriteReg(ControlReg,   x"98");
      WriteReg(ControlReg,   x"91");

      -- Read all ports
      ReadReg(PortA,   x"55");
      ReadReg(PortB,   x"55");
      ReadReg(PortC,   x"FF");

      -- Load Port output registers with inverse
          WriteReg(PortA, x"55");
          WriteReg(PortB, x"AA");
          WriteReg(PortC, x"0F");

      -- Read all ports
      ReadReg(PortA,   x"AA");
      ReadReg(PortB,   x"AA");
      ReadReg(PortC,   x"00");

          -- Set Mode 0, Port A out, B in, C upper out, C lower in
      WriteReg(ControlReg,   x"83");

      -- Read all ports
      ReadReg(PortA,   x"55");
      ReadReg(PortB,   x"55");
      ReadReg(PortC,   x"00");

          -- Test Port C Upper Set/Reset Bit Feature
      WriteReg(ChangeBit,   x"09");          -- Set Port C (4)
      ReadReg(PortC,   x"11");

      WriteReg(ChangeBit,   x"0B");   -- Set Port C (5)
      ReadReg(PortC,   x"33");

      WriteReg(ChangeBit,   x"0D");   -- Set Port C (6)
      ReadReg(PortC,   x"77");

      WriteReg(ChangeBit,   x"0F");   -- Set Port C (7)
      ReadReg(PortC,   x"FF");

      WriteReg(ChangeBit,   x"08");          -- Reset Port C (4)
      ReadReg(PortC,   x"EE");

      WriteReg(ChangeBit,   x"0A");   -- Reset Port C (5)
      ReadReg(PortC,   x"CC");

      WriteReg(ChangeBit,   x"0C");   -- Reset Port C (6)
      ReadReg(PortC,   x"88");

      WriteReg(ChangeBit,   x"0E");   -- Reset Port C (7)
      ReadReg(PortC,   x"00");

          -- Set Mode 0, Port A out, B in, C upper in, C lower out
      WriteReg(ControlReg,   x"8A");
          WriteReg(PortC, x"00");

          -- Test Port C Lower Set/Reset Bit Feature
      WriteReg(ChangeBit,   x"01");          -- Set Port C (0)
      ReadReg(PortC,   x"11");

      WriteReg(ChangeBit,   x"03");   -- Set Port C (1)
      ReadReg(PortC,   x"33");

      WriteReg(ChangeBit,   x"05");   -- Set Port C (2)
      ReadReg(PortC,   x"77");

      WriteReg(ChangeBit,   x"07");   -- Set Port C (3)
      ReadReg(PortC,   x"FF");

      WriteReg(ChangeBit,   x"00");          -- Reset Port C (0)
      ReadReg(PortC,   x"EE");

      WriteReg(ChangeBit,   x"02");   -- Reset Port C (1)
      ReadReg(PortC,   x"CC");

      WriteReg(ChangeBit,   x"04");   -- Reset Port C (2)
      ReadReg(PortC,   x"88");

      WriteReg(ChangeBit,   x"06");   -- Reset Port C (3)
      ReadReg(PortC,   x"00");

------------------------------------------------------------
------------------------------------------------------------
      ASSERT false REPORT "START MODE 1 TEST" SEVERITY NOTE;

      -- Set Loop Back Mode
          LoopBackMode <= Mode1_AToB;

      -- Reset chip and set inputs to default values
      InitInputsAndReset;

      -- Read Control Reg after reset
      ReadReg(ControlReg,   x"9B");    -- Resets to Mode 0, all inputs

          -- Set Mode 1, Port A out, B in and check Port C Status
      WriteReg(ControlReg,   x"A6");
      WriteReg(ChangeBit,   x"0F");   -- Set Port C (7)
      WriteReg(ChangeBit,   x"02");   -- Reset Port C (1)
      WriteReg(ChangeBit,   x"00");          -- Reset Port C (0)
      ReadReg(PortC,   x"80");                  -- Read Port C Status (only OBFA is set)

      -- Load Port output registers
          WriteReg(PortA, x"11");

      -- Read all ports
      ReadReg(PortB,   x"11");
      ReadReg(PortC,   x"80");                  -- Read Port C Status (only OBFA is set)

      -- Do same test with interrupt enables on
      WriteReg(ChangeBit,   x"0D");   -- Set Port A Int Enable (Port C (6))
      WriteReg(ChangeBit,   x"05");   -- Set Port B Int Enable (Port C (2))
      ReadReg(PortC,   x"C4");                  -- Read Port C Status (OBFA, INTEA, and INTEB are set)
          WriteReg(PortA,  x"88");
      ReadReg(PortC,   x"C7");                  -- Read Port C Status (everything but INTA is set)
      ReadReg(PortB,   x"88");
      ReadReg(PortC,   x"CC");                  -- Read Port C Status

      -- Load Port output registers to bring down INTA
          WriteReg(PortA, x"00");


-- REVERSE LOOPBACK DIRECTION

      -- Set Loop Back Mode
          LoopBackMode <= Mode1_BToA;

      -- Reset chip and set inputs to default values
      InitInputsAndReset;

      -- Read Control Reg after reset
      ReadReg(ControlReg,   x"9B");    -- Resets to Mode 0, all inputs

          -- Set Mode 1, Port A out, B in and check Port C Status
      WriteReg(ControlReg,   x"B4");
      WriteReg(ChangeBit,   x"0E");          -- Reset Port C (7)
      WriteReg(ChangeBit,   x"0C");          -- Reset Port C (6)
      WriteReg(ChangeBit,   x"0A");          -- Reset Port C (5)
      WriteReg(ChangeBit,   x"08");          -- Reset Port C (4)
      WriteReg(ChangeBit,   x"06");   -- Reset Port C (3)
      WriteReg(ChangeBit,   x"04");   -- Reset Port C (2)
      WriteReg(ChangeBit,   x"03");   -- Set Port C (1)
      WriteReg(ChangeBit,   x"00");          -- Reset Port C (0)
      ReadReg(PortC,   x"02");                  -- Read Port C Status (only OBFB is set)

      -- Load Port output registers
          WriteReg(PortB, x"33");

      -- Read all ports
      ReadReg(PortA,   x"33");
      ReadReg(PortC,   x"02");                  -- Read Port C Status (only OBFB is set)

      -- Do same test with interrupt enables on
      WriteReg(ChangeBit,   x"09");   -- Set Port A Int Enable (Port C (4))
      WriteReg(ChangeBit,   x"05");   -- Set Port B Int Enable (Port C (2))
      ReadReg(PortC,   x"16");                  -- Read Port C Status (OBFA, INTEA, and INTEB are set)
          WriteReg(PortB,  x"44");
      ReadReg(PortC,   x"3E");                  -- Read Port C Status (everything but INTB is set)
      ReadReg(PortA,   x"44");
      ReadReg(PortC,   x"17");                  -- Read Port C Status (INTB and OBFB set)

      -- Load Port output registers        to bring down INTB
          WriteReg(PortB, x"FF");

------------------------------------------------------------
------------------------------------------------------------
      ASSERT false REPORT "START MODE 2 TEST" SEVERITY NOTE;

      -- Set Loop Back Mode
          LoopBackMode <= Mode2_AToB;

      -- Reset chip and set inputs to default values
      InitInputsAndReset;

      -- Read Control Reg after reset
      ReadReg(ControlReg,   x"9B");    -- Resets to Mode 0, all inputs

          -- Set Port A to Mode 2, B in and check Port C Status
      WriteReg(ControlReg,   x"C6");
      WriteReg(ChangeBit,   x"0F");   -- Set Port C (7)          --OBFA
      WriteReg(ChangeBit,   x"0C");   -- Reset Port C (6) --INTE1
      WriteReg(ChangeBit,   x"0A");   -- Reset Port C (5) --IBFA
      WriteReg(ChangeBit,   x"08");   -- Reset Port C (4) --INTE2
      WriteReg(ChangeBit,   x"06");   -- Reset Port C (3) --INTRA
      WriteReg(ChangeBit,   x"04");   -- Reset Port C (2) --INTEB
      WriteReg(ChangeBit,   x"02");   -- Reset Port C (1) --IBFB
      WriteReg(ChangeBit,   x"00");          -- Reset Port C (0) --INTRB
      ReadReg(PortC,   x"80");                  -- Read Port C Status (only OBFA is set)

      -- Load Port output registers
          WriteReg(PortA, x"11");

      -- Read all ports
      ReadReg(PortB,   x"11");
      ReadReg(PortC,   x"80");                  -- Read Port C Status (only OBFA is set)

      -- Do same test with interrupt enables on
      WriteReg(ChangeBit,   x"0D");   -- Set Port A Int Enable (Port C (6))
      WriteReg(ChangeBit,   x"05");   -- Set Port B Int Enable (Port C (2))
      ReadReg(PortC,   x"C4");                  -- Read Port C Status (OBFA, INTEA, and INTEB are set)
          WriteReg(PortA,  x"88");
      ReadReg(PortC,   x"C7");                  -- Read Port C Status (everything but INTA is set)
      ReadReg(PortB,   x"88");
      ReadReg(PortC,   x"CC");                  -- Read Port C Status

      -- Load Port output registers to bring down INTA
          WriteReg(PortA, x"00");




      -- Set Loop Back Mode
          LoopBackMode <= Mode2_BToA;

      -- Reset chip and set inputs to default values
      InitInputsAndReset;

      -- Read Control Reg after reset
      ReadReg(ControlReg,   x"9B");    -- Resets to Mode 0, all inputs

          -- Set Port A to Mode 2, B out and check Port C Status
      WriteReg(ControlReg,   x"C4");
      WriteReg(ChangeBit,   x"0F");   -- Set Port C (7)          --OBFA
      WriteReg(ChangeBit,   x"0C");   -- Reset Port C (6) --INTE1
      WriteReg(ChangeBit,   x"0A");   -- Reset Port C (5) --IBFA
      WriteReg(ChangeBit,   x"08");   -- Reset Port C (4) --INTE2
      WriteReg(ChangeBit,   x"06");   -- Reset Port C (3) --INTRA
      WriteReg(ChangeBit,   x"04");   -- Reset Port C (2) --INTEB
      WriteReg(ChangeBit,   x"03");   -- Set Port C (1)   --OBFB
      WriteReg(ChangeBit,   x"00");          -- Reset Port C (0) --INTRB
      ReadReg(PortC,   x"82");                  -- Read Port C Status (OBFA, OBFB is set)

      -- Load Port output registers
          WriteReg(PortB, x"66");

      -- Read all ports
      ReadReg(PortA,   x"66");
      ReadReg(PortC,   x"82");                  -- Read Port C Status (only OBFA is set)

      -- Do same test with interrupt enables on
      WriteReg(ChangeBit,   x"09");   -- Set Port A Int Enable (Port C (4))
      WriteReg(ChangeBit,   x"05");   -- Set Port B Int Enable (Port C (2))
      ReadReg(PortC,   x"96");                  -- Read Port C Status (OBFA, INTEA2, and INTEB are set)
          WriteReg(PortB,  x"88");
      ReadReg(PortC,   x"BE");                  -- Read Port C Status (everything but INTRB is set)
      ReadReg(PortA,   x"88");
      ReadReg(PortC,   x"97");                  -- Read Port C Status

      -- Load Port output registers to bring down INTA
          WriteReg(PortB, x"00");

      ASSERT false REPORT "END OF TEST" SEVERITY NOTE;
      WAIT;
  END PROCESS GeneralStimulus;

  ------------------------------------------------------------
  -- Process to loop PA to PB, and PC upper to PC lower
  ------------------------------------------------------------
  OutputBufferPrc : Process    (PAEN_Resp, PBEN_Resp, PCEN_Resp, PAOUT_Resp, PBOUT_Resp, PCOUT_Resp)
    BEGIN
        IF (PAEN_Resp = '1') THEN
           PA <= PAOUT_Resp AFTER LoopDelay;
        ELSE
           PA <= "ZZZZZZZZ" AFTER LoopDelay;
        END IF;

        IF (PBEN_Resp = '1') THEN
           PB <= PBOUT_Resp AFTER LoopDelay;
        ELSE
           PB <= "ZZZZZZZZ" AFTER LoopDelay;
        END IF;

        FOR I IN 0 TO 7 LOOP
           IF (PCEN_Resp(I) = '1') THEN
             PC(I) <= PCOUT_Resp(I) AFTER LoopDelay;
           ELSE
              PC(I) <= 'Z' AFTER LoopDelay;
           END IF;
                END LOOP;

  END PROCESS OutputBufferPrc;

--  -- Output buffer assignments
  PAIN_Stim <= PA;
  PBIN_Stim <= PB;
  PCIN_Stim <= PC;
  
  -- Loop back assignments
  LoopBackPrc : Process    (LoopBackMode, PA, PB, PC)
    BEGIN
        PAIN_Stim <= PB ;
        PBIN_Stim <= PA ;
        IF (LoopBackMode = Mode0) THEN
           PCIN_Stim (7 DOWNTO 4) <= PC (3 DOWNTO 0) ;
           PCIN_Stim (3 DOWNTO 0) <= PC (7 DOWNTO 4) ;
        ELSIF (LoopBackMode = Mode1_BToA) THEN
                   PCIN_Stim (7) <= PC (7) ;
                   PCIN_Stim (6) <= PC (6) ;
                   PCIN_Stim (5) <= PC (5) ;
           PCIN_Stim (4) <= PC (1) ;      -- OBFB to STBA
                   PCIN_Stim (3) <= PC (3) ;
           PCIN_Stim (2) <= NOT PC (5) ;  -- IBFA to ACKB
                   PCIN_Stim (1) <= PC (1) ;
                   PCIN_Stim (0) <= PC (0) ;
        ELSIF (LoopBackMode = Mode2_BToA) THEN
                   PCIN_Stim (7) <= PC (7) ;
                   PCIN_Stim (6) <= '1';
                   PCIN_Stim (5) <= PC (5) ;
           PCIN_Stim (4) <= PC (1)  ;      -- OBFB to STBA
                   PCIN_Stim (3) <= PC (3) ;
           PCIN_Stim (2) <= NOT PC (5) ;  -- IBFA to ACKB
                   PCIN_Stim (1) <= PC (1) ;
                   PCIN_Stim (0) <= PC (0) ;
        ELSIF (LoopBackMode = Mode1_AToB) THEN
                   PCIN_Stim (0) <= PC (0) ;
                   PCIN_Stim (1) <= PC (1) ;
           PCIN_Stim (2) <= PC (7) ;      -- OBFA to STBB
                   PCIN_Stim (3) <= PC (3) ;                                    
                   PCIN_Stim (4) <= PC (4) ;
                   PCIN_Stim (5) <= PC (5) ;
           PCIN_Stim (6) <= NOT PC (1) ;  -- IBFB to ACKA
                   PCIN_Stim (7) <= PC (7) ;
        ELSIF (LoopBackMode = Mode2_AToB) THEN
                   PCIN_Stim (0) <= PC (0) ;
                   PCIN_Stim (1) <= PC (1) ;
           PCIN_Stim (2) <= PC (7) ;      -- OBFA to STBB
                   PCIN_Stim (3) <= PC (3) ;                                    
                   PCIN_Stim (4) <= '1';
                   PCIN_Stim (5) <= PC (5) ;
           PCIN_Stim (6) <= NOT PC (1) ;  -- IBFB to ACKA
                   PCIN_Stim (7) <= PC (7) ;
        END IF;


  END PROCESS LoopBackPrc;

END MainTest;
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

9
 

Re: 8255的VHDL描述----请高手指点!

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY a8255 IS
   PORT(
      RESET : IN std_logic;
      CLK   : IN std_logic;
      nCS   : IN std_logic;
      nRD   : IN std_logic;
      nWR   : IN std_logic;
      A     : IN std_logic_vector (1 DOWNTO 0);
      DIN   : IN std_logic_vector (7 DOWNTO 0);
      PAIN  : IN std_logic_vector (7 DOWNTO 0);
      PBIN  : IN std_logic_vector (7 DOWNTO 0);
      PCIN  : IN std_logic_vector (7 DOWNTO 0);

      DOUT  : OUT std_logic_vector (7 DOWNTO 0);
      PAOUT : OUT std_logic_vector (7 DOWNTO 0);
      PAEN  : OUT std_logic;
      PBOUT : OUT std_logic_vector (7 DOWNTO 0);
      PBEN  : OUT std_logic;
      PCOUT : OUT std_logic_vector (7 DOWNTO 0);
      PCEN  : OUT std_logic_vector (7 DOWNTO 0)
   );

END a8255;


ARCHITECTURE structure OF a8255 IS
   -- SIGNAL DECLARATIONS
      SIGNAL DOUTSelect           : std_logic_vector(2 DOWNTO 0);
      SIGNAL ControlReg           : std_logic_vector(7 DOWNTO 0);
          SIGNAL PortAOutLd           : std_logic;
          SIGNAL PortBOutLd           : std_logic;
          SIGNAL PortCOverride        : std_logic;
          SIGNAL PortCOutLd           : std_logic_vector (7 DOWNTO 0);
      SIGNAL PortAInReg           : std_logic_vector (7 DOWNTO 0);
      SIGNAL PortBInReg           : std_logic_vector (7 DOWNTO 0);
          SIGNAL PortARead            : std_logic;
          SIGNAL PortBRead            : std_logic;
          SIGNAL PortAWrite           : std_logic;
          SIGNAL PortBWrite           : std_logic;
          SIGNAL PortCStatus          : std_logic_vector (7 DOWNTO 0);
          SIGNAL CompositePortCStatus : std_logic_vector (7 DOWNTO 0);


   -- COMPONENT_DECLARATIONS
      COMPONENT dout_mux
         PORT(
            DOUTSelect  : IN std_logic_vector (2 DOWNTO 0);
            ControlReg  : IN std_logic_vector (7 DOWNTO 0);
            PortAInReg  : IN std_logic_vector (7 DOWNTO 0);
            PAIN        : IN std_logic_vector (7 DOWNTO 0);
            PortBInReg  : IN std_logic_vector (7 DOWNTO 0);
            PBIN        : IN std_logic_vector (7 DOWNTO 0);
            PortCStatus : IN std_logic_vector (7 DOWNTO 0);
            DOUT        : OUT std_logic_vector(7 DOWNTO 0)
         );
      END COMPONENT;

      COMPONENT cntl_log
         PORT(
            RESET         : IN std_logic;
            CLK           : IN std_logic;
            nCS           : IN std_logic;
            nRD           : IN std_logic;
            nWR           : IN std_logic;
            A             : IN std_logic_vector (1 DOWNTO 0);
            DIN           : IN std_logic_vector(7 DOWNTO 0);
            PCIN          : IN std_logic_vector(7 DOWNTO 0);
            PAEN          : OUT std_logic;
            PBEN          : OUT std_logic;
            PCEN          : OUT std_logic_vector (7 DOWNTO 0);
                        DOUTSelect    : OUT std_logic_vector (2 DOWNTO 0);
                        ControlReg    : OUT std_logic_vector (7 DOWNTO 0);
            PortARead     : OUT std_logic;
            PortBRead     : OUT std_logic;
            PortAWrite    : OUT std_logic;
            PortBWrite    : OUT std_logic;
                        PortAOutLd    : OUT std_logic;
                        PortBOutLd    : OUT std_logic;
                        PortCOverride : OUT std_logic;
                        PortCOutLd    : OUT std_logic_vector (7 DOWNTO 0)
         );
      END COMPONENT;

      COMPONENT portaout
         PORT(
            DIN        : IN std_logic_vector (7 DOWNTO 0);
            RESET      : IN std_logic;
            CLK        : IN std_logic;
            PortAOutLd : IN std_logic;
            PAOUT      : OUT std_logic_vector (7 DOWNTO 0)
         );
      END COMPONENT;


      COMPONENT portain
         PORT(
            PAIN       : IN std_logic_vector (7 DOWNTO 0);
            RESET      : IN std_logic;
            CLK        : IN std_logic;
            PortAInLd  : IN std_logic;
            PortAInReg : OUT std_logic_vector (7 DOWNTO 0)
         );
      END COMPONENT;

      COMPONENT portbout
         PORT(
            DIN        : IN std_logic_vector (7 DOWNTO 0);
            RESET      : IN std_logic;
            CLK        : IN std_logic;
            PortBOutLd : IN std_logic;
            PBOUT      : OUT std_logic_vector (7 DOWNTO 0)
         );
      END COMPONENT;

      COMPONENT portbin
         PORT(
            PBIN       : IN std_logic_vector (7 DOWNTO 0);
            RESET      : IN std_logic;
            CLK        : IN std_logic;
            PortBInLd  : IN std_logic;
            PortBInReg : OUT std_logic_vector (7 DOWNTO 0)
         );
      END COMPONENT;

      COMPONENT portcout
         PORT(
            RESET         : IN std_logic;
            CLK           : IN std_logic;
            DIN           : IN std_logic_vector (7 DOWNTO 0);
            PCIN          : IN std_logic_vector (7 DOWNTO 0);
            ControlReg    : IN std_logic_vector (7 DOWNTO 0);
            PortARead     : IN std_logic;
            PortBRead     : IN std_logic;
            PortAWrite    : IN std_logic;
            PortBWrite    : IN std_logic;
            PortCOverride : IN std_logic;
            PortCOutLd    : IN std_logic_vector (7 DOWNTO 0);
            PortCStatus   : OUT std_logic_vector (7 DOWNTO 0);
            PCOUT         : OUT std_logic_vector (7 DOWNTO 0)
         );
      END COMPONENT;


   BEGIN
      -- CONCURRENT SIGNAL ASSIGNMENTS
          CompositePortCStatus <= PCIN(7)        &  
                                  PortCStatus(6) &
                                  PCIN(5)        &
                                  PortCStatus(4) &
                              PCIN(3)        &
                              PortCStatus(2) &
                              PCIN(1)        &
                              PCIN(0);

      -- COMPONENT INSTANTIATIONS
      I_dout_mux : dout_mux
         PORT MAP(
            DOUTSelect  => DOUTSelect          ,
            ControlReg  => ControlReg          ,
            PortAInReg  => PortAInReg          ,
            PAIN        => PAIN                ,
            PortBInReg  => PortBInReg          ,
            PBIN        => PBIN                ,
            PortCStatus => CompositePortCStatus,
            DOUT        => DOUT      
         );

      I_cntl_log : cntl_log
         PORT MAP(
            RESET          => RESET         ,
            CLK            => CLK           ,
            nCS            => nCS           ,
            nRD            => nRD           ,
            nWR            => nWR           ,
            A              => A             ,
            DIN            => DIN           ,
            PCIN           => PCIN          ,
            PAEN           => PAEN          ,
            PBEN           => PBEN          ,
            PCEN           => PCEN          ,
                        DOUTSelect     => DOUTSelect    ,
                        ControlReg     => ControlReg    ,
            PortARead      => PortARead     ,
            PortBRead      => PortBRead     ,
            PortAWrite     => PortAWrite    ,
            PortBWrite     => PortBWrite    ,
                        PortAOutLd     => PortAOutLd    ,
                        PortBOutLd     => PortBOutLd    ,
                        PortCOverride  => PortCOverride ,
                        PortCOutLd     => PortCOutLd
         );

      I_portaout : portaout
         PORT MAP(
            DIN        => DIN       ,
            RESET      => RESET     ,
            CLK        => CLK       ,
            PortAOutLd => PortAOutLd,
            PAOUT      => PAOUT     
         );


      I_portain : portain
         PORT MAP(
            PAIN       => PAIN      ,
            RESET      => RESET     ,
            CLK        => CLK       ,
            PortAInLd  => PCIN (4)  ,
            PortAInReg => PortAInReg
         );

      I_portbout : portbout
         PORT MAP(
            DIN        => DIN       ,
            RESET      => RESET     ,
            CLK        => CLK       ,
            PortBOutLd => PortBOutLd,
            PBOUT      => PBOUT     
         );

      I_portbin : portbin
         PORT MAP(
            PBIN       => PBIN      ,
            RESET      => RESET     ,
            CLK        => CLK       ,
            PortBInLd  => PCIN (2)  ,
            PortBInReg => PortBInReg
         );

      I_portcout : portcout
         PORT MAP(
            RESET         => RESET        ,
            CLK           => CLK          ,
            DIN           => DIN          ,
            PCIN          => PCIN         ,
            ControlReg    => ControlReg   ,
            PortARead     => PortARead    ,
            PortBRead     => PortBRead    ,
            PortAWrite    => PortAWrite   ,
            PortBWrite    => PortBWrite   ,
            PortCOutLd    => PortCOutLd   ,
                        PortCOverride => PortCOverride,
            PortCStatus   => PortCStatus  ,     
            PCOUT         => PCOUT     
         );


   END structure;
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

10
 

Re: 8255的VHDL描述----请高手指点!

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY a8255top IS
END a8255top;

-----------------------------
-- Architecture Body
-----------------------------
ARCHITECTURE struct OF a8255top IS


   SIGNAL  RESET_Stim : std_logic;
   SIGNAL  CLK_Stim   : std_logic;
   SIGNAL  nCS_Stim   : std_logic;
   SIGNAL  nRD_Stim   : std_logic;
   SIGNAL  nWR_Stim   : std_logic;
   SIGNAL  A_Stim     : std_logic_vector (1 DOWNTO 0);
   SIGNAL  DIN_Stim   : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PAIN_Stim  : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PBIN_Stim  : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PCIN_Stim  : std_logic_vector (7 DOWNTO 0);
   SIGNAL  DOUT_Resp  : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PAOUT_Resp : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PAEN_Resp  : std_logic;
   SIGNAL  PBOUT_Resp : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PBEN_Resp  : std_logic;
   SIGNAL  PCOUT_Resp : std_logic_vector (7 DOWNTO 0);
   SIGNAL  PCEN_Resp  : std_logic_vector (7 DOWNTO 0);

COMPONENT a8255 IS
   PORT(
      RESET : IN std_logic;
      CLK   : IN std_logic;
      nCS   : IN std_logic;
      nRD   : IN std_logic;
      nWR   : IN std_logic;
      A     : IN std_logic_vector (1 DOWNTO 0);
      DIN   : IN std_logic_vector (7 DOWNTO 0);
      PAIN  : IN std_logic_vector (7 DOWNTO 0);
      PBIN  : IN std_logic_vector (7 DOWNTO 0);
      PCIN  : IN std_logic_vector (7 DOWNTO 0);

      DOUT  : OUT std_logic_vector (7 DOWNTO 0);
      PAOUT : OUT std_logic_vector (7 DOWNTO 0);
      PAEN  : OUT std_logic;
      PBOUT : OUT std_logic_vector (7 DOWNTO 0);
      PBEN  : OUT std_logic;
      PCOUT : OUT std_logic_vector (7 DOWNTO 0);
      PCEN  : OUT std_logic_vector (7 DOWNTO 0)
   );

END COMPONENT;

COMPONENT a8255tb IS
  GENERIC (
          CLKOffset  : TIME :=   0 ns;
          CLKPeriod  : TIME := 200 ns;
          LoopDelay  : TIME :=  50 ns
          );
  PORT (
      RESET_Stim : OUT std_logic;
      CLK_Stim   : OUT std_logic;
      nCS_Stim   : OUT std_logic;
      nRD_Stim   : OUT std_logic;
      nWR_Stim   : OUT std_logic;
      A_Stim     : OUT std_logic_vector (1 DOWNTO 0);
      DIN_Stim   : OUT std_logic_vector (7 DOWNTO 0);
      PAIN_Stim  : OUT std_logic_vector (7 DOWNTO 0);
      PBIN_Stim  : OUT std_logic_vector (7 DOWNTO 0);
      PCIN_Stim  : OUT std_logic_vector (7 DOWNTO 0);

      DOUT_Resp  : IN std_logic_vector (7 DOWNTO 0);
      PAOUT_Resp : IN std_logic_vector (7 DOWNTO 0);
      PAEN_Resp  : IN std_logic;
      PBOUT_Resp : IN std_logic_vector (7 DOWNTO 0);
      PBEN_Resp  : IN std_logic;
      PCOUT_Resp : IN std_logic_vector (7 DOWNTO 0);
      PCEN_Resp  : IN std_logic_vector (7 DOWNTO 0)
       );
END COMPONENT;

BEGIN

UUT : a8255
   PORT MAP(
      RESET   => RESET_Stim,
      CLK     => CLK_Stim  ,
      nCS     => nCS_Stim  ,
      nRD     => nRD_Stim  ,
      nWR     => nWR_Stim  ,
      A       => A_Stim    ,
      DIN     => DIN_Stim  ,
      PAIN    => PAIN_Stim ,
      PBIN    => PBIN_Stim ,
      PCIN    => PCIN_Stim ,

      DOUT    => DOUT_Resp ,
      PAOUT   => PAOUT_Resp,
      PAEN    => PAEN_Resp ,
      PBOUT   => PBOUT_Resp,
      PBEN    => PBEN_Resp ,
      PCOUT   => PCOUT_Resp,
      PCEN    => PCEN_Resp  
   );

TB  : a8255tb
  GENERIC MAP(
          CLKOffset  =>   0 ns,
          CLKPeriod  => 400 ns,
          LoopDelay  => 100 ns
          )
  PORT MAP(
      RESET_Stim    => RESET_Stim,
      CLK_Stim      => CLK_Stim  ,
      nCS_Stim      => nCS_Stim  ,
      nRD_Stim      => nRD_Stim  ,
      nWR_Stim      => nWR_Stim  ,
      A_Stim        => A_Stim    ,
      DIN_Stim      => DIN_Stim  ,
      PAIN_Stim     => PAIN_Stim ,
      PBIN_Stim     => PBIN_Stim ,
      PCIN_Stim     => PCIN_Stim ,

      DOUT_Resp     => DOUT_Resp ,
      PAOUT_Resp    => PAOUT_Resp,
      PAEN_Resp     => PAEN_Resp ,
      PBOUT_Resp    => PBOUT_Resp,
      PBEN_Resp     => PBEN_Resp ,
      PCOUT_Resp    => PCOUT_Resp,
      PCEN_Resp     => PCEN_Resp
       );

END struct;
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

11
 

Re: 8255的VHDL描述----请高手指点!

altera的原版的 自己看看
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

12
 

Re: 8255的VHDL描述----请高手指点!

多谢连长!!!
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

13
 

Re: 8255的VHDL描述----请高手指点!

不客气
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 

Re: 8255的VHDL描述----请高手指点!

大家好啊,我现在在做跟这个差不多的毕业设计,在一本书上找到了8255的方式0和方式1的程序,方式0的程序经过仿真后发现正确,不过不知道怎么和方式1联合起来.其实还有好多问题.希望有高手可以指点我一下.我的邮件是xf03505@163.com,谢谢各位大侠,谢谢.原版的不太好,设计出来有将近90个管脚,而8255只有40个管脚.
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 13楼 njlianjian 的帖子

altera的原版的程序中有下面的一段程序,编译时会出错,在网上说是WAIT FOR 语句不可以进行综合。是这样的吗 ?
---------------------------------
        -- Process for free-running clock
        ---------------------------------
          CLKClockPrc : PROCESS
        BEGIN

                clk <= '0';

                WAIT FOR CLKOffset;

                LOOP

                        clk <= '0';

              WAIT FOR CLKPeriod/2;

              clk <= '1';

              WAIT FOR CLKPeriod/2;

            END LOOP;

        END PROCESS CLKClockPrc;
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表