开发者社区> 文艺小青年> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

CPLD 与AVR通信 PWM控制程序

简介:
+关注继续查看
复制代码
  1 library ieee;
  2 
  3 use ieee.std_logic_1164.all;
  4 
  5 use ieee.std_logic_arith.all;
  6 
  7 use ieee.std_logic_unsigned.all;
  8 
  9  
 10 
 11 entity KBCtest is
 12 
 13 port(
 14 
 15 rst,clk:instd_logic;--时钟和复位信号
 16 
 17 --AVR 读写相关信号线
 18 
 19 ale,rd,wr:instd_logic;--地址锁存、读、写信号
 20 
 21 ad:inoutstd_logic_vector(7 downto 0);--地址数据信号线
 22 
 23 
 24 
 25 --指示灯
 26 
 27 led1,led2:outstd_logic;
 28 
 29 
 30 
 31 --PWM
 32 
 33 pwm1,pwm2:outstd_logic
 34 
 35 
 36 
 37 --放大增益控制
 38 
 39 
 40 
 41 --AD8364读写操作信号线
 42 
 43 );
 44 
 45 end KBCtest;
 46 
 47  
 48 
 49 architecture art of  KBCtest is
 50 
 51 ------------------------------------------------全局信号定义-------------------------------------------------------------------
 52 
 53 --AVR访问操作相关信号
 54 
 55 signal adr:   std_logic_vector(7 downto 0);  --地址寄存器
 56 
 57 signal data_buf:   std_logic_vector(7 downto 0);
 58 
 59 signal data_outctl:std_logic;
 60 
 61  
 62 
 63  
 64 
 65 --pwm部分相关寄存器定义 寄存器暂时定义为8位
 66 
 67 signal pwmfreq_reg:std_logic_vector(7 downto 0);
 68 
 69 signal pwmocr1_reg:std_logic_vector(7 downto 0);
 70 
 71 signal pwmocr2_reg:std_logic_vector(7 downto 0);
 72 
 73  
 74 
 75 signal pwm_cnt:std_logic_vector(7 downto 0);
 76 
 77  
 78 
 79 --时钟分频相关变量
 80 
 81 signal clkcnt:std_logic_vector(16 downto 0);
 82 
 83 signal adc_clk:std_logic;--ADC时钟信号
 84 
 85 signal pwm_clk:std_logic;--pwm时钟信号
 86 
 87  
 88 
 89 --led指示相关变量
 90 
 91 signal led_clk:std_logic;--led时钟信
 92 
 93 signal led1_cnt:std_logic_vector(7 downto 0);
 94 
 95 signal led2_cnt:std_logic_vector(7 downto 0);
 96 
 97 signal led1s:std_logic;
 98 
 99 signal led2s:std_logic;
100 
101 
102 
103 begin
104 
105  
106 
107 ------------------------------------------------时钟分频-------------------------------------------------------------------
108 
109 process(rst,clk) is
110 
111 begin
112 
113 if rst='0' then
114 
115 clkcnt <= "00000000000000000";
116 
117 elsif(clk'event and clk = '1') then
118 
119 if(clkcnt = "11111111111111111") then
120 
121 clkcnt<= "00000000000000000";
122 
123 else
124 
125 clkcnt <= clkcnt+1;
126 
127 end if;
128 
129 end if;
130 
131 end process;
132 
133 pwm_clk <= clkcnt(7);--分频PWM时钟
134 
135 led_clk <= clkcnt(16);--分频LED时钟
136 
137  
138 
139 ------------------------------------------------AVR访问操作----------------------------------------------------------------
140 
141 data_outctl <= (not ale) and (not rd) and (wr);
142 
143 ad <=  data_buf when (data_outctl='1') else "ZZZZZZZZ";
144 
145  
146 
147 --锁存AVR地址数据
148 
149 process(rst,ale) is
150 
151 begin
152 
153 if rst='0' then 
154 
155 adr <= "00000000";
156 
157 elsif(ale'event and ale='0') then--在ale信号的下降沿锁存地址数据
158 
159 adr <= ad;
160 
161 end if;
162 
163 end process;
164 
165  
166 
167 -------------------------------------AVR写数据-----------------------------------
168 
169 process(rst,wr,ale) is
170 
171 begin
172 
173 if rst='0' then--对各寄存器给定初值
174 
175 pwmfreq_reg<="11111111";
176 
177 pwmocr1_reg<="10000000";
178 
179 elsif (wr='1' and wr'event) then--在wr信号上升沿进行写操作
180 
181 if ale = '0' then 
182 
183 case adr is
184 
185 when "00000001" =>pwmfreq_reg<=ad;
186 
187 when "00000010" =>pwmocr1_reg<=ad;
188 
189  
190 
191 when others =>
192 
193 pwmfreq_reg <= pwmfreq_reg;
194 
195  
196 
197 end case;
198 
199 end if;
200 
201 end if;
202 
203 end process;
204 
205  
206 
207 ------------------------------------AVR读数据-------------------------------------
208 
209 process(rst,rd,ale) is
210 
211 begin
212 
213 if rst='0' then
214 
215 data_buf<="00000000";
216 
217 elsif (rd='0'and rd'event) then
218 
219 case adr is
220 
221 when "00000001" => data_buf <=pwmfreq_reg;
222 
223 when "00000010" => data_buf <=pwmocr1_reg;
224 
225 when "00000011" => data_buf <="00110011";
226 
227 when others => 
228 
229 data_buf <= "ZZZZZZZZ";
230 
231 end case;
232 
233 end if;
234 
235 end process;
236 
237 ------------------------------------LED指示-------------------------------------
238 
239 process(led_clk)is
240 
241 begin
242 
243 if(led_clk'event and led_clk='1') then
244 
245 led1_cnt <= led1_cnt+1;
246 
247 if (led1_cnt >=pwmfreq_reg) then
248 
249 led1s <= NOT led1s; 
250 
251 led1_cnt <="00000000";
252 
253 end if;
254 
255 end if;
256 
257 end process;
258 
259 led1<=led1s;
260 
261 process(led_clk)is
262 
263 begin
264 
265 if(led_clk'event and led_clk='1') then
266 
267 led2_cnt <= led2_cnt+1;
268 
269 if (led2_cnt >=pwmocr1_reg) then
270 
271 led2s <= NOT led2s; 
272 
273 led2_cnt <="00000000";
274 
275 end if;
276 
277 end if;
278 
279 end process;
280 
281 led2<=led2s;
282 
283  
284 
285 --------------------------------------PWM---------------------------------------
286 
287 process(pwm_clk) is
288 
289 begin
290 
291 if rst='0' then             
292 
293 pwm_cnt<="00000000";
294 
295 elsif(pwm_clk'event and pwm_clk='1') then
296 
297 if(pwm_cnt > pwmfreq_reg) then
298 
299 pwm_cnt <= "00000000";
300 
301 else  
302 
303 pwm_cnt<=pwm_cnt+1;
304 
305 end if;
306 
307 
308 
309 --数据比较模块
310 
311 if(pwm_cnt>=pwmocr1_reg) then  
312 
313 pwm1<= '1';
314 
315 else 
316 
317 pwm1<= '0';
318 
319 end if;
320 
321 end if;
322 
323 end process;
324 
325 end;
326 
327  
复制代码
本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2011/03/23/2198167.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示
编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示
47 0
Java中UDP通信连接实现
TCP与UDP的主要区别: TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。
1262 0
AWS系列之二 使用EC2
在本文中我们有三个任务。 第一:使用Amazon management console创建一个EC2实例。 第二:使用本地的命令行工具远程登陆到该EC2实例。 第三:在该EC2实例上创建一个web服务,并通过公共域名来访问该web服务。
1059 0
【IBM Tivoli Identity Manager 学习文档】5 管理员控制台
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 我们看看TIM管理员控制台的一些特性,并对某些特性进行详细介绍。 1.方便的导航条 2.支持多任务的Task Manager 3.搜索的时候支持Fliter进行条件遴选 4.方便的表单设计 5.使用Wizards可以使user完成一个操作序列。
906 0
VC增加应用程序图标到系统托盘
 文对如何将应用程序的图标加入到Windows的系统托盘中做了较为详细的介绍,   然后给出了一个C++类以方便的实现该功能,并在VC++6.0中给出了一个应用程序   实例来体现其具体实现过程。
1037 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载