题解 | 占空比50%的奇数分频

解法一、

`timescale 1ns/1ns

module odo_div_or
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
    );

//*************code***********//
reg [2:0] cnt_pos,cnt_neg;
reg flag1;
reg flag2;
reg clk_out;

always@(posedge clk_in or negedge rst)
    if (~rst)
        cnt_pos <= 'd0;
    else if(cnt_pos == 'd3)
        cnt_pos <= 'd0;
    else if(~flag1)
        cnt_pos <= cnt_pos + 1'b1;

always@(negedge clk_in or negedge rst)
    if (~rst)
        cnt_neg <= 'd0;
    else if(cnt_neg == 'd3)
        cnt_neg <= 'd0;
    else if(flag2)
        cnt_neg <= cnt_neg + 1'b1;

always@(posedge clk_in or negedge rst)
    if (~rst)
        flag1 <= 'd0;
    else if(cnt_pos == 'd3 || cnt_neg == 'd3)
        flag1 <= ~flag1; 

always@(negedge clk_in or negedge rst)
    if (~rst)
        flag2 <= 'd0;
    else if(cnt_pos == 'd3 || cnt_neg == 'd3)
        flag2 <= ~flag2;

always @(*)           
    begin                                        
        if(!rst)                               
             clk_out = 1'b0;                                   
        else if(~clk_out)                                
             clk_out = flag2? ~clk_out : clk_out;                                    
        else if(clk_out)                                
             clk_out = ~flag1? ~clk_out : clk_out;                                    
    end 

assign clk_out7 = clk_out;
//*************code***********//
endmodule

解法二、

`timescale 1ns/1ns

module odo_div_or
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
    );

//*************code***********//
reg [2:0] cnt;
reg flag1;
reg flag2;
reg clk_out;

always@(posedge clk_in or negedge rst)
    if (~rst)
        cnt <= 'd0;
    else if(cnt == 'd6)
        cnt <= 'd0;
    else
        cnt <= cnt + 1'b1;

always@(posedge clk_in or negedge rst)
    if (~rst)
        flag1 <= 'd0;
    else if(cnt == 'd3 || cnt == 'd6)
        flag1 <= ~flag1; 

always@(negedge clk_in)
    if (~rst)
        flag2 <= 'd0;
    else if(cnt == 'd3  || cnt == 'd6)
        flag2 <= ~flag2;


assign clk_out7 = (flag1 | flag2);
//*************code***********//
endmodule

通用:

`timescale 1ns/1ns

module odo_div_or #(parameter N = 7)
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
    );

parameter cnt_len10 = $clog2(N) -1;
//*************code***********//
reg [cnt_len10:0] cnt;
reg flag1;
reg flag2;
reg clk_out;

always@(posedge clk_in or negedge rst)
    if (~rst)
        cnt <= 'd0;
    else if(cnt == N -1)
        cnt <= 'd0;
    else
        cnt <= cnt + 1'b1;

always@(posedge clk_in or negedge rst)
    if (~rst)
        flag1 <= 'd0;
    else if(cnt == N/2 || cnt == N-1)
        flag1 <= ~flag1; 

always@(negedge clk_in)
    if (~rst)
        flag2 <= 'd0;
    else if(cnt == N/2 || cnt == N-1)
        flag2 <= ~flag2;


assign clk_out7 = (flag1 | flag2);
//*************code***********//
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务