完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
唉,真正上手烧FPGA才发现代码的各种问题。接下来的代码可能会有点乱,但是差的风格不影响它的功能。
PWM是主流MCU必备的功能。一般带有频率调节和占空比调节。我所写的这个小模块只有频率调节功能,占空比固定为50%。 //此版仅做1:1占空比的频率调整。 //21位数字码来计数,反转一次需要2M个周期,则一个出口时钟周期需要4M个周期,也就是分频结果是12Hz。 module lab2(//Controled_divider input clk0, input en, input [3:0]num, output div); reg [4:0]cou3;//用来将div1h和div2拉回0的计数器 reg [3:0]cou2;//用来通知neg ck将div1拉高的计数器 reg [3:0]cou1;//用作偶数分频的计数器 reg [3:0]cou;//分频值的缓存; wire div0; reg en0; reg div1;//奇数分频 reg div2;//偶数分频 reg div2_0; reg div2_1; wire tag_half;//如果奇数分频,例如7分频,先等待3个周期之后,把该位置1,下一个下降沿时检测到这个tag为1,将tag换为0;7个周期之后ck上升沿将div1拉低。 reg tag_half0; reg tag_half1; wire tag;//tag用来标注是奇数分频还是偶数分频 reg [20:0]counter; reg ck;//内部使用的12Hz时钟 always@(posedge clk0)begin counter<=counter+1; if(counter==0)ck=~ck; end assign tag_half=tag_half0&tag_half1; assign tag=cou[0];//为1是奇数 always@(posedge ck) en0<=en; assign div=div0&en0; always@(posedge ck)div2<=div2_0&div2_1; assign div0=(tag&div1)|((~tag)&div2); always@(posedge ck or negedge en0)//偶数分频的输出; begin if(~en0)begin cou<=num; cou1<=0; cou2<=0; cou3<=0; end else begin cou1<=cou1+1; cou2<=cou2+1; cou3<=cou3+1; if(cou3==(cou-1))begin cou3<=0; cou1<=0; cou2<=0; div2_1<=0; tag_half1<=0; end else begin tag_half1<=1; div2_1<=1;end end end always@(posedge ck)begin if(cou1<((cou>>1)-1))div2_0<=0; else div2_0<=1; end always@(posedge ck)begin if(cou2<((cou>>1)-1))tag_half0<=0; else begin tag_half0<=1; end end always@(negedge ck)begin if(tag_half)div1<=1; else div1<=0; end endmodule //总结:千万不要做在两个always块中操作同一个寄存器的事情。 //此处的解决方法是原本一个变量分出三个,两个always各操作一个, //第三个变量为前两个变量的与。偶数分频中, //二分之一计数器控制上升沿,总计数器控制下降沿。 程序主体分为两块,一个是50MHz的分频,为了便于LED来观测其频率变化,分出的频率约为12Hz。 另一个是分频模块,利用复位按键的上升沿将四个按键所设置的分频比打入寄存器。分频电路主要分为三部分。一是计数器积满到设定值,将输出拉回低电平。二是如果是偶数分频,在计数值的一半时,将输出拉高;三是如果是奇数分频,例如7分频,则在第三个周期的下降沿将输出拉高,保证50%的占空比。 下载到FPGA后,按下KEY5-KEY8的某几个键并保持,再按一下复位键,则复位键上升时将分频比保存了下来。分频输出开始。 总结:这段代码风格极差,所幸效果还不错,上照片的话也不过是一个亮着的LED,所以不上图了。风格差的一个主要原因是:要同时处理时钟的上升沿和下降沿。下次应该把这个模块和时钟分频分别直接调用。下一波搞搞接口电路、遥控器和signaltap。 |
|
相关推荐
2 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
NVMe高速传输之摆脱XDMA设计51:主要功能测试结果与分析3 nvmePCIe高速存储 PCIe高速存储
447 浏览 0 评论
NVMe高速传输之摆脱XDMA设计50:主要功能测试结果与分析2 nvmePCIe高速存储
403 浏览 0 评论
NVMe高速传输之摆脱XDMA设计49:主要功能测试结果与分析1
1521 浏览 0 评论
959 浏览 0 评论
900 浏览 0 评论
4439 浏览 63 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 19:58 , Processed in 0.845970 second(s), Total 67, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5624