【转】也谈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波形:


posted @ 2011-07-29 17:41  sangreal  阅读(1088)  评论(0编辑  收藏  举报