1. 程式人生 > 實用技巧 >奇數分頻--不使用負邊沿觸發verilog實現(佔空比50%)

奇數分頻--不使用負邊沿觸發verilog實現(佔空比50%)

奇數分頻電路的程式碼,有兩種情況:①使用帶負沿觸發的DFF(要求佔空比50%),②不使用帶負沿觸發的DFF;

使用帶負邊沿觸發的:https://www.cnblogs.com/shadow-fish/p/13383903.html

不適用帶負邊沿觸發:實質是向帶負邊沿觸發的DFF靠攏。實驗程式為3分頻,佔空比為50%。

module test (
    input clk,
    input rst,
    output wire d_out
);
    reg [1:0]cnt;
    reg d_out_1;
    reg d_out_2;
    reg d_out_3;
    wire
clk_1; always @(posedge clk or negedge rst) begin if(!rst) begin cnt <= 2'b0; end else if (cnt == 2'b10) begin cnt <= 2'b0; end else begin cnt <= cnt + 1'b1; end end always @(posedge clk or negedge
rst) begin//佔空比1/3 if(!rst) begin d_out_1 <= 'b0; end else if (cnt < 2'b10) begin d_out_1 <= 1'b0; end else begin d_out_1 <= 1'b1; end end assign clk_1 = ~clk; always @(posedge clk_1 or negedge rst) begin
//佔空比1/3, if(!rst) begin d_out_2 <= 'b0; d_out_3 <= 'b0; end else if (cnt < 2'b10) begin d_out_2 <= 'b0; d_out_3 <= d_out_2; end else begin d_out_2 <= 'b1; d_out_3 <= d_out_2; end end assign d_out = d_out_1 | d_out_3;//也可以使用相與,則佔空比要求為2/3。 endmodule

測試檔案:

`timescale 1ns/10ps
module test_tb;
    
    reg clk;
    reg rst;
    wire d_out;

    test u1(
    .clk(clk),
    .rst(rst),
    .d_out(d_out)
    );

    initial begin
        clk = 1'b1;
        rst = 1'b0;
        #8;
        rst = 1'b1;
    end
    always #5 clk = ~clk;
endmodule

模擬結果: