在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5672|回复: 7

[求助] FPGA音乐播放器:ISE中用Coregen生成的ROM怎么在Verilog中读取?

[复制链接]
发表于 2014-11-5 16:41:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
音乐以简谱的形式存放在coe文件中,比如:1 1 2 2 3 4 5 5 6 6 7 8,一共有21个音从低音1到高音7,可以表示为1~21
已经设计好了分频器模块DFm,时钟是25MHz,可以传递分频倍数(偶数)。
现在想要设计两个模块:
第一个是调用DFm生成1~7音对应的频率:DFm #(分频倍数),音符对应的分频倍数我都算好了,只要举个例子,比如1这个音怎么对应存储DFm输出的频率我就知道了。
第二个是读取ROM中的数据,大概是每0.25秒读一个音(一个数字),然后在上一个模块中找到对应的频率,使之输出到蜂鸣器voi,输出0.25秒

第一个模块我有一点模糊的想法,就是按不同的分频系数例化21个模块,但是这样太复杂了,而且仿真很慢,最大的分频系数是192308....第二个模块首先是不知道怎么读ROM,其次不知道怎么按0.25秒读和输出求大神指导~~用的是ISE,板子是Spartan3E的。
发表于 2014-11-5 16:54:01 | 显示全部楼层
分频出一个4HZ的时钟,然后利用这个时钟做个计数器,计数器的值作为ROM地址(可以控制计数器值计到某个值后从0开始重新计数,达到重复播放的效果)。ROM的片选常开。从ROM中读出的数据经过一个译码器(不同的数据对应不同的分频数),得到分频数,送到分频模块里面(只需要一个分频电路就行了),得到分频时钟,输出到FPGA口上。
 楼主| 发表于 2014-11-5 18:08:09 | 显示全部楼层
回复 2# chengroc


   十分感谢!不过我还是有点不太清楚,比如我现在建立了一个wonder.xco的ROM,wonder.coe已经导入并且生成了相应的mif文件,我应该怎么在代码里读这个ROM的地址呢?
发表于 2014-11-5 19:19:51 | 显示全部楼层
你用corgen生成ROM时,应该伴随生成了一个.v文件,这个是ROM的模型,把它加到里的仿真环境里面(这个ROM模型中例化了另外一个BLK_MEM_GEN_**的模块,根据其名字,到ISE的安装目录中找到相应的.v模型,也加到仿真环境中去)。同时在你的设计中要例化ROM。ROM的端口定义在模型文件中有描述。
由于ROM已固化了数据,所以mif文件应拷到仿真目录下,仿真工具才能找得到
 楼主| 发表于 2014-11-5 20:06:21 | 显示全部楼层
回复 4# chengroc


   按你说的方法成功了,添加Core的时候就已经加到工程中了,按.v文件端口列表输出就行了。

还有个问题,我分频器分频系数是parameter类型的,但是音符译码器译出来的分频系数是reg类型的,在例化的时候译出来的分频系数不能传递到分频器模块里,试了一下function好像也不能用parameter作为输出...


附上译码器和分频器代码:
译码器:




  1. `timescale 1ns / 1ps
  2. module dfmratio(music,dfmratio);

  3. input [4:0]music;
  4. output [17:0]dfmratio;
  5. reg [17:0]dfmratio;
  6. always @(music)
  7. begin
  8.         case(music)
  9.                 5'b00000:dfmratio=192308;
  10.                 5'b00001:dfmratio=171232;
  11.                 5'b00010:dfmratio=152440;
  12.                 5'b00011:dfmratio=143678;
  13.                 5'b00100:dfmratio=127552;
  14.                 5'b00101:dfmratio=113636;
  15.                 5'b00110:dfmratio=101626;
  16.                 5'b00111:dfmratio=95786;
  17.                 5'b01000:dfmratio=85324;
  18.                 5'b01001:dfmratio=75988;
  19.                 5'b01010:dfmratio=71634;
  20.                 5'b01011:dfmratio=63776;
  21.                 5'b01100:dfmratio=56818;
  22.                 5'b01101:dfmratio=50710;
  23.                 5'b01110:dfmratio=47892;
  24.                 5'b01111:dfmratio=42662;
  25.                 5'b10000:dfmratio=37994;
  26.                 5'b10001:dfmratio=35816;
  27.                 5'b10010:dfmratio=31888;
  28.                 5'b10011:dfmratio=28410;
  29.                 5'b10100:dfmratio=25354;
  30.                 default dfmratio=0;
  31.         endcase
  32. end
  33. endmodule


复制代码






分频器:




  1. `timescale 1ns / 1ps
  2. module DFm
  3. (
  4. input CLK_In,  
  5. input RSTn,
  6. output CLK_Out
  7. );  
  8. parameter DIV_N=2;
  9. reg [DIV_N:0] count;
  10. reg clk_N;   
  11. always @ ( posedge CLK_In or negedge RSTn)
  12. begin  
  13.         if(!RSTn)  
  14.         begin   
  15.                 count <= 1'b0;   
  16.                 clk_N <= 1'b0;  
  17.         end  
  18.         else if( count == DIV_N/2 - 1'b1)  
  19.         begin   
  20.                 count <= 1'b0;   
  21.                 clk_N <= ~clk_N;
  22.         end  
  23.         else   
  24.                 count <= count + 1'b1;
  25. end   
  26. assign CLK_Out = clk_N;  
  27. endmodule


复制代码

发表于 2014-11-6 08:51:34 | 显示全部楼层
把分频器的分频系数做成输入端口
 楼主| 发表于 2014-11-6 20:55:24 | 显示全部楼层
回复 6# chengroc


   我完成了!太感谢了!
发表于 2017-2-15 18:01:25 | 显示全部楼层
借鉴一下。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-26 05:59 , Processed in 0.020080 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表