FPGA project : divider_odd

本文描述了一个Verilog设计,实现了一个可配置的分频器模块(divider_odd),使用计数器和时钟信号调整输出频率,配合测试模块进行时序分析。

 

 

module divider_odd 
#(
    parameter ODD = 3'd5 
)
(
    input           wire        sys_clk       ,
    input           wire        sys_rst_n     ,

    output          wire        clk_divider_odd
);
    // cnt
    reg     [02:00]     cnt ;
    wire                add_cnt ;
    wire                end_cnt ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            cnt <= 0 ;
        end else begin
            if(add_cnt) begin
                if(end_cnt) begin
                    cnt <= 0 ;
                end else begin
                    cnt <= cnt + 3'b1 ;
                end
            end else begin
                cnt <= cnt ;
            end
        end
    end
    assign add_cnt = 1'b1 ;
    assign end_cnt = add_cnt && cnt == ( ODD - 1'b1 ) ;
    // clk_p clk_n
    reg    clk_p ;
    reg    clk_n ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            clk_p <= 1'b0 ;
        end else begin
            if(cnt >= 3) begin
                clk_p <= 1'b1 ;
            end else begin
                clk_p <= 1'b0 ;
            end
        end
    end
    always @(negedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            clk_n <= 1'b0 ;
        end else begin
            if(cnt >= 3) begin
                clk_n <= 1'b1 ;
            end else begin
                clk_n <= 1'b0 ;
            end
        end
    end
    // clk_divider_odd
    assign    clk_divider_odd = clk_p || clk_n ;

endmodule
`timescale 1ns/1ns
module test();
    reg                             sys_clk            ;
    reg                             sys_rst_n          ;
    wire                            clk_divider_odd    ;

divider_odd
#(
    .ODD                           (5) 
)
divider_odd_insert
(
    .sys_clk                        ( sys_clk          ),
    .sys_rst_n                      ( sys_rst_n        ),
 
    .clk_divider_odd                ( clk_divider_odd  )   
);

    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 1000 ) ;
        $stop             ;
    end

    always #( CYCLE / 2 ) sys_clk    = ~sys_clk ;


endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值