【转】也谈FPGA(or ASIC?)三分频电路
记得这曾经是我同学碰到的一道面试题,回来后他出给我们,弱弱的我自然是不知道咯。近日旧事重提,却忘记当时给的解答了。
在网络上一搜索,实现方式还真不少,玆举例如下:
第一种方法是用计数器进行N分频,N这里是奇数。然后利用分频后占空比不是50%的输出信号和原始时钟信号通过组合逻辑处理,构成50%占空比的奇数分频器。
第二种思路是,将第一种方法类似的计数器的输出用时钟信号的下降沿延时半个时钟周期,然后两者相与或者或
产生50%占空比的分频信号:
always@(negedge resetn or posedge clk)
begin
if (resetn==1'b0)
begin
cnt1[1:0]<=2'd0;
clk1<=1'b0;
end
else
begin
if(cnt1[1:0]==2'd2)
begin
cnt1[1:0]<=2'd0;
clk1<=1'b1;
end
else
begin
cnt1[1:0]<=cnt1[1:0]+1;
clk1<=1'b0;
end
end
end
always@(negedge resetn or negedge clk)
begin
if (resetn==1'b0)
begin
clk2<=2'd0;
end
else
begin
clk2<=clk1;
end
end
assign clk_out = clk1 | clk2;
第三种方法,异步电路实现:
最后一种方法,算是我想到的,因为我没见过一样的(但是前人肯定早想到了)。用同步置位的方式实现,似乎是Glitch free?
reg [1:0] d_reg;
wire clk_ctrl;
assign clk_ctrl = clk_1 ^ d_reg[1];
always@(posedge clk_ctrl)
begin
if (d_reg==2)
d_reg<=2'b00;
else
d_reg<=d_reg+1;
end
SignalTap II波形: