相比偶数分频,奇数分频相对复杂,下面我总结一下如何用verilog实现。以N(奇数)为例。
总结如下:
a. 上升沿计数器和信号寄存器:
- 设置一个计数长度为N的上升沿计数器(pos_cnt),并且设置一个信号寄存器(pos_clk)。
- 当上升沿计数器计数到时,信号寄存器翻转。
- 当上升沿计数器计数到时,信号寄存器再次翻转。
b. 下降沿计数器和信号寄存器:
- 设置一个计数长度为N的下降沿计数器(neg_cnt),并且设置另一个信号寄存器(neg_clk)。
- 当下降沿计数器计数到时,信号寄存器翻转。
- 当下降沿计数器计数到时,信号寄存器再次翻转。
c. 合并信号:
- 将两个信号寄存器的输出进行逻辑或操作,得到奇数分频信号。
下面以N = 7举例
module clk_7(
input wire clk,
input wire rst,
output wire clk_7
);
reg [2:0] pos_cnt;
reg [2:0] neg_cnt;
reg pos_clk,neg_clk;
//上升沿计数
always @(posedge clk) begin
if (rst == 1'b1) begin
pos_cnt <= 'd0;
end
else if (pos_cnt == 'd6) begin
pos_cnt <= 'd0;
end
else begin
pos_cnt <= pos_cnt + 1'b1;
end
end
//上升沿时钟
always @(posedge clk) begin
if (rst == 1'b1)begin
pos_clk <= 1'b0;
end
else if (pos_cnt == 'd3)begin
pos_clk <= 1'b1;
end
else if (pos_cnt == 'd6)begin
pos_clk <= 1'b0;
end
end
//下降沿计数
always @(negedge clk) begin
if (rst == 1'b1) begin
neg_cnt <= 'd0;
end
else if (neg_cnt == 'd6) begin
neg_cnt <= 'd0;
end
else begin
neg_cnt <= pos_cnt + 1'b1;
end
end
//下降沿时钟
always @(negedge clk) begin
if (rst == 1'b1)begin
neg_clk <= 1'b0;
end
else if (neg_cnt == 'd3)begin
neg_clk <= 1'b1;
end
else if (neg_cnt == 'd6)begin
neg_clk <= 1'b0;
end
end
//相或
assign clk_7 = pos_clk||neg_clk;
endmodule
进行modelsim进行仿真模拟
结果如图文章来源:https://www.toymoban.com/news/detail-854014.html
文章来源地址https://www.toymoban.com/news/detail-854014.html
到了这里,关于fpga时钟分频——奇数分频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!