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

📄 control.vhd

📁 这是利用CPLD做DSP的存储器扩展的源文件。
💻 VHD
字号:
LIBRARY IEEE;                        --打开库文件
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY  control IS
PORT(  
   DSP_IS,DSP_IOSTRB,DSP_MSTRB: IN STD_LOGIC;    --DSP的选通信号
   DSP_DS,DSP_A7,DSP_A15,DSP_A19:IN STD_LOGIC;   --DSP的地址信号
   DSP_RW,DSP_PS:IN STD_LOGIC;                   --DSP的控制信号
   DSP_D: IN STD_LOGIC_VECTOR( 2 DOWNTO 0);      --DSP的数据信号
   DSP_XF: IN STD_LOGIC;                         --DSP的控制信号
   FLASH_OE: OUT STD_LOGIC;                      --Flash的读信号
   FLASH_WE: OUT STD_LOGIC;                      --Flash的写信号
   FLASH_CE: OUT STD_LOGIC;                      --Flash的片选信号
   SRAM_CE:  OUT STD_LOGIC;                      --SRAM的片选信号
   HCE,HOE:  OUT STD_LOGIC;                      --245,244的选择信号
   XDC0,XDC1:OUT STD_LOGIC;                      --SRAM1,SRAM2的片选信号
   Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);           --扩展页信号
   --DSP_XF:      IN STD_LOGIC;  
      CLK:          IN STD_LOGIC;  --外部时钟信号
      RESET:        IN STD_LOGIC;  --外部复位信号
      S1:           IN STD_LOGIC;
      S2:           IN STD_LOGIC;    --DSP发出的状态选择信号
      IN_DATA:      IN STD_LOGIC_VECTOR(5 DOWNTO 0); --AD数据输入
      ADCLK:        OUT STD_LOGIC; --AD转换时钟
      ADCE1:        OUT STD_LOGIC; --AD片选信号1
      ADCE2:        OUT STD_LOGIC; --AD片选信号2
      SRAM_ADDR:    OUT STD_LOGIC_VECTOR(20 DOWNTO 0);   --SRAM地址信号
      SRAM_CE1:     OUT STD_LOGIC; --第一个SRAM的片选信号
      SRAM_CE2:     OUT STD_LOGIC; --第二个SRAM的片选信号
      SRAM_WR:      OUT STD_LOGIC; --SRAM的写信号
      SRAM_OE:      OUT STD_LOGIC;
      OUT_DATA:     OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --AD数据输出
      SN_DATA:      OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--74,273输入
      READY:        OUT STD_LOGIC;    --向dsp发送的中断信号
      D_CLK:        OUT STD_LOGIC);   --74,273的时钟信号
END ENTITY control;
ARCHITECTURE ONE OF control IS
--SIGNAL STATE: STD_LOGIC_VECTOR(1 DOWNTO 0);  --定义状态信号
SIGNAL ADCLK_P:STD_LOGIC;          --AD时钟信号
SIGNAL DCLK_P:STD_LOGIC;           --D的时钟信号
SIGNAL PCLK:STD_LOGIC;              --数据同步信号,便于地址同步
SIGNAL ADDR:STD_LOGIC_VECTOR(20 DOWNTO 0); --SRAM的地址产生信号
SIGNAL FLAG:STD_LOGIC;               --溢出标志信号
SIGNAL H: STD_LOGIC;                 --地址的高位,用于SRAM的选择
SIGNAL CNTT: STD_LOGIC_VECTOR(5 DOWNTO 0); --40路的计数
SIGNAL SN1: STD_LOGIC_VECTOR( 2 DOWNTO 0); --7个4051的选择端
SIGNAL SN2: STD_LOGIC_VECTOR( 2 DOWNTO 0); --5个4051的选择端
SIGNAL M:   STD_LOGIC;                    --电机运行的选择信号
SIGNAL N:   STD_LOGIC;        
SIGNAL NUM: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL OUT_DATA_P: STD_LOGIC_VECTOR(7 DOWNTO 0);  --XIUGAI JIARU 4.5
SIGNAL SRAM_CE1_P,SRAM_CE2_P,SRAM_OE_P,SRAM_WR_P:  STD_LOGIC;
 SIGNAL CPLD_CS:STD_LOGIC;                       --CPLD的选通信号
 SIGNAL CPLD_CS_IO:STD_LOGIC;                   
 SIGNAL CPLD_CS_M:STD_LOGIC;
 SIGNAL CPLD_RAMM: STD_LOGIC;
 SIGNAL QQ:STD_LOGIC_VECTOR(2 DOWNTO 0);

 BEGIN
 CPLD_CS<=DSP_IS OR (NOT DSP_A7);
 CPLD_CS_IO<=CPLD_CS OR DSP_RW OR DSP_IOSTRB;
 CPLD_CS_M<=DSP_DS OR DSP_MSTRB OR DSP_RW;
 CPLD_RAMM<=DSP_XF OR DSP_PS OR DSP_MSTRB;
 FLASH_OE<=DSP_MSTRB OR (NOT DSP_RW);
 FLASH_WE<=DSP_MSTRB OR DSP_RW;
 HCE<=DSP_MSTRB OR DSP_XF;
 HOE<=NOT DSP_RW;
 SRAM_CE<=DSP_DS OR DSP_A15;
 FLASH_CE<=DSP_DS OR (NOT DSP_A15);
  --STATE<= S2 & S1;
  ADCLK<=ADCLK_P;                        --根据s2、s1选择状态
  D_CLK<=DCLK_P;
  --SRAM_ADDR<=ADDR;                       --XIUGAI  SHANCHU    4.5 
  SN_DATA<=M & SN1 & M & SN2;
    -- SN1<="0001"; SN2<="0000";             --测试用
adconver: PROCESS(CLK,RESET,FLAG,DSP_XF)                  --AD时钟产生进程
 VARIABLE CNT: STD_LOGIC_VECTOR(5 DOWNTO 0);         --计数进行48分频
 BEGIN
  IF (RESET='0' OR FLAG='1' or DSP_XF='0')  THEN     --复位初始化AD时钟信号、
      ADCLK_P<='0';CNT:="000000";                    --AD片选信号
      ADCE1<='1'; ADCE2<='0';              
      NUM<="00";N<='0';
  ELSE          
     IF CLK'EVENT AND CLK='1'  THEN  
       IF (S2='0') THEN  --00为读卡指令, 01为进纸指令
          IF CNT>"101111"  THEN  CNT:="000001";     --48分频
          ELSE CNT:=CNT+1;
          END IF;
          IF CNT>"011100"  THEN  ADCLK_P<='0';     --产生ADCLK
          ELSE ADCLK_P<='1'; 
          END IF;
          IF NUM>"10" THEN NUM<=NUM; N<='1';     --这里计数用来延时,便于产生DCLK
          ELSE          NUM<=NUM+1;N<='0';
          END IF;  
       ELSE              --10双张指令,11采集完毕
         CNT:="000000";ADCLK_P<='0'; 
         NUM<="00";N<='0'; -- 进纸时间超过1S,停止采集,出错                            
      END IF;              
     END IF;
     ADCE1<='0'; ADCE2<='1';
 END IF;
END PROCESS adconver;
sys: PROCESS(CLK,N)                        --DCLK、PCLK产生进程
  VARIABLE NUMM: STD_LOGIC_VECTOR(6 DOWNTO 0);
  BEGIN
      IF N='0'   THEN   DCLK_P<='0';PCLK<='0';     --信号变量初始化
      ELSIF   CLK'EVENT AND CLK='1'  THEN
          IF NUMM>"1011111"  THEN  NUMM:="0000001";     --96分频
          ELSE NUMM:=NUMM+1;
          END IF;
          IF NUMM>"1001100"  THEN                 --DCLK在数据稳定后出现下降沿
             DCLK_P<='0';PCLK<='1';               --同时产生PCLK信号
          ELSE DCLK_P<='1'; PCLK<='0';
          END IF;
      END IF;
  END PROCESS sys;
int: process(pclk,reset,s2,s1)           --DSP的中断信号产生进程
   begin
  if reset='0' or s2='1'  then     --复位初始化
   cntt<="000000";ready<='0';
  else 
     if pclk'event and pclk='1'  then  
       if  s1='0'  then       
         if cntt<"100111" then            --当计数至40时,产生READY信号
            cntt<=cntt+1; ready<='0';
         else cntt<="000001";  ready<='1';
         end if;
       else cntt<="000000"; ready<='0';
       end if;
     end if;
  end if;
  end process int;
address: PROCESS(RESET,PCLK,S1,S2,IN_DATA)           --地址产生进程
 BEGIN
 H<=ADDR(19);                                --由第20位决定所选SRAM
IF (RESET='0' OR S2='1' )  THEN 
        ADDR<="000000000000000000000";       --复位初始化
        SRAM_CE1_P<='1'; SRAM_CE2_P<='1';
        FLAG<='0';SRAM_WR_P<='1';SRAM_OE_P<='0';
ELSE
  IF PCLK'EVENT AND PCLK='1'  THEN
   -- if CPLD_RAM='1'  then
     IF ( S1='0') THEN                       --读卡指令,采集一行,至40清零
        IF ADDR<"000000000000000110001"  THEN 
           ADDR<=ADDR+1;     
        ELSE ADDR<="000000000000000000000";
        END IF; 
        FLAG<='0';
     ELSIF(s1='1') THEN                     --进纸指令,采集,地址连续递增
        IF ADDR>"011111111111111111111" THEN    --超过1M,溢出
           FLAG<='1';ADDR<="000000000000000000000";
        ELSE ADDR<=ADDR+1;FLAG<='0';
        END IF;
     ELSE ADDR<=(others=>'0');  FLAG<='1';     --出错或者采集完毕,地址清零
     END IF;
     OUT_DATA_P(7 DOWNTO 2)<=IN_DATA(5 DOWNTO 0);
     OUT_DATA_P(1 DOWNTO 0)<="00";
     SRAM_WR_P<='0';SRAM_OE_P<='1';
     IF H='0'  THEN SRAM_CE1_P<='0';SRAM_CE2_P<='1';   --H=0,选择存储器1,
     ELSE    SRAM_CE1_P<='1';  SRAM_CE2_P<='0';        --否则,选择存储器2
     END IF;  
  -- else 
   --  ADDR<="ZZZZZZZZZZZZZZZZZZZZZ";
   --  out_data<="ZZZZZZZZ";SRAM_WR<='Z';
    -- SRAM_CE1<='Z';SRAM_CE2<='Z';SRAM_OE<='Z';
  -- end if;          
   END IF;
 END IF;
END PROCESS address;   
puts:  PROCESS(DSP_XF,SRAM_CE1_P,SRAM_CE2_P,SRAM_OE_P,SRAM_WR_P,ADDR,OUT_DATA_P)
 BEGIN
  IF DSP_XF='1'   THEN 
    SRAM_ADDR<=ADDR;OUT_DATA<=OUT_DATA_P;
    SRAM_CE1<=SRAM_CE1_P;SRAM_CE2<=SRAM_CE2_P;
    SRAM_OE<=SRAM_OE_P;  SRAM_WR<=SRAM_WR_P;
  ELSE 
    SRAM_ADDR<="ZZZZZZZZZZZZZZZZZZZZZ";
    OUT_DATA<="ZZZZZZZZ";SRAM_WR<='Z';
    SRAM_CE1<='Z';SRAM_CE2<='Z';SRAM_OE<='Z';
  END IF;
 END PROCESS puts;
        
drive: PROCESS(RESET,S2,FLAG)            --写信号、电机驱动信号进程
BEGIN
  IF (RESET='0' OR S2='1' OR FLAG='1')  THEN
        M<='1'; 
  ELSE 
        M<='0'; 
  END IF;
  END PROCESS drive;
sn: PROCESS(ADCLK_P,N)          --  4051选择信号进程
    variable aa: std_logic;
    BEGIN
   IF (N='0') THEN 
        SN1<="000";SN2<="000"; aa:='0';
   ELSE   
     IF ADCLK_P'EVENT AND ADCLK_P='1'   THEN
        if aa='0'   then aa:='1';
           IF SN2<"100"   THEN 
              SN2<=SN2+1;  SN1<=SN1;
           ELSE  
             IF SN1<"111"  THEN
               SN1<=SN1+1;
             ELSE SN1<="000";
             END IF;
              SN2<="000"; 
           END IF;  
        elsif aa='1'  then  aa:='0';
            sn2<=sn2;sn1<=sn1;
        end if;
     END IF;
          --SN1<="000";
  END IF;
  END PROCESS sn;
   --CPLD_RAM<=DSP_XF;
 PROCESS(CPLD_RAMM,DSP_A19)
 BEGIN
   IF CPLD_RAMM='0'  THEN
      IF DSP_A19='0'   THEN
             XDC0<='0';XDC1<='1'; 
      ELSE   XDC0<='1';XDC1<='0';
      END IF;
   ELSE XDC0<='1'; XDC1<='1';
   END IF;
 END PROCESS; 
 PROCESS(CPLD_CS_IO,CPLD_CS_M,DSP_D)
 BEGIN
   IF CPLD_CS_IO='0' THEN
       QQ<=DSP_D;
   END IF;
   IF  CPLD_CS_M='0'  THEN
       Q<=QQ;
   END IF;
   END PROCESS;
 END ONE;

⌨️ 快捷键说明

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