一、verilog编写三分频电路

本文介绍了一种使用Verilog语言实现三分频电路的方法,通过分别利用时钟的上升沿和下降沿计数来实现50%占空比的输出。文章提供了完整的代码示例及仿真结果验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.目标:使用verilog编写三分频电路,要求占空比大小为50%。

2.方法:分别使用上升沿和下降沿计数cnt_p以及cnt_n,并且计数从0到N-1(N为分频的次数,此时为3);分别对clk_p以及clk_n做复位初始化为0,这样当它们计数到0或者(N-1)/2的时候分别进行信号的翻转;如果clk_p以及clk_n初始化为0,结果是clk_p | clk_n,如果初始化为1则是clk_p &  clk_n。

3. three_div_Freq.v

`timescale 1ns / 1ps
//
// Company: Shanghaitech
// Engineer: Junluoyu
// 
// Create Date: 2021/11/02 22:48:53
// Design Name: 
// Module Name: three_div_Freq
// Project Name: 
// Target Devices: 
// Tool Versions: vivado 2020.1
// Description: 三分频电路
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module three_div_Freq #(
    parameter N = 3
)
(
    input clk_in,
    input rst_n,
    output clk_out
);
/*----------------------------------------------------------------------------------------------*/
reg [3:0] cnt_p , cnt_n ;
reg       clk_p , clk_n ;
/*----------------------------------------------------------------------------------------------*/
always @(posedge clk_in or negedge rst_n) begin
    if(!rst_n)
        cnt_p<=4'b0000;
    else if(cnt_p==N-1)
        cnt_p<=4'b0000;
    else
        cnt_p<=cnt_p+1'b1;
end

always @(negedge clk_in or negedge rst_n) begin
    if(!rst_n)
        cnt_n<=4'b0000;
    else if(cnt_n==N-1)
        cnt_n<=4'b0000;
    else
        cnt_n<=cnt_n+1'b1;
end

always @(posedge clk_in or negedge rst_n) begin
    if(!rst_n)
        clk_p<=1'b0;
    else if(cnt_p==(N-1)/2)
        clk_p<=~clk_p;
    else if(cnt_p==4'b0000)
        clk_p<=~clk_p;
    else
        clk_p<=clk_p;
end

always @(negedge clk_in or negedge rst_n) begin
    if(!rst_n)
        clk_n<=1'b0;
    else if(cnt_n==(N-1)/2)
        clk_n<=~clk_n;
    else if(cnt_n==4'b0000)
        clk_n<=~clk_n;
    else
        clk_n<=clk_n;
end

assign clk_out = clk_p | clk_n;
endmodule

4.testbench

`timescale 1ns / 1ps
//
// Company: Shanghaitech
// Engineer: Junluoyu 
// 
// Create Date: 2021/11/02 22:59:59
// Design Name: 
// Module Name: tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module tb();
/*---------------------------------------------------------------------------------------------*/
reg  clk_in;
reg  rst_n;
wire clk_out;
/*---------------------------------------------------------------------------------------------*/
three_div_Freq #(
    .N(3)
)
three_div_Freq_inst 
(
    .clk_in (clk_in ),
    .rst_n  (rst_n  ),
    .clk_out(clk_out)
);
/*----------------------------------------------------------------------------------------------*/
initial clk_in = 1'b0;
always #5 clk_in = ~clk_in;  // 10ns,50MHz
/*----------------------------------------------------------------------------------------------*/
initial begin
    rst_n = 1'b0;
    #100;
    rst_n = 1'b1;
    #1000;
    $stop;
end   
endmodule

5.仿真波形

 可见,生成的波形时钟周期为30ns,三分频即周期扩大三倍,故实现了三分频的功能。

6.扩展

如果实现其他奇数分频,只需要修改参数N为对应奇数即可。那么如果想得到占空比不是50%的应该怎么操作呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun_luo_yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值