关于环形振荡器的问题

[复制链接]
4569|6
 楼主| sunwind45 发表于 2011-6-17 10:04 | 显示全部楼层 |阅读模式
用Spartaniii可以实现环形振荡器吗? XC3S400

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

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

在fpga里实现环形振荡器,有什么起振条件吗?还有,看例子里使用LUT,延迟是固定的吗?不明白为啥不直接用与门或非门实现?!
dan_xb 发表于 2011-6-17 13:16 | 显示全部楼层
你的例子啥样子的?
dan_xb 发表于 2011-6-17 13:56 | 显示全部楼层
本帖最后由 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

评论

@yq327115059 :你好,我目前也在做基于fpga的ro puf,但是遇到了点问题,仿真的时候,两个RO链路没有办法得到不同的频率,不知道可否交流一下呢  发表于 2021-4-1 20:03
前辈,这么多年过去了,不知道你还记得你这个回答吗?我正在尝试用FPGA 实现PUF结构失败了n次,希望前辈还能收到这条评论,来救救我!!!感激不尽  发表于 2019-6-17 16:02
午后苦丁茶 发表于 2011-6-19 21:27 | 显示全部楼层
bairan168 发表于 2011-6-19 21:37 | 显示全部楼层
咋没结果呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

178

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部