关于环形振荡器的问题

2020-01-27 13:44发布

用Spartaniii可以实现环形振荡器吗? XC3S400

我拷贝了网上的一个例子,下载进去,没啥反应。

这种自震荡的东西能仿真吗?

在fpga里实现环形振荡器,有什么起振条件吗?还有,看例子里使用LUT,延迟是固定的吗?不明白为啥不直接用与门或非门实现?!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
dan_xb
2020-01-27 23:09
本帖最后由 dan_xb 于 2011-6-17 14:00 编辑

给你一个可实现的例子:
这个产生大约1.5MHz的时钟(Spartan-3),随温度变化
module ring_osc(osc_out);  //about 1.5MHz out Clock
  output osc_out;
  (* s = "TRUE" *) wire delay1,delay2,delay3,delay4;
  (* s = "TRUE" *) wire delay5,delay6,delay7,delay8;
  (* s = "TRUE" *) wire delay9,delay10,delay11,delay12;
  (* s = "TRUE" *) wire delay13,delay14,delay15,delay16;
  (* s = "TRUE" *) wire invert;
  wire clk_div2,clk_div4,clk_div8,clk_div16,clk_div32;
  
  (* LOC = "SLICE_X0Y0" *)  LUT1 #(.INIT(2'b10)) delay1_lut  (.O(delay1) ,.I0(invert) );
  (* LOC = "SLICE_X0Y1" *)  LUT1 #(.INIT(2'b10)) delay2_lut  (.O(delay2) ,.I0(delay1) );
  (* LOC = "SLICE_X0Y2" *)  LUT1 #(.INIT(2'b10)) delay3_lut  (.O(delay3) ,.I0(delay2) );
  (* LOC = "SLICE_X0Y3" *)  LUT1 #(.INIT(2'b10)) delay4_lut  (.O(delay4) ,.I0(delay3) );
  (* LOC = "SLICE_X0Y4" *)  LUT1 #(.INIT(2'b10)) delay5_lut  (.O(delay5) ,.I0(delay4) );
  (* LOC = "SLICE_X0Y5" *)  LUT1 #(.INIT(2'b10)) delay6_lut  (.O(delay6) ,.I0(delay5) );
  (* LOC = "SLICE_X0Y6" *)  LUT1 #(.INIT(2'b10)) delay7_lut  (.O(delay7) ,.I0(delay6) );
  (* LOC = "SLICE_X0Y7" *)  LUT1 #(.INIT(2'b10)) delay8_lut  (.O(delay8) ,.I0(delay7) );
  (* LOC = "SLICE_X0Y8" *)  LUT1 #(.INIT(2'b10)) delay9_lut  (.O(delay9) ,.I0(delay8) );
  (* LOC = "SLICE_X0Y9" *)  LUT1 #(.INIT(2'b10)) delay10_lut (.O(delay10),.I0(delay9) );
  (* LOC = "SLICE_X0Y10" *) LUT1 #(.INIT(2'b10)) delay11_lut (.O(delay11),.I0(delay10));
  (* LOC = "SLICE_X0Y11" *) LUT1 #(.INIT(2'b10)) delay12_lut (.O(delay12),.I0(delay11));
  (* LOC = "SLICE_X0Y12" *) LUT1 #(.INIT(2'b10)) delay13_lut (.O(delay13),.I0(delay12));
  (* LOC = "SLICE_X0Y13" *) LUT1 #(.INIT(2'b10)) delay14_lut (.O(delay14),.I0(delay13));
  (* LOC = "SLICE_X0Y14" *) LUT1 #(.INIT(2'b10)) delay15_lut (.O(delay15),.I0(delay14));
  (* LOC = "SLICE_X0Y15" *) LUT1 #(.INIT(2'b10)) delay16_lut (.O(delay16),.I0(delay15));
  (* LOC = "SLICE_X0Y16" *) LUT1 #(.INIT(2'b01)) invert_lut  (.O(invert) ,.I0(delay16));
  
  FDCPE #(.INIT(1'b0)) toggle1_flop (.Q(clk_div2), .C(invert),   .CE(1'b1),.CLR(1'b0),.D(~clk_div2), .PRE(1'b0));  //24MHz
  FDCPE #(.INIT(1'b0)) toggle2_flop (.Q(clk_div4), .C(clk_div2), .CE(1'b1),.CLR(1'b0),.D(~clk_div4), .PRE(1'b0));  //12MHz
  FDCPE #(.INIT(1'b0)) toggle3_flop (.Q(clk_div8), .C(clk_div4), .CE(1'b1),.CLR(1'b0),.D(~clk_div8), .PRE(1'b0));  //6MHz
  FDCPE #(.INIT(1'b0)) toggle4_flop (.Q(clk_div16),.C(clk_div8), .CE(1'b1),.CLR(1'b0),.D(~clk_div16),.PRE(1'b0));  //3MHz
  FDCPE #(.INIT(1'b0)) toggle5_flop (.Q(clk_div32),.C(clk_div16),.CE(1'b1),.CLR(1'b0),.D(~clk_div32),.PRE(1'b0));  //1.5MHz
  
  BUFG BUFG1 (.O(osc_out),.I(clk_div32));
  
endmodule

一周热门 更多>