完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
module wave_gen(address,inclk,select,freq);
output[8:0] address; input inclk; input[1:0] select; input[3:0] freq; reg[7:0] Qout; reg[8:0] adderss; reg[7:0] k,m; wire [1:0] select; parameter sina_wave=2'b00,swat_wave=2'b01, squr_wave=2'b10,trig_wave=2'b11; always @(posedge inclk) begin case(select) sina_wave:begin if(select==2'b01) address<=128; if(select==2'b10) address<=256; if(select==2'b11) address<=384; if(freq==0||freq==1) begin if(address>=127) adderss<=0; else adderss<=address+1; end else begin k<=127/freq; m<=freq*k; if(address>=m) adderss<=0; else adderss<=address+freq; end end swat_wave:begin if(select==2'b00) address<=0; if(select==2'b10) address<=256; if(select==2'b11) address<=384; if(address < 128) adderss<=128; else begin if(freq==0||freq==1) begin if(address>=255) adderss<=128; else adderss<=address+1; end else begin k<=127/freq; m<=freq*k; if(address>=(m+128)) adderss<=9'd128; else adderss<=address+freq; end end end squr_wave:begin if(select==2'b00) address<=0; if(select==2'b01) address<=128; if(select==2'b11) address<=384; if(address<256) address<=256; else begin if(freq==0||freq==1) begin if(address>=383) adderss<=256; else adderss<=address+1; end else begin k<=127/freq; m<=freq*k; if(address>=(m+256)) adderss<=256; else adderss<=address+freq; end end end trig_wave:begin if(select==2'b00) address<=0; if(select==2'b01) address<=128; if(select==2'b10) address<=256; if(address<=384) address<=384; else begin if(freq==0||freq==1) begin if(address>=511) adderss<=384; else adderss<=address+1; end else begin k<=127/freq; m<=freq*k; if(address>=(m+384)) adderss<=384; else adderss<=address+freq; end end end endcase end endmodule |
|
相关推荐
11个回答
|
|
不知道啊爱的开始叫对方法减肥
|
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 yangzhiyuan0928 于 2015-9-11 10:53 编辑
您好,很高兴认识您! 首先:代码编译没通过。 其次:我知道,您是在做一个波形发生器模块,select作为选择输出波形, 但是我没看懂您的代码,特别是case语句中的 if(select==2'b01) address<=128; if(select==2'b10) address<=256; if(select==2'b11) address<=384; 这些语句,本来case就有条件选择的作用,为什么还要用if。还有就是,能否加点注释,没看懂波形发生器的原理。 最后:希望和您探讨一下波形发生器设计 |
|
|
|
我觉得您的程序有几个问题,第一就是代码很乱,格式的问题,如果要让别人看的话,格式要修改的好一点,然后大致看了一下,就是那个状态机里面,select就是用来选择状态的,里面还加if语句干嘛?逻辑有点混乱。
|
|
|
|
还有就是select,状态机在什么时候跳转,你的select这个信号还没有写,肯定有问题啊
|
|
|
|
module wave_gen(
clk , rst_n , select , freq , address ); input inclk ; input[1:0] select ; input[3:0] freq ; output[8:0] address ; reg [7:0] qout ; reg [8:0] address ; reg [7:0] k ; reg [7:0] m ; reg [1:0] select ; reg [1:0] select_n ; parameter SINA_WAVE = 2'b00 ; parameter SWAT_WAVE = 2'b01 ; parameter SQUR_WAVE = 2'b10 ; parameter TRIG_WAVE = 2'b11 ; always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin select<=SQUR_WAVE; end else begin select<=select_n; end end always @(*)begin case(select_n) SINE_WAVE:begin if(...) select_n = SWAT_WAVE ; else select_n = SINE_WAVE ; end SWAT_WAVE:begin if(...) select_n = SQUR_WAVE ; else select_n = SWAT_WAVE ; end SQUR_WAVE:begin if(...) select_n = TRIG_WAVE ; else select_n = SQUR_WAVE ; end default : select_n = SINA_WAVE ; endcase end always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin address<=0; end else begin if(select==2'b01) address<=128; else if(select==2'b10) address<=256; else if(address==2'b11) address<=384; else if(freq==0 || freq==1)begin if(address>=127) address<=0; else address<=address+1; end else begin if(address>m) address<=0; else address<=address+freq; end end end always @(*)begin k = 127/freq; end always @(*)begin m = freq*k; end 我大致给你修改了一段,但是不知道你的具体跳转的条件是什么,你可以自己添加,但是你那段address的那段真的挺乱的,把逻辑好好理一下 |
|
|
|
我这里的adderss的值不是0-511个值吗,它作为一个地址,里面存储的是四个波形的值,0-127是一个周期正弦的值,128-255是一个周期锯齿波的值,256-383是一个周期方波的值,384-511是一个周期三角波的值,至于你说的if(select==00)的那些语句,可以不要 |
|
|
|
我之前调单片机的时候,也做过这四种波形的生成,我想把那种思想用在FPGA中,我本来想生成一个数组,把用函数发生器生成的的128点的正弦波的值存入到一个数组中,输出的时候通过查找表进行输出,可是我刚开始学习,很多都不太懂,所以
|
|
|
|
houxiaoxiao 发表于 2015-9-11 15:25 是可以这样来产生波形的,我之前也做过,通过数组存储波形数据,然后将数据送至DA,转换出模拟信号,通过滤波输出波形 |
|
|
|
可是用verilog,怎么表示,我就不会用了。刚开始学,有些语句的用法还不是太了解 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1472 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1067 浏览 0 评论
2556 浏览 1 评论
2245 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2515 浏览 0 评论
1962 浏览 54 评论
6032 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 02:16 , Processed in 0.650906 second(s), Total 61, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号