|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请各位前辈帮我看看下面的程序…… |
作者:zhoumcu 栏目:EDA技术 |
各位前辈,帮我看看,下面的程序,我刚开始学,想做个简单的音乐程序。基本思路是: clkt:是外部时钟,4Hz,作为时间的基本时钟,以该时钟计数后得到一定的延时 以决定不同的音长 clkf:是外部时钟,3MHZ,作为音高的基本时钟,对该时钟经过分频后得到不同频 率。 PROCESS(clkt)是延时进程 PROCESS(clkf)是音高生成进程 PROCESS(timeok)是延时时间到进程,以改变clkf及clkt的分频数 编译错误为: error:LINE 20: file e:\TEMP\eda\sound_my\sound.vhd: bounds of non-constant index addressing array reaches beyond the bounds of the array library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity sound is PORT( clkt,clkf: in std_logic; spk: out std_logic ); end sound; architecture behave of sound is type mnum is array (0 to 7) of integer range 0 to 255; signal fnum,tnum: mnum; signal f,t: integer range 0 to 8 :=0; signal fTEMP,tTEMP: integer range 0 to 255 := 0; signal timeok : std_logic; begin PROCESS(clkt) begin if rising_edge(clkt) then tTEMP <= tTEMP + 1; if (tTEMP = tnum(t)) then timeok <= timeok xor '1'; tTEMP <= 0; end if; end if; end PROCESS; PROCESS(clkf) variable spkTEMP: std_logic; begin if rising_edge(clkf) then fTEMP <= fTEMP + 1; if fTEMP = fnum(f) then spkTEMP := spkTEMP xor '1'; fTEMP <= 0; end if; end if; spk <= spkTEMP; end PROCESS; PROCESS(timeok) begin f <= f +1; t <= t +1; if t = 8 then t <= 0; end if; if f = 8 then f<= 0; end if; end PROCESS; fnum(0) <= 10#20#; fnum(1) <= 10#50#; fnum(2) <= 10#70#; fnum(3) <= 10#90#; fnum(4) <= 10#30#; fnum(5) <= 10#9#; fnum(6) <= 10#197#; fnum(7) <= 10#23#; tnum(0) <= 10#10#; tnum(1) <= 10#2#; tnum(2) <= 10#1#; tnum(3) <= 10#2#; tnum(4) <= 10#4#; tnum(5) <= 10#5#; tnum(6) <= 10#7#; tnum(7) <= 10#1#; end behave; |
2楼: | >>参与讨论 |
作者: gao827 于 2005/5/7 12:16:00 发布:
你的fnum,tnum是array(0 to 7),而f和t的取值范围为0 to 8 当f,t = 8的时候就超出范围了 |
3楼: | >>参与讨论 |
作者: zhoumcu 于 2005/5/7 19:48:00 发布:
很感谢,不过有另外的问题了 谢谢gao827,不过,现在有62个错误,其中的一个是: node "fnum4_1" missing source 其余61个错误和这个差不多。错误指向 singal fnum,tnum :mnum;该句。 |
4楼: | >>参与讨论 |
作者: qjc.j 于 2005/5/7 20:01:00 发布:
也帮我一下 MODULE hu (clk,data_out,control_out); input clk; OUTPUT[3:0] data_out; OUTPUT[2:0] control_out; reg[3:0] data_out; reg[2:0] control_out; reg[4:0] temp_1,temp_2,temp_3,temp_4,temp_5,temp_6,temp_7,temp_8; reg[7:0] count; reg[19:0] count_0; always @(posedge clk) begin count=count+1; if(count==255) begin count=0; control_out=control_out+1; if(control_out==3'b000) #10 data_out=temp_1; if(control_out==3'B001) #10 data_out=temp_2; if(control_out==3'B010) #10 data_out=temp_3; if(control_out==3'b011) #10 data_out=temp_4; if(control_out==3'B100) #10 data_out=temp_5; if(control_out==3'B101) #10 data_out=temp_6; if(control_out==3'B110) #10 data_out=temp_7; if(control_out==3'b111) #10 data_out=temp_8; end end endMODULE 问题是编译一半时就不行了, Error: Nide '76.IN2'missing soure Error: Nide '77.IN2'missing soure ...... ...... ...... Error: Nide '161.IN2'missing soure Error: Nide '162.IN2'missing soure Error: Nide '163.IN2'missing soure 那位前辈给解释一下. |
5楼: | >>参与讨论 |
作者: gao827 于 2005/5/7 20:42:00 发布:
说一下qjc.j的问题 这个程序问题太多了。 首先你的Error是因为你的temp_1~8这几个变量都是没有赋值的,它们既不是输入,你的程序理由从没给他们赋值过,当然是sourceless的。 其次你的程序用延迟#10,这是不可综合的,如果你做testbench还可以; 然后时序逻辑没有复位,count没有初始值; 然后你所有的赋值都是用的阻塞赋值,这样程序就乱套了;举例来说:如果count=254,count=count+1这句之后count立即变成255,然后进入if块中count又被立即赋值为0,这样count这个信号就出来一个毛刺,而且这个逻辑肯定不是你想要得,功能完全乱了。 接下来这么多的if其实应该用case语句来实现。if在综合的时候是有优先级的,排在前面的优先级就高,而case没有,所以它两个综合出来的逻辑是不一样的。 总之,还是要好好看看书再动手时,可能效率会高一些。 |
6楼: | >>参与讨论 |
作者: gao827 于 2005/5/7 20:44:00 发布:
to: zhoumcu 抱歉VHDL我没用过,没法回答你 |
7楼: | >>参与讨论 |
作者: qjc.j 于 2005/5/8 16:12:00 发布:
多谢 gao827 我用的MAX-plus II 不支持 好多命令,我也用Quartus 4.2 编译过,但是不知道怎样用它下载的.请教gao827用Quartus 4.2怎样下载程序的. |
8楼: | >>参与讨论 |
作者: 84082379 于 2005/5/9 20:15:00 发布:
给他植就可以了 |
9楼: | >>参与讨论 |
作者: 84082379 于 2005/5/9 20:44:00 发布:
fnum tnum 有问题 |
10楼: | >>参与讨论 |
作者: qjc.j 于 2005/5/11 20:03:00 发布:
多谢 gao827前辈 再问一下是 Quartus 好用还是 MAX-plus II 好用. |
11楼: | >>参与讨论 |
作者: wuzm02 于 2005/5/11 23:05:00 发布:
谁有Quartus 4.2,能否分享一下? 谁有Quartus 4.2,能否分享一下? thanks all the same; |
12楼: | >>参与讨论 |
作者: gao827 于 2005/5/12 14:39:00 发布:
to qjc.j 抱歉,ALTERA的工具我没用过,只用过XILINX和LATTICE的,你另发个帖子问问吧。 |
13楼: | >>参与讨论 |
作者: qjc.j 于 2005/5/12 16:07:00 发布:
多谢 gao827前辈 多谢您的支持.我会继续努力的. |
14楼: | >>参与讨论 |
作者: qjc.j 于 2005/5/12 16:15:00 发布:
wuzm02 QQ;50427587 |
15楼: | >>参与讨论 |
作者: delli 于 2005/5/13 20:31:00 发布:
gao827说的很好啊,补充一下 case也是有优先级的,用SELECT. |
16楼: | >>参与讨论 |
作者: Lyang03 于 2005/5/14 19:16:00 发布:
请问case的优先级别是什么样的呀? |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |