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

📄 abc.txt

📁 文中给出了cPLD与单片机的串行通信的C语言代码与VHDL代码有一定的使用价值
💻 TXT
📖 第 1 页 / 共 2 页
字号:
entity bc is 
port(en1:in std_logic;
     datain:in std_logic_vector(7 downto 0);
     dataout:out std_logic_vector(7 downto 0));
end bc;
architecture des of bc is
signal a:std_logic_vector(7 downto 0);
begin
process(en1)
begin
if en1'event and en1='1'  then
  a<=datain;
else 
  a<=a;
end if;
end process;
  dataout<=a;
end des;
%%-----------MIAOSD(并串变换)-------------------%%
use ieee.std_logic_1164.all;
entity miaosd is
port(clk:in std_logic;
     a:in std_logic_vector(7 downto 0);
en0:out std_logic;      ---------nWait信号
en1:out std_logic;      --------控制进入MIAOSD处理部分的待处理信号
dataout:out std_logic   ---------串行信号输出
);
end miaosd;
architecture des of miaosd is 
begin 
process(clk)
variable c:integer range 0 to 11;
begin
if clk'event and clk='1' then
 if c=0 then
  c:=c+1;dataout<=a(0);en0<='1';en1<='0'; 
  elsif c=1 then
  c:=c+1;dataout<=a(1);en0<='1';en1<='0'; 
  elsif c=2 then
  c:=c+1;dataout<=a(2);en0<='1';en1<='0'; 
  elsif c=3 then
  c:=c+1;dataout<=a(3);en0<='1';en1<='0'; 
  elsif c=4 then
  c:=c+1;dataout<=a(4);en0<='1';en1<='0'; 
 elsif c=5 then
  c:=c+1;dataout<=a(5);en0<='1';en1<='0'; 
elsif c=6 then 
  c:=c+1;dataout<=a(6);en0<='1';en1<='0'; 
elsif c=7 then
 c:=8;dataout<=a(7);en0<='1';en1<='0'; 
elsif c=8 then
 c:=9;dataout<='0';en0<='1';en1<='0'; 
elsif c=9 then
 c:=10;dataout<='0';en0<='0';en1<='0'; 
elsif c=10 then
 c:=11;dataout<='0';en0<='1';en1<='1'; 
elsif c=11 then
 c:=0;dataout<='1';en0<='1';en1<='0';
else
 dataout<='0';en0<='1';en1<='0'; 
end if;
end if;
end process;
end des;
%%------------------receiver1串并转换------------------------%%
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;

ENTITY receiver IS
	PORT (clk    : IN  std_logic;
          sdata  : IN  std_logic;   ----串行输入信号
          readn  : out std_logic;    ----控制PC机读取数据的信号
        pdata  : out std_logic_vector(7 downto 0) ----并行信号输出
);
END receiver;

ARCHITECTURE des OF receiver IS
signal mmid           :std_logic;
signal midstate       :std_logic;
signal midpdata       :std_logic_vector(7 downto 0);
signal midcnt         :std_logic_vector(3 downto 0);
signal middcnt        :std_logic_vector(3 downto 0);
signal midscnt        :std_logic_vector(3 downto 0);
signal midsdata       :std_logic;
begin
A: process(clk)      ------2分频
Begin             
if(clk='1' and clk'event) then
   mmid<=not mmid;
 else
   mmid<=mmid;
end if;
end process A;
B: process(mmid,sdata)    -------串并处理部分
begin
if sdata='1' and midstate='1' then
  midstate<='0';
  midcnt<="0000";
  readn<='1';
  midpdata<="00000000";
  midscnt<="0000";
else  
  if(mmid='1' and mmid'event) then
     if midstate='0' then
         if midcnt<"1011" then
           if middcnt<="1000" then
             middcnt<=middcnt+'1';
             midscnt<=midscnt+sdata;
           else
             middcnt<="0000";
             midcnt<=midcnt+'1';
             if midcnt="1010" then
                pdata<=midpdata;
             end if;
             if midscnt<"0111" then
               midsdata<='0';
             else
               midsdata<='1';
             end if; 
           if midcnt<="1001" then
               midscnt<="0000";
               midpdata<=midpdata(6 downto 0) & midsdata;
           end if;
           end if;
        else
           midcnt<="1111";
           midstate<='1';
           readn<='0';
        end if;
     end if;
  end if;
end if;
end process B;
END des;

用CPLD产生等待时序
    TMS320C2X支持与慢速外设接口的硬件等待状态插入。当与慢速外设接口时,系统必须提供能产生等待状态的硬件电路。外设存取的速度越慢,所需插入的等待状态数量就越多。那么,如何根据外设存取速度来确定所需的等待数可以由下式确定:
设t为外设访问时间
TMS32020        [200(N-1)+85]ns<ta<[200N+85]ns
TMS320C25-40    [100(N-1)+40]ns<ta<[100N+40]ns
TMS320C25-50    [80(N-1)+29]ns<ta<[80N+29]ns
假设设计的系统在访问程序空间时需要加入两个等待,I/O空间和数据空间则是全速。用VHDL语言描述如下:
-- generate wait state for low speed interface
 g_wait_prog:
 PROCESS (clockout, reset)
 BEGIN
  IF ((res_cpu = 0) or (ps = 1))THEN
                progwaitclock <= 0;
  ELSIF (clockoutEVENT AND clockout= 0) THEN
   IF (ps = 0) THEN
    IF progwaitclock = 2 THEN
     progwaitclock <= 0;
    ELSE
     progwaitclock <= progwaitclock + 1;
    END IF;
   ELSE
   progwaitclock <= progwaitclock ;
   END IF;
  END IF;
 END PROCESS g_wait_prog;
-- generate ready signal
 PROCESS
 BEGIN
  IF ((progwaitclock = 0)and(lcdwaitclock = 0)) THEN
   ready <= 1;
  ELSE
   ready <= 0;
  END IF;
 END PROCESS ;
    Clockout为CPU的时钟输出信号,信号量progwaitclock是用来计数clockout的个数,当CPU访问程序空间时,PS为低电平, progwaitclock开始计数,当progwaitclock的值不为0时ready为高,CPU等待外部设备就绪,当progwaitclock 计数到要等待的个数时,progwaitclock复位为零,ready变为低,CPU等待结束。
    用CPLD实现存储器接口
    存储器接口包括ROM接口和RAM接口两种。ROM主要指PROM和EPROM,而RAM主要是静态RAM(SRAM)。设计存储器接口时主要考虑到存储器速度,以确定需要插入几个等待状态,同时还要考虑到地址译码,地址空间分配的问题。

1 快速PROM/EPROM接口
    快速PROM/EPROM(存取时间 35ns)可直接和TMS320C2××接口而不用加入等待,但要考虑到地址译码的问题。

2 慢速EPROM/EEPROM/FLASH MEMORY的接口
    对于慢速器件,在和DSP这种较快的处理器接口的时候要加入合适的等待周期,同时还要考虑地址译码的问题。

3 快速SRAM接口
    TMS320C2××既可将SRAM用作程序存储器,也可用作数据存储器。不管是程序空间还是数据空间,它都只要考虑译码的问题,用正确的线片选即可,如程序空间用PS片选,而数据空间用DS片选。

4 程序和数据公用SRAM
    在很多时候,为了方便调试不但要扩展程序SRAM也要扩展数据SRAM。因为TMS320C2××分别用PS和DS来选程序和数据空间,所以一般的做法是用PS和DS分别片选不同的芯片,为了使DSP有足够的程序和地址空间,我们需要多片存储器芯片,这样,会给PCB布线的时候带来很大的麻烦。因为采用了 CPLD来进行译码,我们可以很方便的用一块容量较大的SRAM,通过合适的译码电路使它的空间能分开,既有程序空间又有数据空间。下以CY7C1024 -15为例来说明:
-- ram address allocation.
-- pro_data = 1 means select 8000H--ffffH(data);
-- pro_data = 0 means select 0000H--7fffH(program);
 PROCESS (ds,ps)
  BEGIN
   IF((strb= 0)and(ds = 1)and(ps = 0)) THEN
    pro_data <= 0;
   ELSIF((strb= 0)and(ds = 0)and(ps = 1))  THEN
    pro_data <= 1;
   ELSE
    pro_data <= 0;
   END IF;
 END PROCESS;
-- ram control line.
 control:
 PROCESS (we, w/r, ps, ds, ios, br, strb)
 BEGIN
  IF strb = 0 THEN
   IF ((ds = 1)and(ps = 0))or((ds = 1)and(ps = 0)) THEN
       ram_cs <= 0;
       ram_w/r <= w/r;
       ram_oe <= we;
    ELSE
       ram_cs <=  1;
       ram_w/r <= 1;
    ram_oe <= 1;
   END IF;
  ELSE
      ram_cs <= 1;
      ram_w/r <= 1;
   ram_oe <= 1;
  END IF;
    CY7C1021是Cypress公司生产的64k×16bit Static RAM,以上程序要完成的功能是让一块芯片的64k空间中的低端32k为程序空间,另外32k为数据空间。程序中的pro_data接CY7C1021的最高位地址线A15,当ps为低时pro_data为低电平,选中RAM的低32k空间,当ds为低时pro_data为高电平,选中RAM的高32k空间,ram_cs、ram_w/r、ram_oe分别接CY7C1021的片选、读、写线。

⌨️ 快捷键说明

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