zoukankan      html  css  js  c++  java
  • CPLD被STM32读写VHDL程序

      1  
      2 
      3 --本程序用来测试STM32对CPLD的读写操作
      4 
      5 --测试功能如下:
      6 
      7 --向0x05地址写入0x01,LED灯停止闪烁,写入其他数据闪烁继续
      8 
      9 --0x03,0x04寄存器为定值,可以通过STM32读取然后使用串口输出看看是否一致
     10 
     11  
     12 
     13 --文件名:AD.vhd
     14 
     15 library ieee;
     16 
     17 use ieee.std_logic_1164.all;
     18 
     19 use ieee.std_logic_unsigned.all;
     20 
     21  
     22 
     23 entity AD is
     24 
     25 port(
     26 
     27 -- 系统信号线
     28 
     29     CLK:         in      std_logic;
     30 
     31 LED: out std_logic;
     32 
     33 -- ARM相连的信号线
     34 
     35     Adr_L:       in      std_logic_vector(7 downto 0); --A7...A0,只使用了低八位地址线
     36 
     37     D:           inout   std_logic_vector(7 downto 0); --只使用了低八位数据线
     38 
     39     FSMC_NE4:    in      std_logic;  
     40 
     41     FSMC_NOE:    in      std_logic;
     42 
     43     FSMC_NWE:    in      std_logic
     44 
     45 );
     46 
     47 end AD;
     48 
     49  
     50 
     51 architecture art of AD is
     52 
     53 --设置存储数据的寄存器
     54 
     55 signal AD0_H_data,AD0_L_data,AD1_H_data,AD1_L_data,LED_ctrl:  std_logic_vector(7 downto 0); 
     56 
     57 --数据缓冲寄存器
     58 
     59 signal data_buf: std_logic_vector(7 downto 0);
     60 
     61 --数据输出控制
     62 
     63 signal data_outctl: std_logic;
     64 
     65 signal datacnt:integer range 0 to 4000000;--分频计数
     66 
     67 --LED闪烁使能
     68 
     69 signal LED_flag: std_logic;
     70 
     71  
     72 
     73  
     74 
     75 --统一编址,地址线数据线为八位,每个地址数据宽度8位
     76 
     77 --"00000001" AD0_H_data0x01
     78 
     79 --"00000010" AD0_L_data0x02
     80 
     81 --"00000011" AD1_H_data0x03
     82 
     83 --"00000100" AD1_L_data0x04
     84 
     85 --"00000101" LED_ctrl0x05
     86 
     87  
     88 
     89 begin
     90 
     91  
     92 
     93 AD1_H_data <="10100001";
     94 
     95 AD1_L_data <="00010001";
     96 
     97 --LED 闪烁,用作CPLD运行指示
     98 
     99  
    100 
    101 process(LED_ctrl) is
    102 
    103 begin
    104 
    105 if(LED_ctrl="00000001") then
    106 
    107 LED_flag <= '0';
    108 
    109 else
    110 
    111 LED_flag <= '1';
    112 
    113 end if;
    114 
    115 end process;
    116 
    117  
    118 
    119 process(CLK)is
    120 
    121 begin
    122 
    123  
    124 
    125  
    126 
    127 if(CLK'event and CLK='1') then
    128 
    129 if(LED_flag='1') then
    130 
    131 datacnt<=datacnt+1;
    132 
    133 if (datacnt>2000000) then
    134 
    135 LED <= '1';
    136 
    137 end if;
    138 
    139 if (datacnt>=4000000) then
    140 
    141 LED <='0';
    142 
    143 datacnt <=0;
    144 
    145 end if;
    146 
    147 end if;
    148 
    149 end if;
    150 
    151 end process;
    152 
    153  
    154 
    155 --当读取CPLD数据时用来判断何时向总线上输出数据
    156 
    157 data_outctl <= (not  FSMC_NE4) and (not FSMC_NOE) and (FSMC_NWE);  
    158 
    159 D <=  data_buf when (data_outctl='1') else "ZZZZZZZZ";--向数据线输出数据,否则保持为高阻态
    160 
    161  
    162 
    163 -- 写操作,模式1,时序图在数据手册P331
    164 
    165 process(FSMC_NE4,FSMC_NWE,Adr_L,FSMC_NOE) is  --,FSMC_NBL,D,RESET
    166 
    167 begin
    168 
    169 if(FSMC_NWE'event and FSMC_NWE='1') then
    170 
    171 if((FSMC_NOE and (not FSMC_NE4))='1') then
    172 
    173 case (Adr_L) is
    174 
    175 when "00000001" =>  
    176 
    177 AD0_H_data<= D; --0x01
    178 
    179 when "00000010" =>  
    180 
    181 AD0_L_data<= D; --0x02
    182 
    183 when "00000101" =>  
    184 
    185 LED_ctrl<= D;--0x05
    186 
    187 when others =>
    188 
    189 AD0_H_data<= AD0_H_data;
    190 
    191 AD0_L_data<= AD0_L_data;
    192 
    193 end case;
    194 
    195 end if;
    196 
    197 end if;
    198 
    199 end process;
    200 
    201  
    202 
    203 --读操作,模式1,P331
    204 
    205 process(FSMC_NE4,FSMC_NWE,Adr_L,FSMC_NOE) is 
    206 
    207 begin
    208 
    209 if(FSMC_NOE='0' and FSMC_NOE'event) then --直接在NOE的下降沿更新数据
    210 
    211 case (Adr_L) is
    212 
    213 when "00000001" =>   
    214 
    215 data_buf <= AD0_H_data; --0x01
    216 
    217 when "00000010" =>  
    218 
    219 data_buf <= AD0_L_data; --0x02
    220 
    221 when "00000011" =>  
    222 
    223 data_buf <= AD1_H_data; --0x03
    224 
    225 when "00000100" => 
    226 
    227 data_buf <= AD1_L_data; --0x04
    228 
    229 when others =>  data_buf <= "ZZZZZZZZ";
    230 
    231 end case; 
    232 
    233 end if;
    234 
    235 end process;
    236 
    237 end;
    238 
    239  
    240 
    241  
    242 
    243  
    ★emouse 思·睿博客文章★ 原创文章转载请注明:http://emouse.cnblogs.com
  • 相关阅读:
    Android,资料分享(2015 版)
    Http请求与响应
    SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解
    ORA-14402: 更新分区关键字列将导致分区的更改
    Android Service的生命周期
    Android Service基础
    Android Intent 基本使用及对象构成
    Sublime Text3 个人使用心得
    深入了解line-height
    overflow之锚点技术实现选项卡
  • 原文地址:https://www.cnblogs.com/emouse/p/2198178.html
Copyright © 2011-2022 走看看