找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2434|回复: 1
打印 上一主题 下一主题
收起左侧

发一个任意数分频的程序

[复制链接]
跳转到指定楼层
楼主
ID:499649 发表于 2019-3-28 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Mystery0724 于 2019-3-28 09:39 编辑

  1. module divide(
  2.                                         clk,
  3.                                         rst_n,
  4.                                         clkout);

  5. input         clk,rst_n;
  6. output        clkout;   

  7. parameter        WIDTH        = 3;         
  8. parameter        N = 5;            

  9. reg         [WIDTH-1:0]        cnt_p,cnt_n;   //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
  10. reg        clk_p,clk_n;     //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟

  11. //上升沿触发时计数器的控制
  12. always @ (posedge clk or negedge rst_n )         
  13. begin
  14.         if(!rst_n)
  15.                 cnt_p<=0;
  16.         else if (cnt_p==(N-1))
  17.                 cnt_p<=0;
  18.         else cnt_p<=cnt_p+1;            
  19. end
  20.                
  21. always @ (posedge clk or negedge rst_n)
  22. begin
  23.         if(!rst_n)
  24.                 clk_p<=0;
  25.         else if (cnt_p<(N>>1))          //N>>1表示右移一位,相当于除以2去掉余数
  26.                 clk_p<=0;
  27.         else
  28.                 clk_p<=1;               //得到的分频时钟正周期比负周期多一个clk时钟
  29. end

  30.           //下降沿触发时计数器的控制               
  31. always @ (negedge clk or negedge rst_n)
  32.         begin
  33.                 if(!rst_n)
  34.                         cnt_n<=0;
  35.                 else if (cnt_n==(N-1))
  36.                         cnt_n<=0;
  37.                 else cnt_n<=cnt_n+1;
  38.         end

  39.           //下降沿触发的分频时钟输出,和clk_p相差半个时钟
  40. always @ (negedge clk)
  41.         begin
  42.                 if(!rst_n)
  43.                         clk_n<=0;
  44.                 else if (cnt_n<(N>>1))  
  45.                         clk_n<=0;
  46.                 else
  47.                         clk_n<=1;                //得到的分频时钟正周期比负周期多一个clk时钟
  48.         end

  49.           assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;      //条件判断表达式
  50.                                                                                                                                                                           //当N=1时,直接输出clk
  51.                                                                                                                                                                           //当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p
  52.                                                                                                                                                                           //当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
  53. endmodule
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:478456 发表于 2019-7-25 15:06 | 只看该作者
记号一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表