您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 附录A------基于粒子群算法的PID控制器的FPGA实现源程序
附录A基于粒子群算法的PID控制器的FPGA实现源程序--pso算法控制模块源程序libraryieee;useieee.std_logic_1164.all;--useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;--uselgQQ_pso.all;entitycontrolisport(ctr_clk_P,ctr_ctr_res_l:instd_logic;ov1_1:instd_logic;--初始化结束信号ov2_1:instd_logic;--从初始化后的32个个体中选择全局最优结束信号ov3_1:instd_logic;--局部,全局最优更新结束信号ov4_1:instd_logic;--个体速度计算并判断阀值结束信号ov5_1:instd_logic;--个位置计算并判断阀值结束信号st2_1:outstd_logic;--启动从初始化后的32个个体中选择全局最优选择模块st3_1:outstd_logic;--启动局部,全局最优更新模块st4_1:outstd_logic;--启动个体速度计算并判断阀值模块st5_1:outstd_logic;--启动个位置计算并判断阀值模块cmux1:outstd_logic;cmux2:outstd_logic;cmux3:outstd_logic;cmux4:outstd_logic;cmux5:outstd_logic;random_clk:outstd_logic;wr_1,rd_1:outstd_logic;lz_cnt:outstd_logic_vector(4downto0);iterance:outstd_logic_vector(7downto0));endcontrol;architecturebehavioralofcontrolistypestatesis(idle,st1,st2,st3,st4,st5,st6,stop);signalcurrent_state:states;signalflag:std_logic;--mux5signallzcnt:std_logic_vector(4downto0);signaliter:std_logic_vector(7downto0);beginprocess(ctr_clk_P,ctr_res_1,current_state)--系统主状态机beginifctr_res_1='1'thencurrent_state=idle;elsifctr_clk_P'eventandctr_clk_P='1'thencasecurrent_statesiswhenidle=--系统复位wr_1='1';rd_1='0';st2_1='0';st3_1='0';cmux1='0';cmux2='0';cmux3='0';cmux4='0';--mux5='0';random_clk='0';flag='0';iter=(others='0');lzcnt=(others='0');current_states=st1;whenst1=--群体初始化wr_1='1';rd_1='0';st2_1='0';st3_1='0';st4_1='0';st5_1='0';cmux1='0';cmux2='0';cmux3='0';cmux4='0';random_clk='0';--mux5='0';ifov1_1='1'thencurrent_state=st2;wr_1='0';rd_1='1';elsecurrent_state=st1;endif;whenst2=--从初始化后的32个个体中选择全局最优wr_1='0';rd_1='1';st2_1='1';st3_1='0';st4_1='0';st5_1='0';cmux1='1';cmux2='0';cmux3='1';cmux4='0';random_clk='0';--mux5='0';ifov2_1='1'thencurrent_state=st3;sta_sel_1='0';elsecurrent_state=st2;endif;whenst3=--局部,全局最优更新wr_1='0';rd_1='1';st2_1='0';st3_1='1';st4_1='0';st5_1='0';cmux1='1';cmux2='1';cmux3='1';cmux4='1';random_clk='1';ifov3_1='1'thencurrent_state=st4;st3_1='0';elsecurrent_state=st3;endif;whenst4=--个体速度计算并判断阀值wr_1='0';rd_1='0';st2_1='0';st3_1='0';st4_1='1';st5_1='0';cmux1='1';cmux2='1';cmux3='1';cmux4='1';random_clk='1';ifov4_1='1'thencurrent_state=st5;st4_1='0';elsecurrent_state=st4;endif;whenst5=--个体位置计算并判断阀值wr_1='0';rd_1='0';st2_1='0';st3_1='0';st4_1='0';st5_1='1';cmux1='1';cmux2='1';cmux3='1';cmux4='1';random_clk='1';ifov5_1='1'thenst5_1='0';flag=notflag;ifflag='1'thencurrent_state=st6;wr_1='1';elsecuttent_state=st4;endif;elsecurrent_state=st5;endif;whenst6=--新个体位置,速度,局部最优更新后的数据存储wr_1='0';rd_1='0';st2_1='0';st3_1='0';st4_1='0';st5_1='0';cmux1='1';cmux2='1';cmux3='1';cmux4='1';random_clk='0';iflzcnt=11111thenlzcnt=00000;iter=iter+1;elselzcnt=lzcnt+1;endif;ifiter=01111111thencurrent_state=stop;elsecuttent=st3;endif;whenstop=--迭代结束cuttent_state=stop;wr_1='0';rd_1='0';st2_1='0';st3_1='0';st4_1='0';st5_1='0';cmux1='0';cmux2='0';cmux3='0';cmux4='0';whenothers=current_state=stop;endcase;endif;endprocess;cmux5=flag;iterance=iter;lz_cnt=lzcnt;endBehavioral;--初始化粒子个体模块libraryieee;useieee.std_logic_1164.all;--useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;usework.lgQQ_pso.all;entityini_particleisport(ckl_P,res_1:instd_logic;ad_msb:instd_logic;address:outstd_logic_vector(m-1downto0);--(m-1downto0);p:outstd_logic_vector(31downto0);v:outstd_logic_vector(23downto0);over_1:outstd_logic);endini_particle;architecturebehavioralofini_particleissignalz:std_logic_vector(31downto0);signalqz:std_logic;signalcnt:std_logic_vector(m-1downto0);beginprocess(clk_P,res_1)beginifres_1='1'thenz=01010010010001010010101000011101;cnt=(others='0');--0000;over_1='0';elsifclk_P'eventandclk_P='1'thenz(31downto1)=z(30downto0);z(0)=qz;p=z(1)&z(3)&z(4)&z(5)&z(7)&z(8)&z(10)&z(12)&z(13)&z(15)&z(17)&z(21)&z(23)&z(27)&z(30)&z(31)&z(0)&z(2)&z(6)&z(9)&z(11)&z(14)&z(16)&z(18)&z(19)&z(20)&z(22)&z(24)&z(26)&z(28)&z(29);v=z(1)&z(3)&z(5)&z(7)&z(9)&z(7)&z(11)&z(13)&z(15)&z(17)&z(19)&z(21)&z(23)&z(0)&z(2)&z(4)&z(6)&z(8)&z(10)&z(12)&z(14)&z(16)&z(18)&z(20)&z(22);cnt=cnt+1;address=cnt;--ad_msb&ifcnt=11111thenover_1='1';endif;endif;endprocess;qz=z(31)xorz(6)xorz(1)xorz(4)xorz(0);endBehavioral;--多路选择器Mux1模块源程序libraryieee;useieee.std_logic_1164.all;--useieee.std_logic_arith.all;--useieee.std_logic_unsigned.all;--usework.canshu.all;entitymux1isport(mux_ctr1,mux_ctr2:instd_logic;xi1,xi2:instd_logic_vector(31downto0);vi1,vi2:instd_logic_vector(23downto0);ad1,ad2,ad3:instd_logic_vector(4downto0);wad:outstd_logic_vector(4downto0);rad:outstd_logic_vector(4downto0);vi:outstd_logic_vector(23downto0);xi:outstd_logic_vector(31downto0));endmux1;architectureBehavioralofmux1isbeginprocess(mux_ctr1,mux_ctr2,xi1,xi2,vi1,vi2,ad1,ad2,ad3)beginifmux_ctr1='0'then--接收初始化模块的数据xi=xi1;vi=vi1;wad=ad1;else--接收经过一代更新的新个体数据xi=xi2;vi=vi2;wad=ad3;endif;ifmux_ctr2='0'then--读取刚初始化后的数据地址rad=ad2;else--读取新个体数据地址rad=ad3;endif;endprocess;endarchitecture;--多路选择器Mux2模块源程序libraryieee;useieee.st
本文标题:附录A------基于粒子群算法的PID控制器的FPGA实现源程序
链接地址:https://www.777doc.com/doc-4440461 .html