1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
初学FPGA,听说分频貌似挺重要,是必备的基础技能。小白的我今天就从奇偶分频开始我的FPGA学习成长之路
偶数分频很简单的哈,打字蛮累的,直接上代码 /*************6分频************/ module lesson2_clk( clk, rest_n, clk_out_div6 ); input clk ; //系统时钟 50M; input rest_n; //复位信号 低电平有效; output clk_out_div6; //6分频时钟输出; reg [1:0] cnt; //计数寄存器 reg clk_out_div6; //时钟输出寄存器 always@(posedge clk or negedge rest_n) begin if(!rest_n) //复位信号 begin cnt<=0; //计数器清零; clk_out_div6<=0; //分频时钟输出复位; end else begin if(cnt==2'd2) //6分频 N=6;(N/2)-1 = 2 ; begin cnt<=0; clk_out_div6<=~clk_out_div6; end else begin cnt<=cnt+1'b1; end end end endmodule 一个begin 就占一行,看起来蛮不爽的。代码写的少,风格这些还是别喷我。我会多多的练习的。 这是一个六分频的程序代码,仿真成功;接下来是奇数分频,原理就不说了嘛,挺简单的,还是直接上代码好了 ////////////////////////////////////////////////////////////////////////////////// module clk_div5( clk , //系统时钟 50MHz; rest_n , //系统复位信号 低电平有效; clk_div5_out //5分频 时钟输出 50/5=10MHz; ); input clk ; input rest_n ; output clk_div5_out ; reg [1:0] cnt_up ; //上升沿计数; reg clk_div5_up ; //上升沿计数输出寄存器; always@(posedge clk or negedge rest_n)begin if(!rest_n)begin //复位; cnt_up <= 0; //计数清零; clk_div5_up <= 0; end else if(cnt_up == 2'd1)begin //上升沿计数值到 N = 5; 【(N-1)/2】-1 = 1; clk_div5_up <= ~clk_div5_up; //计数至 1 ,时钟翻转; cnt_up <= cnt_up + 1'b1; end else if(cnt_up == 2'd4)begin //上升沿计数值到 N-1 ;时钟再次翻转; clk_div5_up <= ~clk_div5_up; cnt_up <= 0; end else begin cnt_up <= cnt_up + 1'b1; //计数 +1; end end reg [2:0] cnt_dn ; reg clk_div5_dn ; always@(negedge clk or negedge rest_n)begin if(!rest_n)begin //复位; cnt_dn <= 0; //计数清零; clk_div5_dn <= 0; end else if(cnt_dn == 2'd1)begin //计数值同上升沿; clk_div5_dn <= ~clk_div5_dn; cnt_dn <= cnt_dn + 1'b1; end else if(cnt_dn == 2'd4)begin clk_div5_dn <= ~clk_div5_dn; cnt_dn <= 0; end else begin cnt_dn <= cnt_dn + 1'b1; end end wire clk_div5_out; assign clk_div5_out = clk_div5_up & clk_div5_dn ; // 相与运算得到50%占空比的时钟输出; endmodule 仿真波形就不贴出来了,其实也是成功的。。哈哈 知道原理可以实现任意数分频; |
|
相关推荐
6个回答
|
|
分频是基础,顶一记
|
|
|
|
本帖最后由 根号2 于 2016-4-3 19:09 编辑
reg [1:0] cnt_up ; //上升沿计数;此处 cnt_up 位宽应该是3位 reg [2:0] cnt_up ; 所以代码里面 cnt_up == 2'd1,应改为cnt_up == 3'd1; cnt_up == 2'd4,应改为cnt_up == 3'd4; 下降沿计数里面,if括号里面也要改过来哦。 |
|
|
|
2位的位宽,计数寄存器是是记不到4就会溢出的。所以前面程序有点小错误哈。这里更正一下
|
|
|
|
|
|
|
|
|
|
|
|
好的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1307 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1038 浏览 0 评论
2382 浏览 1 评论
2087 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2349 浏览 0 评论
1868 浏览 49 评论
6007 浏览 113 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 21:09 , Processed in 0.639142 second(s), Total 79, Slave 63 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号