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

📄 ceshi3.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  Ceshi3 IS
PORT( DSP_XF1:      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 Ceshi3;
ARCHITECTURE ONE OF Ceshi3 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;
BEGIN
  --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_XF1)                  --AD时钟产生进程
 VARIABLE CNT: STD_LOGIC_VECTOR(5 DOWNTO 0);         --计数进行48分频
 BEGIN
  IF (RESET='0' OR FLAG='1' or DSP_XF1='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   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在数据稳定后出现下降沿
             PCLK<='1';               --同时产生PCLK信号
          ELSE  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)           --地址产生进程
 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 ( 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;  
       
   END IF;
 END IF;
END PROCESS address;   
puts:  PROCESS(DSP_XF1,SRAM_CE1_P,SRAM_CE2_P,SRAM_OE_P,SRAM_WR_P,ADDR,OUT_DATA_P)
 BEGIN
  IF DSP_XF1='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;
       
 END ONE;

⌨️ 快捷键说明

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