登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | 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
你的fnum,tnum是array(0 to 7),而f和t的取值范围为0 to 8
当f,t = 8的时候就超出范围了

3楼: >>参与讨论
zhoumcu
很感谢,不过有另外的问题了
谢谢gao827,不过,现在有62个错误,其中的一个是:
node "fnum4_1" missing source
其余61个错误和这个差不多。错误指向
singal fnum,tnum :mnum;该句。


4楼: >>参与讨论
qjc.j
也帮我一下
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
说一下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
to: zhoumcu
抱歉VHDL我没用过,没法回答你

7楼: >>参与讨论
qjc.j
多谢 gao827
我用的MAX-plus II 不支持 好多命令,我也用Quartus 4.2 编译过,但是不知道怎样用它下载的.请教gao827用Quartus 4.2怎样下载程序的.

8楼: >>参与讨论
84082379
给他植就可以了
 
9楼: >>参与讨论
84082379
fnum tnum 有问题
 
10楼: >>参与讨论
qjc.j
多谢 gao827前辈
 再问一下是 Quartus 好用还是 MAX-plus II 好用.

11楼: >>参与讨论
wuzm02
谁有Quartus 4.2,能否分享一下?
谁有Quartus 4.2,能否分享一下?
   thanks all the same;

12楼: >>参与讨论
gao827
to qjc.j
抱歉,ALTERA的工具我没用过,只用过XILINXLATTICE的,你另发个帖子问问吧。

13楼: >>参与讨论
qjc.j
多谢 gao827前辈
多谢您的支持.我会继续努力的.

14楼: >>参与讨论
qjc.j
wuzm02
QQ;50427587

15楼: >>参与讨论
delli
gao827说的很好啊,补充一下
case也是有优先级的,用SELECT

16楼: >>参与讨论
Lyang03
请问case的优先级别是什么样的呀?
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
两片7128可以实现菊花链的连接吗?
一段出错的程序???
请问,MAX-plusII和QuartusII4.2能不能同时用一个下载线?
EPM7128LS84的电路设计中的一些疑问
问题很垃圾,不过是菜鸟在下的疑惑哈.
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号