joe 发表于 2022-4-20 11:01:31

verilog信号移相(1)

1.代码文件说明
分频器的代码并不难,网上多数是奇偶分频分开写的代码,按照电路结构去理解,分频器分为奇偶数两个module是比较理想的。如果把奇偶两个模块写到一个module中,则会导致输出经过较多的逻辑电路,这对于一个时钟输出是极其不利的,会产生较差的时序,在做数字IC的时候要尤为注意这一点。调用本次代码时,只需例化Div.v,本次代码得到的都是占空比为50%的信号。

名字                说明
div_even.v        偶数分频module
div_odd.v        奇数分频module
Div.v                例化奇偶分频module的module
2.端口说明
仅以Div.v这个module来说明:

名字                 类型                 说明
fre_div        parameter        分频数
clk                input                 输入时钟
rst_n                input                 复位
clk_out        output        输出时钟
————————————————

//-----------------------------------------------------------------------------------------------
//Copyright    :
//File Name    : TOP
//Author       : Luk.wj
//Data         : 2021.10.14
//Description: TOP file for test
//-----------------------------------------------------------------------------------------------

module TOP #(
    parameter    fre_div = 4    //frequency division
) (
    input      clk,
    input      rst_n,
    output       clk_out
);

Div#(
    .fre_div   ( fre_div   )
)u1_Div(
    .clk       ( clk       ),
    .rst_n   ( rst_n   ),
    .clk_out   ( clk_out   )
);

endmodule


//-----------------------------------------------------------------------------------------------
//Copyright    :
//File Name    : div_even
//Author       : Luk.wj
//Data         : 2021.10.13
//Description: Even frequency division
//-----------------------------------------------------------------------------------------------

module div_even #(
    parameter    fre_div = 4    //frequency division
) (
    input            clk,
    input            rst_n,
    output reg       clk_out
);

reg    cnt;

always @(posedge clk or negedge rst_n) begin
   if (!rst_n) begin
       cnt   <= 0;
       clk_out <= 1'b0;
   end
   else if (cnt == (fre_div/2-1)) begin
       cnt   <= 0;
       clk_out <= ~clk_out;
   end
   else
       cnt <= cnt + 1;
end

endmodule


//-----------------------------------------------------------------------------------------------
//Copyright    :
//File Name    : div_odd
//Author       : Luk.wj
//Data         : 2021.10.13
//Description: Odd numkber frequency division
//-----------------------------------------------------------------------------------------------

module div_odd #(
    parameter    fre_div = 5    //frequency division
) (
    input            clk,
    input            rst_n,
    output         clk_out
);

reg[(fre_div-1)/2:0]    cnt_p, cnt_n;//posedge, negedge count
regclk_p, clk_n;                     //posedge, negedge generate clock

//====================================================clk_p unit
always @(posedge clk or negedge rst_n) begin
   if (!rst_n) begin
       cnt_p<= 0;
       clk_p<= 1'b0;
   end
   else if (cnt_p == (fre_div-1)/2) begin
       clk_p<= ~clk_p;
       cnt_p<= cnt_p + 1;
   end
   else if (cnt_p == (fre_div-1)) begin
       cnt_p<= 0;
       clk_p<= ~clk_p;
   end
   else
       cnt_p<= cnt_p + 1;
end

//====================================================clk_n unit
always @(negedge clk or negedge rst_n) begin
   if (!rst_n) begin
       cnt_n<= 0;
       clk_n<= 1'b0;
   end
   else if (cnt_n == (fre_div-1)/2) begin
       clk_n<= ~clk_n;
       cnt_n<= cnt_n + 1;
   end
   else if (cnt_n == (fre_div-1)) begin
       cnt_n<= 0;
       clk_n<= ~clk_n;
   end
   else
       cnt_n<= cnt_n + 1;   
end

assign clk_out = clk_p | clk_n;

endmodule

版权声明:本文为CSDN博主「小火子Velsuked」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42446721/article/details/120823047

页: [1]
查看完整版本: verilog信号移相(1)