原创 分频实验——占空比为50%的奇分频

2013-11-1 23:29 2920 19 19 分类: FPGA/CPLD
 

        分频实验应该是FPGA/CPLD实验中的最基础的实验(本人应该比流水灯还基础),而占空比为50%的奇分频相较于偶分频有一些难点。本文以占空比为50%的三分频时钟为例,希望起一点抛砖引玉的作用。

        思路:通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算。(这里我希望大家可以用笔在纸上画出时序,验证和思考一下)。

源代码:

`timescale 1ns/1ps

module clkdiv
(
        sysclk,
        rst_b,
        div_out
);

input  sysclk;
input  rst_b;
output div_out;

reg [1:0] cnt1;
reg [1:0] cnt2;

always @(posedge sysclk)    
begin
if(!rst_b) cnt1 <= 2'b0;
else
       begin
                case(cnt1)
                2'b00:  cnt1 <= 2'b01;
                2'b01:  cnt1 <= 2'b10;
                2'b10:  cnt1 <= 2'b00;
                default:  cnt1 <= 2'b00;
                endcase
       end
end

always @(negedge sysclk )
begin
if(!rst_b) cnt2 <= 2'b0;
else
       begin
          case(cnt2)
          2'b00:  cnt2 <= 2'b01;
          2'b01:  cnt2 <= 2'b10;
          2'b10:  cnt2 <= 2'b00;
          default:  cnt2 <= 2'b00;
          endcase
       end

end
assign div_out = (cnt1[0] | cnt2[0]);
endmodule

 

testbench源码(本人模仿特权同学视频testbench写法):

`timescale 1 ns/ 1 ps

module clkdiv_tb();
reg sysclk;                                          
wire div_out;
reg rst_b;


clkdiv i_clkdiv (
 .div_out(div_out),
 .rst_b(rst_b),
 .sysclk(sysclk)
);
initial                                               
begin                                                 
      sysclk = 1;
      forever
      #10   sysclk = ~sysclk;  
end                                                   

initial                 
begin                                                 
       rst_b = 0;
       #1000;
       rst_b = 1;
       #5000;
       $stop;  
end                                                   
endmodule

最后附上modelsim的功能仿真效果图:

 1.jpg

 本人最近才开始学习CPLD/FPGA,也是菜鸟一名,有不对的地方,希望大家批评指正。

文章评论0条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /2 下一条