原创 基于FPGA的随机数发生器的实现以及利用ChipScope的验证--ZT

2010-6-2 16:08 4548 8 10 分类: FPGA/CPLD

本文主要介绍利用FPGA的自身的特性实现随机数发生器,在Virtex-II Pro开发板上用ChipScope观察随机数序列,以及在PCIe4Base(基于Virtex-4 FPGA)上实现。


基本的原理


随机数在计算机科学中的密码学中有着重要的用途,常常被用作密钥的来源。随机数包括伪随机数以及真随机数。伪随机数是通过一定的算法计算得出,具有类似于随机数的统计特征,这样的发生器称为伪随机数发生器。而真随机数是通过物理现象产生,例如使用电子元件的噪声、核裂变等等作为噪声源[2],这样的随机数发生器叫做物理随机数发生器,也叫做真随机数发生器(TRNG:Ture Random Number Generator)。


基于FPGA的随机数发生器基本原理是利用奇数个反相器组成振荡器作为随机数发生器的噪声源,因为由于FPGA自身的特性--信号传输存在抖动,所以多个反相器组成振荡器输出也不是很稳定的时钟信号,每个振荡器输出不是相同的,这样成为了理想的噪声源,见图1。振荡器输出通过D触发器进行采样输出,采样频率是fs,然后多个采样输出结果经过异或门之后再通过一个D触发器进行采样,采样频率还是fs。这样简单的随机数发生器就完成了。



随机数发生器原理图
图1.随机数发生器原理图[1]


实现


根据前面所述的原理图,进行如下设计:抽样频率是fs为50MHz,用3个反相器组成一个振荡器,共用了25个振荡器。因为整个结构很简单,这里就不多讲述,主要想说的是振荡器的描述。为了避免综合器将振荡器进行一定的优化从而背离当初的设计,所以在代码中添加了属性语句,用于保证网络不被优化掉。见28至31行,36至39行。


1: library IEEE;
2: use IEEE.STD_LOGIC_1164.ALL;
3: use IEEE.STD_LOGIC_ARITH.ALL;
4: use IEEE.STD_LOGIC_UNSIGNED.ALL;
5: ---- Uncomment the following library declaration if instantiating
6: ---- any Xilinx primitives in this code.
7: library UNISIM;
8: use UNISIM.VComponents.all;
9:
10: entity Ring_osc_3 is
11: port ( clk : in STD_LOGIC;
12: D_out : out STD_LOGIC
13: );
14: end Ring_osc_3;
15:
16: architecture Behavioral of Ring_osc_3 is
17: ---------------------------------------
18: -- Interial signal in the Ring_OSC
19: ---------------------------------------
20: signal delay1 : std_logic;
21: signal delay2 : std_logic;
22: signal delay3 : std_logic;
23:
24: ---------------------------------------------------------------------
25: --Attributes to stop delay logic from being optimised.
26: ---------------------------------------------------------------------
27: attribute keep : string;
28: attribute keep of delay1 :signal is "true";
29: attribute keep of delay2 :signal is "true";
30: attribute keep of delay3 :signal is "true";
31:
32: ---------------------------------------------------------------------
33: --Attributes to stop trim logic from being optimised
34: ---------------------------------------------------------------------
35: attribute s : string;
36: attribute s of delay1 : signal is "true";
37: attribute s of delay2 : signal is "true";
38: attribute s of delay3 : signal is "true";
39: 40: ---------------------------------------
41: --Code start
42: ---------------------------------------
43:
44: begin
45: --osc_out is the last invertor output,
46: --and also the output feeds back to the first invertor
47: --invertor 1
48: inv_lut1: LUT1
49: generic map (init => X"1")
50: port map (
51: I0 => delay1,
52: O => delay2);
53:
54: --invertor 2
55: inv_lut2: LUT1
56: generic map (init => X"1")
57: port map (
58: I0 => delay2,
59: O => delay3);
60:
61: --invertor 3
62: inv_lut3: LUT1
63: generic map (init => X"1")
64: port map (
65: I0 => delay3,
66: O => delay1);
67:
68: --D Flip-flop
69: D_ff : FD
70: port map (
71: D => delay3,
72: Q => D_out,
73: C => clk);
74:
75: end Behavioral;
振荡器最后综合出来的结果是(图2):

New Source Wizard

图2. 3个反相器组成的振荡器外加一个D触发器
而随机数发生器的综合结果是(图3):

531-692-virtex4_3.png

图3. 随机数发生器


ChipScope的观察


首先对管脚以及时钟进行约束,为了通过ChipScope观察随机数的输出序列,还需要添加ICON以及ILA IP core。操作如下,在ISE窗口左侧的source栏中右键选择new source,然后见到New Source Wizard窗口。输入一个名字,然后点击OK。然后在Source窗口中看到生成的cdc source file。接下来就是配置触发信号、观察信号、时钟信号等属性。



点击看大图
图3. New Source Wizard


这里不细说如何配置,具体见参考文献3。


在这里,观察的RNG输出信号同时作为触发信号来配置。配置完后编译实现。然后再Process栏中选择Analyze Design Using ChipScope 同时连接Virtex-II Pro板子并且上电。进入ChipScope Pro Analyzer界面后点击工具栏中的OPEN Cable/Search JTAG Chain,然后看到JTAG Chain上的三个设备。右键选中FPGA芯片(XC2VP30),选择配置,选中刚才生成的bit文件。配置完成后会出现图5的信号列表。
图5中Trigger Setup是触发配置,Waveform 是波形列表。



JTAG Chain
图4. JTAG Chain



信号观察列表
图5. 信号观察列表


双击 Waveform打开波形观察窗口,因为触发信号就是需要观察的信号,所以这里不用设置触发。在工具栏中点击531-696-virtex4_6_1.png ,你就可以观察到随机数的输出波形了,图6。肉眼观察信号比较随机,但是没有定性的测试。

点击看大图
图6. 随机数输出波形


随机数的测试


常用的测试随机数的工具有ENT[4],DIEHARD[5]等。而这些工具需要大量的随机数(最好是10M以上的数据)才可以测试,而用ChipScope最多一次只能才是65536bit的数据,这样的测试肯定是不行的。所以将同样的设计放到了PCIeV4base,这个板子具有PCIe插槽,用的是Virtex-4的FPGA芯片。PC机通过PCIe桥接芯片读取数据,这样很方便得到大量的随机数数据。


具体的原理图,图7。看起来有些麻烦,涉及到了FIFO,Wishbone上添加从设备,以及Linux下PCIe的编程,幸好相关的东西已经有实例和SDK提供,只要做一些修改就可以了。

随机数发生器作为WISHBONE BUS的从设备的原理图
图7. 随机数发生器作为WISHBONE BUS的从设备的原理图


最后通过软件得到15MB的数据。然后通过ENT工具进行测试,测试的结果如下:


D:\Document\RNG\ent>ent out
Entropy = 7.999890 bits per byte.


Optimum compression would reduce the size
of this 16777212 byte file by 0 percent.


Chi square distribution for 16777212 samples is 2563.57, and randomly
would exceed this value less than 0.01 percent of the times.


Arithmetic mean value of data bytes is 127.5056 (127.5 = random).
Monte Carlo value for Pi is 3.141033445 (error 0.02 percent).
Serial correlation coefficient is -0.000568 (totally uncorrelated = 0.0).


测试的结果分析,得到随机数比较理想。


后续的工作


以后的工作是想着利用Virtex-II Pro开发板得到大量的随机数,现在的主要的问题是如何将大量的数据存储起来呢。其中一个办法是利用处理器,然后通过编程采集数据,存到CF卡中,或者通过串口直接传输到计算机中,都是可以去尝试的。
读者如果有什么更好的建议或者意见,或者发现什么错误,请联系本人。yq000cn@gmail.com.


参考文献
Knut Wold and Chik How Tan, Analysis and Enhancement of Random Number Generator in FPGA Based on Oscillator Rings
随机数----wikipedia
ChipScope Core Generator 使用说明
A Pseudorandom Number Sequence Test Program
DIEHARD


index from http://xilinx.eetrend.com/blog/531


 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

fuxiao123_401762695 2010-6-2 22:46

咱也转载的,还不是很清楚,不好意思啊

用户1588098 2010-6-2 19:51

博主:您好!问下Xilinx的器件也可以使用wishbone总线吗?谢谢

用户767365 2009-4-29 10:37

虽然过了好长时间了,我才看到你的存在,真的很高兴。是的,对于射频的部分,真的是很难,我发了一个多月,还没完成基本的收发。大家努力呀。我会向你学习的。

用户22776 2007-10-9 05:13

楼主我也正在调试STC的单片机的SPI接口,怎么也调不通,能否给我一份你的STC单片机的硬件SPI代码,最好是C的SPI收发代码,重谢了.我的邮件是

raychanmail@gmail.com

用户1383196 2007-6-26 15:14

看过留名,楼主工作这么有心,一切都会慢慢的好起来的

用户15552 2007-2-5 22:26

我们具有高频经验,你是不是要做监控的产品?软件是你自己写吗?

sunny95998@163.com

用户62866 2006-12-8 12:03

我们正在设计使用51单片机的SPI接口,看到你的文章,我们想多了解点东西,能给我发E-MAIL:whaig@163.com多谢!

用户16579 2006-12-6 14:59

您好,我们最近也正在用nRF2401做测试板,我想请教个问题,天线部分您是怎样选用的?

我的邮箱是:zuozh_025@sohu.com

希望能多跟您多交流!

谢谢!

 

相关推荐阅读
fuxiao123_401762695 2013-07-28 10:39
《TMS320F2833x DSP应用开发与实践》一书已上市,欢迎大家捧场
  《TMS320F2833x DSP应用开发与实践》一书已上市,欢迎大家捧场,谢谢! 亚马逊:http://www.amazon.cn/dp/B00DVGQ28Y/ref=cm_s...
fuxiao123_401762695 2012-01-11 19:50
我竟然是05年6月就注册了eetcn。。。
我竟然是05年6月就注册了eetcn。。。...
fuxiao123_401762695 2011-07-30 10:55
亚洲最大风电场辉腾格勒见闻
 真是一望无际的大草原啊  ...
fuxiao123_401762695 2011-03-17 21:39
赛灵思和Synopsys联手推出业界首部开发方法手册
专门针对SoC设计中的FPGA原型设计开发 手册收录了原型设计的最佳实践方案 2011 年 3 月10 日,中国北京——全球可编程逻辑解决方案领先厂商赛灵思公司(NASDAQ:XLNX))今日宣布...
fuxiao123_401762695 2011-03-04 16:11
system generator硬件协同仿真时序不收敛的简单解决办法
system generator硬件协同仿真时,一些很简单的电路也无法达到时序收敛,这个问题困扰了我很久。在读了《Verilog HDL高级数字设计》一段时间之后,突然明白,原来就败在模块的laten...
fuxiao123_401762695 2011-03-03 16:03
ISE13.1调用Modelsim10.0出现的一点小问题及解决过程
ISE13.1调用Modelsim10.0出现的一点小问题及解决过程软件环境:ISE13.1+System GeneratorMatlab2010bModelsim SE 10.0已编译Xilinx器...
EE直播间
更多
我要评论
2
8
关闭 站长推荐上一条 /3 下一条