|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 BYbread 于 2015-6-1 22:22 编辑
我现在要做一个低通,高通可切换的滤波器,用FPGA控制电子开关来选择滤波器的电阻网络。滤波器将1k-20kHz等分成20个截止频率的电阻网络(5个电子开关,每个电子开关有四个电阻网络),用按键选择,按键包括选择切换、确定和返回。我想做一个两级菜单,并定义了一个枚举类型,用状态机做出了。后来发现有40个状态,太多了。大家有什么好想法!!!
现在用case语句,只列举了5种情况,只有个想法,还没写完。
- type state0 is (s00,s01,s10,s11, --s00低通 s01高通 s10:40dB s11:60dB
- s000,s001,s002,s003,s004, --低通5档
- s010,s011,s012,s013,s014, --高通5档
- s100,s101,s102,s103,s104, --40dB 5档 步进10dB
- s110,s111,s112,s113,s114,s115,s116); --60dB 7档 步进10dB
- signal current0:state0;
- signal current1:state0; --输出的状态
- begin
- process (clk,reset) is
- begin
- if reset='0' then
- current0<=s00;
- current1<=s000;
- keycode<=x"00";
- elsif rising_edge(clk) then
- case current0 is
-
- when s00=> if sel='0' then current0 <= s01; --低通->高通
- elsif enter='0' then current0 <= s000; --低通->滤波器选择
- elsif back='0' then current0 <= s00; --返回首层
- end if;
- when s01=> if sel='0' then current0 <= s10; --低通->高通
- elsif enter='0' then current0 <= s010; --高通->滤波器选择
- elsif back='0' then current0 <= s00; --返回首层
- end if;
-
- when s10=> if sel='0' then current0 <= s11; --40dB->60dB elsif enter='0' then current0 <= s100; --40dB选择
- elsif back='0' then current0 <= s00; --返回首层
- end if;
-
- when s11=>if sel='0' then current0 <= s00; --40dB<-60dB elsif enter='0' then current0 <= s110; --40dB选择
- elsif back='0' then current0 <= s00; --返回首层
- end if;
-
- when s000=> if sel='0' then current0 <= s001; --低通0->1
- elsif enter='0' then current1 <= s000; --确定低通0
- current0 <= s00;
- elsif back='0' then current0 <= s00; --返回滤波器选择
- end if;
-
- when s001=> if sel='0' then current0 <= s002; --低通0->1
- elsif enter='0' then current1 <= s001; --确定低通1
- elsif back='0' then current0 <= s00; --返回滤波器选择
- end if;
- when s002=> if sel='0' then current0 <= s003; --低通0->1
- elsif enter='0' then current1 <= s002; --确定低通2
- elsif back='0' then current0 <= s00; --返回滤波器选择
- end if;
- when s003=> if sel='0' then current0 <= s004; --低通0->1
- elsif enter='0' then current1 <= s003; --确定低通3
- elsif back='0' then current0 <= s00; --返回滤波器选择
- end if;
- when s004=> if sel='0' then current0 <= s000; --低通0->1
- elsif enter='0' then current1 <= s004; --确定低通4
- elsif back='0' then current0 <= s00; --返回滤波器选择
- end if;
-
- when others => null;
-
- end case ;
- end if;
- end process;
复制代码 |
|