思路 占空比不为50%的分频器
目录
00,01,10,在00,01的时候为低,10的时候为高,需要用到寄存器,加法器,比较器
其实计数器就是由这三部分组成
方案1
RTL
code
module fenpin3(clk,rst,clk_3);
input wire clk,rst;
output wire clk_3;
reg [1:0]count;
always@(posedge clk, posedge rst)begin
if(rst)
count<=0;
else
if(count==2'b10)
count<=0;
else
count<=count+1'b1;
end
assign clk_3=(count==2'b10)?1'b1:1'b0;
endmodule
这种方案的缺点就是输出和时钟沿有一级组合电路的延时
方案2
RTL
code
module fenpin3(clk,rst,clk_3
);
input wire clk,rst;
output reg clk_3;
reg [1:0]count;
always@(posedge clk,posedge rst)begin
if(rst)
count<=0;
else
if(clk_3)
count<=0;
else
count<=count+1'b1;
end
always@(posedge clk, posedge rst)begin
if(rst)
clk_3<=0;
else if(count==2'b01)
clk_3<=1'b1;
else
clk_3<=1'b0;
end
endmodule
RTL仿真
方案3 占空比为50%的三分频电路
思路:
首先利用上升沿做一个占空比为1/3的三分频电路(占空比不为50%的分频器其实就是一个计数器,参考上面方案),
然后利用下降沿做一个占空比为1/3的三分频电路
然后将两个信号相或(或者两个占空比为2/3的三分频相与)
code
// 占空比为50%的三分频电路
// 想一下其他奇分频的电路应该如何设计
module div3(clk, rst_n, clk_3
);
input clk,rst_n;
output clk_3;
wire clk,rst_n;
wire clk_3;
reg [1:0]count_pos,count_neg;
always @(posedge clk, negedge rst_n) begin
if(!rst_n)
count_pos<=2'b00;
else
if(count_pos==2'b10)
count_pos<=2'b00;
else
count_pos<=count_pos+1'b1;
end
always @(negedge clk, negedge rst_n) begin
if(!rst_n)
count_neg<=2'b00;
else
if(count_neg==2'b10)
count_neg<=2'b00;
else
count_neg<=count_neg+1'b1;
end
assign clk_3 = count_neg[1] || count_pos[1];
endmodule
仿真结果