题解 | 进阶版16#占空比50%的奇数分频#

占空比50%的奇数分频

http://www.nowcoder.com/practice/ccfba5e5785f4b3f9d7ac19ab13d6b31

1. 偶数分频

    简单,只是注意时钟翻转的条件是(N/2)还是(N/2)-1,非阻塞赋值在下一个时钟才会更新值。   

 

2. 奇数分频

    奇数分频比偶数分频复杂一些,当不要求分频的占空比时,对输入时钟clk上升沿计数,可以设置两个计数的翻转点,一个是(N-1)/2,一个是(N-1),计数到(N-1)时输出时钟翻转且将计数器清零,假设计数器计数0~(N-1)/2区间输出低电平,则输出时钟的低电平有(N-1)/2 + 1clk周期,高电平的计数是(N-1)/2+1 ~ (N-1),共(N-1)/2clk周期,可见不是50%占空比。

    当要求占空比为50%时,对输入时钟clk的上升沿和下降沿分别计数,根据两个计数器得到两个错位输出的时钟,将两个时钟做“或”运算,可以弥补相差的时钟,达到50%占空比。
图中的clk实际上应该是clk_half半个周期。

         7分频为例,代码如下:
/********************************************
          计数器实现 7 分频
          作者:FPGA探索者
*********************************************/
module Odd_Divider(
         inputclk,
         inputrst_n,
         outputclk_divider
);
 
reg [2:0] count_p;    //上升沿计数
reg [2:0] count_n;    //下降沿计数
reg clk_p;                   //上升沿分频
reg clk_n;                   //下降沿分频
 
//上升沿计数 作者:FPGA探索者
always @ ( posedge clk&nbs***bsp;negedge rst_n )
begin
         if(!rst_n )
                  count_p<= 3'b0;
         elseif( count_p == 3'd6 )
                   count_p<= 3'b0;
         else 
                   count_p<= count_p + 1'b1;
end
 
//上升沿分频 作者:FPGA探索者
always @ ( posedge clk&nbs***bsp;negedge rst_n )
begin
         if(!rst_n ) begin
                   clk_p<= 1'b0;
         end
         elsebegin
                   if(count_p == 3'd3 || count_p == 3'd6 ) begin
                            clk_p<= ~clk_p;
                   end
         end
end
 
//下降沿计数 作者:FPGA探索者
always @ ( negedge clk&nbs***bsp;negedge rst_n )
begin
         if(!rst_n )
                   count_n<= 3'b0;
         elseif( count_n == 3'd6 )
                   count_n<= 3'b0;
         else 
                   count_n<= count_n + 1'b1;
end
 
//下降沿分频 作者:FPGA探索者
always @ ( negedge clk&nbs***bsp;negedge rst_n )
begin
         if(!rst_n ) begin
                   clk_n<= 1'b0;
         end
         elsebegin
                   if(count_n == 3'd3 || count_n == 3'd6 ) begin
                            clk_n<= ~clk_n;
                   end
         end
end
 
assign clk_divider = clk_p | clk_n;
 
endmodule
仿真如下:


全部评论
为什么count==0||count==3这样不行呢
点赞 回复 分享
发布于 2023-03-28 13:31 江苏

相关推荐

01-29 15:45
已编辑
华中科技大学 前端工程师
COLORSN:可以试一下,小厂看技术栈是不是很落后,如果太拉胯就别去,个人认为有实习氛围比你自己琢磨要高效不少,然后就是小厂其实也有可能会问的很难,这都比较难说,还是看自己项目含金量够不够,寒假还能不能推进学习再选择,毕竟去实习过年就10天假了
点赞 评论 收藏
分享
2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
11
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务