原创 基于FPGA的双输入单输出模糊控制器

2007-1-16 00:59 3351 6 6 分类: FPGA/CPLD
摘 要 :本文介绍了一种基于FPGA的双输入单输出模糊控制器的简化设计,并根据控制器的要求利用超高速集成电路硬件描述语言VHDL(Very High Speed Integrated Circuit Hardware Description Language)[1]设计了加法器、减法器等运算器。整个设计过程采用自定向下的设计方法,并在MAXPLUSⅡ10.2环境下通过编译和仿真。
英文摘 要 :The paper presents a design of fuzzy controller with double inputs and single output based on FPGA. The fuzzy controller builded by VHDL consists of adder and subtracter etc.The design takes top-down mathod. It passed the compilation and simulation
关键词: FPGA 模糊控制器 VHDL 自顶向下

1 引言
模糊控制不需要控制对象的精确数学模型,是一种基于规则的控制,依据操作人员的控制经验和专家的知识,通过查表得到控制量。因此,模糊控制器具有响应快、超调小、鲁棒性强等特点。它能够克服系统中模型参数变化和非线性等不确定因素,在大滞后、非线性系统中得到广泛应用。
随着EDA技术得发展,FPGA在数字逻辑系统中发挥越来越重要的作用,采用硬件描述语言的硬件电路设计方法得到了广泛应用。本文利用VHDL硬件描述语言在FPGA芯片上设计了一种简化的模糊控制器。


2 模糊控制器的设计
2.1 模糊控制器系统框图
由于一维模糊控制器的动态性能不能令人满意,三维及三维以上的模糊控制器结构太复杂,建立模糊控制规则比较困难,因此一般采用双输入单输出的二维模糊控制器。其系统框图如图1所示,输入为误差e和误差变化率ec,输出为控制量u。


点击看大图


图1 模糊控制系统框图
2.2 提取控制总表
论域和模糊状态应根据问题的实际情况而定,现在假设e,ec和u的模糊子集均为{NB,NM,NS,ZO,PS,PM,PB},模糊论域均为[-4,4],设e的基本论域为[-2,2],ec的基本论域为[-1,1],u的基本论域为[-5,5]。则ke=2,kc=4,ku=1.25。打开MATLAB中的模糊逻辑工具箱,在模糊控制单元中输入以上参数,并选择合适的隶属度函数曲线、模糊推理方法和解模糊化方法,建立模糊控制规则库[2]。模糊推理,解模糊化等过程由计算机完成,打开Rule View提取模糊控制总表,然后乘上比例因子ku,把论域内的模糊值转化为实际值,得到实际的控制表[3]。


3 FPGA实现
根据模糊控制器的特点,采用模块化设计方法。模糊控制模块如图2所示,clk为全局时钟,g和f为输入给定和反馈,u为输出控制量,设g,f和u地位数为八位。模糊控制模块内部结构分为下四个模块:JIANFA模块,LISANHUA模块JIANBIAO模块和CHULI模块,如图3所示。


点击看大图


图 2 模糊控制模块


点击看大图


图 3 模糊控制顶层文件原理图
JIANFAQI模块主要是利用给定值g和反馈值f计算误差e和误差变化率ec。进行减法运算时,总是数值大的减去数值小的,正负号分别由eo和co标识,不需要考虑溢出和借位等问题。其主要的VHDL语言描述如下所示:
begin
process(clk)
begin
if clk'event and clk='1'then
if f>=g then
a<=f-g;
m<='1';
elsif f<g then
a<=g-f;
m<='0';
end if; --计算误差
b<=a;
n<=m;
end if;
end process;
process(clk)
begin
if clk'event and clk='1'then
if m='0' and n='0' then
if a>=b then
ec<=a-b;
co<='0';
elsif a<b then
ec<=b-a;
co<='1';
end if;
elsif m='0'and n='1' then
ec<=a b;
co<='0';
elsif m='1' and n='0' then
ec<=a b;
co<='1';
elsif m='1' and n='1' then
if a>=b then
ec<=a-b;
co<='1';
elsif a<b then
ec<=b-a;
co<='0';
end if;
end if; --计算误差变化率
LISANHUA模块的作用是把JIANFAQI模块得到的误差e和误差变化率ec在各自的论域范围内进行离散处理。离散时把量化因子ke和kc乘入,这样可以避免编写乘法模块,简化了过程,减少了占用资源,以下是误差e离散化的VHDL语言描述,误差变化率ec与之类似。
begin
process(clk)
begin
if clk'event and clk='1'then
if eo='0' then
if e<="0000001" then
elunyu<="0000";

elsif "00000001"<e and e<="00000011" then
elunyu<="0001";

elsif "00000011"<e and e<="00000101" then
elunyu<="0010";

elsif "00000101"<e and e<="00000111" then
elunyu<="0011";


elsif "00000111"<e and e<="11111111" then
elunyu<="0100";


end if;


elsif eo='1' then
if e<="00000001" then
elunyu<="0000";

elsif "00000001"<e and e<="00000011" then
elunyu<="1001";

elsif "00000011"<e and e<="00000101" then
elunyu<="1010";

elsif "00000101"<e and e<="00000111" then
elunyu<="1011";


elsif "00000111"<e and e<="11111111" then
elunyu<="1100";


end if;
end if;
JIANBIAO模块的作用是把控制总表用VHDL语言的形式描述,此控制表是模糊控制表乘上比例因子ku后的实际值,表格描述采用case…when结构,如下所示:
begin
process(elunyu,eclunyu)
variable tmp: std_logic_vector(7 downto 0);
begin
tmp:=elunyu&eclunyu;
case tmp is
when"11001100"=>
result<="00000101";
co<='1';
when"11001011"=>
result<="00000010";
co<='1';
……
when others =>
result<="00000000";
co<='0';
end case;
end process;
由于控制表中的数是当前控制变化量,还不能直接作用于被控对象,CHULI模块的作用就是根据当前控制变化量,在前一次控制量的基础上进行运算得到此次控制量。同时规定控制量的上下限,上限根据具体情况而定,下限是零。主程序如下:
begin
process(clk)
begin
if clk'event and clk='1'then
if ci='0' then
if b>="01010000"then
b<="01010000";
elsif b<"01010000"then
b<=a b;
end if;
elsif ci='1' then
if b>=a and b<="01010000"then
b<=b-a;
elsif b>"01010000"then
b<="01010000"-a;
elsif b<a then
b<="00000000";
end if;
end if;
end if;
end process;
process(clk)
begin
if b>="01001101"then
u<="01010000";
else
u<=b;
end if;
end process;


4 仿真结果
该模糊控制系统在MAXPLUSⅡ10.2下编译仿真[4],仿真结果如下:


点击看大图


图4 模糊控制系统仿真波形
由图4中波形可以看出,在给定值g不变的情况下,控制量u随着反馈值f的变化而变化,变化规律与理论上模糊控制系统的输出规律完全一致。


5 结束语
本设计采用FLEX10K10LC84-4芯片,用硬件描述语言VHDL设计了模糊控制器,根据程序资源的大小,可以灵活的选择芯片,也可以根据实际情况很方便地进行修改和调整。经仿真表明,该设计符合模糊控制系统的要求。

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条