请指教:vhdl语言编写的蜂鸣器发生模块。仿真结果不正确。

[复制链接]
 楼主| f4335089 发表于 2009-7-9 22:07 | 显示全部楼层 |阅读模式
正个程序是想通过对时钟分频,再预置控制信号tone1来达到使spks输出频率信号,让蜂鸣器发出不同的声音。<br />&nbsp;程序:<br />library&nbsp;ieee;<br />use&nbsp;ieee.std_logic_1164.all;<br />entity&nbsp;speaker&nbsp;is&nbsp;<br />&nbsp;port(clk1:in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tone1:&nbsp;in&nbsp;integer&nbsp;range&nbsp;0&nbsp;to&nbsp;16#7ff#;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spks:out&nbsp;std_logic);&nbsp;<br />end;<br />&nbsp;architecture&nbsp;one&nbsp;of&nbsp;speaker&nbsp;is<br />&nbsp;signal&nbsp;preclk:std_logic;<br />&nbsp;signal&nbsp;fullspks:&nbsp;std_logic;<br /><br />&nbsp;begin<br />&nbsp;&nbsp;divedeclk:process(clk1)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;variable&nbsp;count4:integer&nbsp;range&nbsp;0&nbsp;to&nbsp;15;&nbsp;<br />&nbsp;begin<br />&nbsp;&nbsp;preclk&lt='0';<br />&nbsp;&nbsp;if&nbsp;count4&gt11&nbsp;then&nbsp;preclk&lt='1';count4:=0;<br />&nbsp;&nbsp;elsif&nbsp;clk1'event&nbsp;and&nbsp;clk1='1'then&nbsp;count4:=count4+1;<br />&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;genspks:process(preclk,tone1)<br />&nbsp;&nbsp;&nbsp;&nbsp;variable&nbsp;count11:integer&nbsp;range&nbsp;0&nbsp;to&nbsp;16#7ff#;<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;preclk'event&nbsp;and&nbsp;preclk='1'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;count11=16#7ff#&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count11:=tone1;&nbsp;fullspks&lt='1';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;count11:=count11+1;fullspks&lt='0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;delayspks:process(fullspks)<br />&nbsp;&nbsp;&nbsp;&nbsp;variable&nbsp;count2:std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;fullspks'event&nbsp;and&nbsp;fullspks='1'&nbsp;then&nbsp;count2:=not&nbsp;count2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;count2='1'&nbsp;then&nbsp;spks&lt='1';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;spks&lt='0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;end;<br /><br />&nbsp;现在程序编译正确但是结果不符合设计。&nbsp;<br />1.&nbsp;求教这个设计中divedeclk这个过程中输出的结果不对&nbsp;为什么?<br />&nbsp;2.&nbsp;count4到八就跳到零了,而且还不是执行的加一。<br />3.&nbsp;&nbsp;spks始终是0,无法实现要求&nbsp;。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;求高手指点,不胜感激。&nbsp;现在在做全国电子设计大赛,希望有专业人士能指点。qq:250318261&nbsp;
jinfengmusic 发表于 2009-7-19 20:04 | 显示全部楼层

没有看明白!

老兄,我们的程序风格很重要啊!咱们一起学习吧!
patrick007 发表于 2009-7-19 20:32 | 显示全部楼层

re

基本全部需要改写。<br /><br />找本好书,重点看看,<br />计数器的写法。<br />信号,变量在不同位置赋值产生的隐含dff。<br />用process实现&nbsp;时序,组合逻辑器件时,&nbsp;敏感列表&nbsp;的差别。<br /><br /><br />网上也有**,这三个问题看明白了,你这个东西就做好了(第二行或许可以先不考虑,你这个东西可能对时序不是太敏感)。<br />
jinfengmusic 发表于 2009-7-19 20:35 | 显示全部楼层

一起学习

以下是楼主修改后的程序,在下稍微编辑了一下,大家共享。<br />library&nbsp;ieee;<br />use&nbsp;ieee.std_logic_1164.all;<br />use&nbsp;ieee.std_logic_unsigned.all;<br /><br />entity&nbsp;speaker&nbsp;is&nbsp;<br />&nbsp;port(clk1:in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tone1:&nbsp;in&nbsp;std_logic_vector(10&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spks:out&nbsp;std_logic<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;<br />end&nbsp;speaker;<br /><br />architecture&nbsp;one&nbsp;of&nbsp;speaker&nbsp;is<br />signal&nbsp;preclk:std_logic;<br />signal&nbsp;fullspks:&nbsp;std_logic;<br />begin<br /><br />&nbsp;&nbsp;divedeclk:process(clk1)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;variable&nbsp;count4:std_logic_vector(3&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(clk1'event&nbsp;and&nbsp;clk1='1')&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;count4=&quot;1111&quot;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preclk&lt='0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count4:=count4+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif&nbsp;count4&gt&quot;0111&quot;&nbsp;then&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preclk&lt='1';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count4:=count4+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count4:=count4+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;end&nbsp;process;<br /><br />&nbsp;&nbsp;genspks:process(preclk,tone1)<br />&nbsp;&nbsp;variable&nbsp;count11:std_logic_vector(10&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(preclk'event&nbsp;and&nbsp;preclk='1')&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;count11=&quot;11111111111&quot;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count11:=tone1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fullspks&lt='1';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count11:=count11+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fullspks&lt='0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;end&nbsp;process;<br /><br />&nbsp;&nbsp;delayspks:process(fullspks)<br />&nbsp;&nbsp;variable&nbsp;count2:std_logic;<br />&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fullspks'event&nbsp;and&nbsp;fullspks='1')&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count2:=not&nbsp;count2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;count2='1'&nbsp;then&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spks&lt='1';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spks&lt='0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;end&nbsp;process;<br />end&nbsp;one;<br /><br /><br />还有很多不完美的地方,望大家共同讨论,共同进步!
 楼主| f4335089 发表于 2009-7-19 20:41 | 显示全部楼层

已解决

谢谢大家关注&nbsp;&nbsp;经检查是由于第一个过程中程序代码与设想不一致导致,以后我会注意程序的写法&nbsp;,&nbsp;给帮我的人说句谢谢!!
patrick007 发表于 2009-7-20 09:35 | 显示全部楼层

re

目前的这个可能比你需要的东西“大”一点点。。。。。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

4

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部