【FPGA】时钟生成模块

首先需要已知时钟频率是多少,它的底层是基于DDS的原理去实现的。它的计算方法可以见这个LabVIEW小程序;

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2023/04/06 09:24:24
// Design Name: 
// Module Name: clk_file
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module clk_file(
    clk                       ,
    rst                       ,
    FREQUENCY_CLK             ,
    
    clk_gens1                 ,
    clk_gens1_p               ,
    clk_gens1_n               ,
    phase
);
//////////////////////////////////////////////////////////////////////////////////
input clk                 ;
input rst                 ;
input [31:0] FREQUENCY_CLK;

output clk_gens1          ;
output clk_gens1_p        ;
output clk_gens1_n        ;
output [11:0] phase;
//////////////////////////////////////////////////////////////////////////////////
reg [31:0] cnts;
reg [11:0] phase;

always @ (posedge clk or posedge rst)
begin
    if(rst)
    begin
    cnts<=32'd0;
    end
    
    else
    begin
    cnts<=cnts + FREQUENCY_CLK;
    end
end

always @ (posedge clk or posedge rst)
begin
    if(rst)
    begin
    phase<=12'd0;
    end
    
    else
    begin
    phase<=cnts[31:20];
    end
end
//////////////////////////////////////////////////////////////////////////////////
reg clk_gens1_use;
always @ (posedge clk or posedge rst)
begin
    if(rst)
    begin
    clk_gens1_use<=0;
    end
    
    else 
    begin
    clk_gens1_use<=cnts[31];
    end
end
//////////////////////////////////////////////////////////////////////////////////
reg clk_gens1_p;
always @ (posedge clk or posedge rst)
begin
    if(rst)
    begin
    clk_gens1_p<=0;
    end
    
    else if((cnts[31]==1'b1)&&(clk_gens1_use==1'b0))//posedge
    begin
    clk_gens1_p<=1'b1;
    end
    
    else
    begin
    clk_gens1_p<=1'b0;
    end
end

reg clk_gens1_n;
always @ (posedge clk or posedge rst)
begin
    if(rst)
    begin
    clk_gens1_n<=0;
    end
    
    else if((cnts[31]==1'b0)&&(clk_gens1_use==1'b1))//negedge
    begin
    clk_gens1_n<=1'b1;
    end
    
    else
    begin
    clk_gens1_n<=1'b0;
    end
end
//////////////////////////////////////////////////////////////////////////////////
reg clk_gens1;
always @ (posedge clk or posedge rst)
begin
    if(rst)
    begin
    clk_gens1<=0;
    end
    
    else
    begin
    clk_gens1<=clk_gens1_use;
    end
end
//////////////////////////////////////////////////////////////////////////////////
endmodule

调用模块:生成1Hz的时钟信号

 wire fll_clk_rate; // 100M的时钟 
clk_file DATA_CLK(
    .clk                       (clk),
    .rst                       (rst),
    .FREQUENCY_CLK             (32'd43), // 1@110M
    
    .clk_gens1                 (),
    .clk_gens1_p               (fll_clk_rate),
    .clk_gens1_n               (),
    .phase                     ()
);

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注