生活随笔
收集整理的這篇文章主要介紹了
基于FPGA的混沌系统实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于FPGA的混沌信號發生器系統介紹:
由于模擬電路元器件的參數會受溫度、老化等環境原因影響,而混沌系統又是對初始值極度敏感的系統,因此使用模擬電路實現混沌系統的效果非常有限。而數字電路不存在器件溫度、老化問題,器件參數不會影響其結果,實現效果較模擬電路更加理想,故現階段使用數字點路實現混沌系統成為主流。目前有兩種實現方法,一種是基于歐拉算法、龍格庫塔的離散算法編寫底層硬件代碼實現混沌系統,另外一種是使用Matlab 的DSP BUILDER庫搭建混沌數字電路,自動生成verilog代碼。兩種方法各有優點,前者設計更加靈活但編程復雜,后者不需要編程但往往受器件約束。本文詳細介紹了使用的四階龍格庫塔算法實現混沌系統過程,實現了一個具有隱藏多穩態吸引子的混沌系統發生器。圖1.1是該系統的整體硬件框架。PC端根據算法使用quartus II EDA軟件編寫硬件代碼并生成下載文件,通過下載器下載至 CycloneⅣ的EP4CE10F17C8N FPGA核心板,FPGA控制并輸送數字信息給ACM9767DAC模塊,由該模塊生成模擬信號再輸送給示波器顯示。
以洛倫茲系統為例,使用改進的歐拉算法實現 ,有不足的地方還望指正
module chaos_4D
(clk
,rst_n
,x
,y
,z
);input clk
;input rst_n
;output signed
[31:0]x
,y
,z
;parameter t
= 12;//時間
1/2^12reg signed
[31:0] x_0
= 32'b0_00000_00000100000000000000000000
; //初始值,由定點數表示一位符號位,五位整數位和
26位小數位,初始值已經被壓縮reg signed
[31:0] y_0
= 32'b0_00000_00000010000000000000000000
; //y_0
=0reg signed
[31:0] z_0
= 32'b0_00000_00000010000000000000000000
; //z_0
=0reg signed
[31:0] c
= 32'b0_00010_10101010101010101010101011
; //8/3reg signed
[31:0] xz_extend_6
;//比例壓縮,由于怕計算過程內部出現比五位整數位大的數,導致內部計算溢出,x
,y
,z都壓縮
64。例如dx
= xy
+z
,將x
,y
,z壓縮
64,原
=原式變換為d64x
= 64x
*64y
+64z等價于dx
=32xy
+z
;即n項式要乘于
32^(n
-1) reg signed
[31:0] xy_extend_6
;//同上reg signed
[31:0] fx
;//改進歐拉算法中間值
reg signed
[31:0] fy
;
reg signed
[31:0] fz
;reg signed
[31:0] x_n_temp
;//計算的中間值,用來存儲x_n的值
reg signed
[31:0] y_n_temp
;
reg signed
[31:0] z_n_temp
;reg signed
[31:0] x_n
;//計算的中間值
reg signed
[31:0] y_n
;
reg signed
[31:0] z_n
;reg signed
[31:0] fx_temp
;//改進歐拉算法的中間值
reg signed
[31:0] fy_temp
;
reg signed
[31:0] fz_temp
;reg
[2:0]state
;
reg cnt
;
reg flag
;parameter s0
=3'd0
,s1
=3'd1
,s2
=3'd2
,s3
=3'd3
;wire signed
[63:0]xz_64
;//兩個
32位的數相乘是
64位wire signed
[63:0]xy_64
;wire signed
[63:0]cz_64
;wire signed
[31:0]ay
;//用移位寄存器來計算整數乘wire signed
[31:0]ax
;wire signed
[31:0]bx
;wire signed
[31:0]xz
;/對xz_64位數進行截取后的結果wire signed
[31:0]xy
;wire signed
[31:0]cz
;wire signed
[31:0]x_temp
;//結果,由于可能為負數,一般加上一個正數后才輸出,保證輸出全為正數wire signed
[31:0]y_temp
;wire signed
[31:0]z_temp
;assign ay
= (y_n
<<<3) + (y_n
<<<1);//y
*a
//移位寄存器來進行乘
10操作assign ax
= (x_n
<<< 3) + (x_n
<<<1) ; //x
*a 同時assign bx
= (x_n
<<< 5) - (x_n
<<< 2) ; // b
*x
//移位寄存器來進行乘
28操作,先乘
32減去乘
4assign xz_64
= x_n
* z_n
;//乘法assign xy_64
= x_n
* y_n
;assign cz_64
= c
* z_n
;assign xz
= {xz_64
[63],xz_64
[56:26]} ;//截取規則為保留符號位,摒棄低
26位小數位(可忽略)和高
6位整數位(一般做了壓縮后,都是為
0)assign xy
= {xy_64
[63],xy_64
[56:26]} ;assign cz
= {cz_64
[63],cz_64
[56:26]} ;always@
(posedge clk
or negedge rst_n
)if(!rst_n
)//復位beginflag
<= 1;xz_extend_6
<= 0;xy_extend_6
<= 0;fx
<= 0;fy
<= 0;fz
<= 0;x_n_temp
<= 0;y_n_temp
<= 0;z_n_temp
<= 0;x_n
<= x_0
;y_n
<= y_0
;z_n
<= z_0
;fx_temp
<= 0;fy_temp
<= 0;fz_temp
<= 0;cnt
<= 0; state
<= 0;end
elsebegin case
(state
)s0
:beginxz_extend_6
<= xz
<<< 6; //乘
64xy_extend_6
<= xy
<<< 6; //乘
64state
<= state
+1'b1
;flag
<= 0;ends1
:beginfx
<=-ax
+ay
;fy
<= -xz_extend_6
+ bx
- y_n
;fz
<= -cz
+ xy_extend_6
;//改進歐拉第一步操作,根據cnt的值對fx
,fy
,fz進行更新
if( cnt
== 1 )//若已完成兩步操作,進入到最后一步beginstate
<= state
+ 2'd2
;cnt
<= 0;end
else//進入到下一步操作state
<= state
+ 1'b1
;ends2
:beginx_n_temp
<= x_n
;//保存x_n的值y_n_temp
<= y_n
;z_n_temp
<= z_n
;x_n
<= x_n
+ (fx
>>>(t
-1));//對x_n進行關于改進歐拉算法的計算y_n
<= y_n
+ (fy
>>>(t
-1));z_n
<= z_n
+ (fz
>>>(t
-1));cnt
<= 1;fx_temp
<= fx
;//保存fx的值fy_temp
<= fy
;fz_temp
<= fz
;state
<= s0
;end s3
:beginx_n
<= x_n_temp
+ (fx
>>>t
) + (fx_temp
>>>t
);//改進歐拉算法的結果y_n
<= y_n_temp
+ (fy
>>>t
) + (fy_temp
>>>t
);z_n
<= z_n_temp
+ (fz
>>>t
) + (fz_temp
>>>t
);state
<= s0
;flag
<= 1;enddefault
: beginx_n
<= x_0
;y_n
<= y_0
;z_n
<= z_0
;state
<= s0
;end endcaseendassign x_temp
= (flag
)?x_n
:x_temp
;//flag為
1,x_n才能作為有效輸出,其余時候都是中間值assign y_temp
= (flag
)?y_n
:y_temp
;assign z_temp
= (flag
)?z_n
:z_temp
; assign x
= x_temp
+ 32'b0000_0100_0000_0000_0000_0000_0000_0000
;//加個
1保證輸出為正assign y
= y_temp
+ 32'b0000_0100_0000_0000_0000_0000_0000_0000
;assign z
= z_temp
+ 32'b0000_0100_0000_0000_0000_0000_0000_0000
;endmodule
//tb文件
`timescale 1ns
/1ns
`define clock_period
20module gaijin_euler_tb
;reg clock
;reg Rst_n
;wire
[31:0]x
,y
,z
;wire
[11:0]x_n
,y_n
,z_n
;assign x_n
= x
[27:16];assign y_n
= y
[27:16];assign z_n
= z
[27:16];chaos_4D fourD0
(.clk
(clock
),.rst_n
(Rst_n
),.x
(x
),.y
(y
),.z
(z
));integer handle_x
,handle_y
,handle_z
;
integer i
;
initialbeginhandle_x
= $fopen
("data_x.txt");handle_y
= $fopen
("data_y.txt");handle_z
= $fopen
("data_z.txt");//handle_w
= $fopen
("data_w.txt");endinitial clock
= 1'b1
;always initialbeginRst_n
= 1'b0
;Rst_n
= 1'b1
;for(i
=0;i
<400000;i
=i
+1'b1
)beginbegin$fdisplay
(handle_x
,"%d",x
);//將數據保存為txt文件,十六進制格式的數據,可以通過matlab觀察相位圖$fdisplay
(handle_y
,"%d",y
);$fdisplay
(handle_z
,"%d",z
);// $fdisplay
(handle_w
,"%d",w
);endend$stop
;end
endmodule
總結
以上是生活随笔為你收集整理的基于FPGA的混沌系统实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。