赞
踩
若要实现分N频占空比非50%的奇数分频器,只需要计数到(N-1)/2时取反输出,计数到N-1时再次取反输出即可。
若要实现占空比为50%的奇数分频器,核心问题是如何处理半个周期,考虑到一个周期内clk的上升沿和下降沿正好相差半个周期,所以分别利用上升沿和下降沿得到两个占空比非50%的奇数分频器,这两个奇数分频器的上升沿、下降沿都相差半个周期,因此再将这两个占空比非50%的奇数分频器相或,就能实现占空比为50%的奇数分频器
占空比非50%奇数分频器Verilog代码
- //5分频、占空比3:2的奇数分频器
- module Riven(
- clk,
- rst,
- clko
- );
- input clk;
- input rst;
- parameter N = 5;
- output reg clko = 0;
- reg [3:0] cnt = 0;
- always @(posedge clk or negedge rst) begin
- if(!rst) begin
- //cnt <= 0;
- clko <= 0;
- end
- else if(cnt == (N-1)/2) begin
- clko <= ~clko;
- cnt <= cnt + 1;
- end
- else if(cnt == N-1) begin
- cnt <= 0;
- clko <= ~clko;
- end
- else begin
- cnt <= cnt + 1;
- end
- end
- endmodule

Modelsim输入代码,只写了关键的一部分。
- initial
- begin
- clk = 0;
- forever
- #25clk = ~clk;
- $display("Running testbench");
- end
-
- initial
- begin
- rst = 0;
- #1000;
- rst = 1;
- #1000;
- rst = 0;
- #1000;
- rst = 1;
- #1000;
- $stop;
- end

Modelsim仿真结果
占空比50%的技术分频器Verilog代码
- //5分频、占空比50%的奇数分频器
- module Fiora(
- clk,
- rst,
- clko1,
- clko2,
- clko
- );
- input clk;
- input rst;
- parameter N = 5;
- output reg clko1 = 0;
- output reg clko2 = 0;
- output reg clko = 0;
- reg [3:0] cnt1 = 0;
- reg [3:0] cnt2 = 0;
- always @(posedge clk or negedge rst) begin
- if(!rst) begin
- cnt1 <= 0;
- clko1 <= 0;
- end
- else if(cnt1 == (N-1)/2) begin
- clko1 <= 1;
- cnt1 <= cnt1 + 1;
- end
- else if(cnt1 == N-1) begin
- cnt1 <= 0;
- clko1 <= 0;
- end
- else begin
- cnt1 <= cnt1 + 1;
- end
- end
- always @(negedge clk or negedge rst) begin
- if(!rst) begin
- cnt2 <= 0;
- clko2 <= 0;
- end
- else if(cnt2 == (N-1)/2) begin
- clko2 <= 1;
- cnt2 <= cnt2 + 1;
- end
- else if(cnt2 == N-1) begin
- cnt2 <= 0;
- clko2 <= 0;
- end
- else begin
- cnt2 <= cnt2 + 1;
- end
- end
- always@(*)begin clko = clko1|clko2;end
- endmodule

Modelsim仿真结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。