基于FPGA的简易电子琴实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA的简易电子琴实现
李全
摘要
本系统是采用EDA技术设计的一个简易的八音符电子琴,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,它可以通过按键输入来控制音响。
多功能电子琴的设计是在原有普通电子琴的基础上进行扩充的一个设计。
该电子琴的设计大体可以由三个模块构成,分别是电子琴音调发生器模块、数控分频模块和自动演奏模块。
用超高速硬件描述语言VHDL编程可以实现各个模块的功能。
能够实现弹琴和自动演奏的功能。
系统实现是用硬件描述语言VHDL按照模块化方式进行设计,然后进行编程、时序仿真、总体整合。
本系统的功能比较齐全,有一定的现实使用的价值。
本文中介绍了电子琴系统的整体的设计,并基于超高速硬件描述语言VHDL在相关的芯片上编程实现的。
关键字
电子琴;EDA;现场可编程逻辑器件FPGA;超高速硬件描述语言VHDL;音调发生;数控分频;
1引言
我们生活在一个信息高速发达的时代,各种各样电子产品层出不穷。
对于广大老百姓来说,电子琴可以说已经不再是什么“新鲜玩意”了,它现在作为一种休闲和娱乐的产品早就推出市面,面向百姓,进入了我们的生活。
作为一个电子信息科学与技术专业的学生,了解这些电子产品的基本的组成和设计原理是十分必要的,我们学习过了计算机组成的理论知识,而我所做的课程设计正是对我学习的理论进行实践和巩固。
本设计主要介绍的是一个用超高速硬件描述语言VHDL设计的一个具有若干功能的简易电子琴;集科学性,先进性,创新性,实用性于一体,其理论基础源自于计算机组成原理的时钟分频器。
1.1 设计的目的
本次设计的目的就是在掌握计算机组成原理理论相关的基础上,了解EDA技术,掌握VHDL硬件描述语言的设计方法和思想,通过学习的VHDL 语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,例如本课程设计就是基于所学的计算机原理中的时钟分频器和定时器的基础之上的,通过本课程设计,达到巩固和综合运用计算机原理中的知识,理论联系实际,巩固所学理论知识,并且提高自己通过所学理论分析、解决计算机相关的实际问题的能力。
1.2 设计的基本内容
基于Quartus Ⅱ平台,运用VHDL语言对简易电子琴的各个模块进行设计,并使用EDA 工具对各模块进行仿真验证。
本设计包含如下三个模块:音调发生模块、数控分频模块、乐曲自动演奏模块,最后把各个模块整合后,通过电路的输入输出对应关系连接起来。
1.3 设计方案
为了实现这种有“弹奏”和“自动播放歌曲”功能的多功能简易电子琴,以下提供两种方案以供参考:
方案一:采用单个的逻辑器件组合实现。
这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是因为元器件种类、个数非常多,而且过于复杂的硬件电路也容易引起系统的精度不高、体积过大等一系列的不利因素。
例如八个不同的音符是由八个不同的频率来控制输出发声的,而采用这个方案需要运用不同的分频器来对信号进行不同程度的分频。
所用仪器之多显而易见。
方案二:采用VHDL语言编程来实现电子琴的各项功能。
我这个系统主要由音调发生器模块、数控分频模块、乐曲自动演奏模块组成的。
和方案一相比较,方案二就显得比较笼统,只是把整个系统分为了若干个小模块,却不牵涉到具体的硬件电路。
但是我们必须看到使用超高速硬件描述语言VHDL的优势,它不仅具有良好的电路行为描述和系统描述的能力并且通俗易懂。
2 简易电子琴设计
2.1 系统设计的总体思路
实现这个多功能电子琴,我们要考虑的主要是以下三个方面的内容:
一、每个音符都有自己的固有频率,由频率的不同就决定了发出什么音调。
二、一首乐曲的组成不仅仅是音调,还包括每个音调持续时间的长短,也就是我们通常所说的音长。
本设计就是以这两个部分为核心内容展开。
经过对引言两种方案的分析、比较和总结,我们选用方案二来进行电子琴的设计。
采用现场可编程逻辑器件(FPGA)制作,利用EDA软件中的VHDL硬件描述语言编程进行控制,下载至试验箱中的FPGA模块中,再利用其上资源连接电路从而实现预定功能。
采用FPGA来设计的原理图如图2.1所示.它由控制输入电路、FPGA、显示电路和扬声器电路组成。
控制输入电路FPGA显示电路
扬声电路
图2.1 采用FPGA设计的电子琴原理方框图控制输入电路主要是为用户设计的,起到一个输入控制的作用通过8
个按钮对应8个音符,外加一个键盘输入/自动演奏切换按钮。
FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现电子琴运作的主要控制模块。
编好的VHDL程序下载到现场可编程逻辑器件FPGA中,然后通过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱,同时也把发出的乐谱符号通过七段数码管输出。
2.2 程序设计的流程图
程序设计的流程图如图2.2所示。
图2.2 程序设计流程图
根据系统的两大功能:手动弹奏与自动演奏,可将其分成音调发生器模块、数控分频模块和自动演奏模块三部分。
音调发生器模块由分频模块获得其产生的8个频率(还可扩展),对应8个音符(中央C,D,E,F,
G,A,B和高音C分别在七段数码管上显示数字1-8),为了实现自动播放
的《友谊地久天长》,我们还编辑了低音G和A两个音。
这些频率经放大
后驱动蜂鸣器,即可发出声音。
键盘选择手动弹奏模式时,按下音符键后
就选通相应的频率输出,驱动蜂鸣器产生相应的乐音;选择自动演奏模式
时,存储器里事先编写好的音符信息被依次取出,去选通各个频率输出,
实现自动奏乐。
2.3简易电子琴的顶层设计图
50mhz
系统
时钟
player tonemaker
图2.3 简易电子琴的顶层设计图
2.4简易电子琴中各模块的设计
FPGA的设计是整个系统的中心环节,具有举足轻重的作用.它的实现
主要是由小组成员利用VHDL硬件描述语言编程实现电子琴的功能,仿真
调试成功之后,再下载到试验箱上的FPGA器件中去,外部连接完成后的成品在带电情况下即可运行实现预定功能。
而FPGA模块的设计又重在VHDL 语言的编程实现,用VHDL语言编写的程序总的顶层模块映射原理图如图2.3所示,它是由音调发生器模块(tonemaker)、数控分频模块(Speaker)、自动演奏模块(player)组成。
系统pin_28输入50MHz时钟频率经6分频得到一个近似8HZ的基准频率,经过二次分频后得到对应音符的频率。
从自动演奏模块输出的是乐谱信号,该乐谱信号作为音调发生器模块的敏感信号输入并对其进行控制。
音调发生模块有两个输出,分别是code和high,两个都接外部的显示部分,code接七段数码管显示乐谱,high显示的是该乐谱是高音还是低音。
由于本系统结构较为简单,程序编译无错后我们小组直接在试验箱上连接好各类外部资源后利用实物验证,经过调试,我们实现了预定功能。
在本系统中我负责的是主要是数控分频模块的元件例华以及顶层设
计部分的修改,以下对模块进行说明。
2.4.1数控分频模块
在对计算机组成原理的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。
本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。
该模块的VHDL程序中包含了三个进程。
首先对FPGA的50MHz的时基脉冲进行6分频得到近似8MHz的脉冲,然后按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率。
第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,使扬声器有足够发声功率。
数控分频模块元件图:
CLK1 SPKS
TONE1[10..0]
数控分频模块原理图
数控分频模块程序:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity speaker is
Port ( clk1 : in std_logic; --系统时钟tone1 : in integer range 0 to 2047; --音符分频系数spks : out std_logic); --驱动扬声器的音频信号end speaker;
architecture Behavioral of speaker is
signal preclk,fullspks:std_logic;
begin
pulse1:process(clk1) --此进程对系统时钟进行4分频variable count:integer range 0 to 12;
begin
if clk1'event and clk1='1' then count:=count+1;
if count=3 then preclk<='1';
elsif count=6 then preclk<='0';count:=0;
end if;
end if;
end process pulse1;
genspks:process(preclk,tone1)
--此进程按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率
variable count11:integer range 0 to 2047;
begin
if preclk'event and preclk='1' then
if count11<tone1 then count11:=count11+1;fullspks<='1';
else count11:=0;fullspks<='0';
end if;
end if;
end process;
delaysps:process(fullspks)
--此进程对fullspks进行2分频将脉冲展宽,使扬声器有足够发声功率variable count2 :std_logic:='0';
begin
if fullspks'event and fullspks='1' then count2:=not count2;
if count2='1' then spks<='1';
else spks<='0';
end if;
end if;
end process;
end Behavioral;
3 结束语
通过对测试结果的分析,我们发现采用FPGA所设计的电子琴系统设
计趋于简单、开发时间短;外围器件少,体积小;系统维护起来更方便、快捷。
尤其对于设计者来说,不需要考虑太多的硬件设计,只需要有自己的设计思路,编程实现再下载到FPGA器件中进行测试就可以了。
通过两个星期的学习实验,终于完成了简易电子琴的设计,这个课程设计使我受益匪浅,它使我对硬件设计的整个流程有了整体了解和亲身经历,并且使我对VHDL语言从陌生到初步理解,扩充的我的知识面。
课程设计同时还培养了我钻研事物的精神和团队协作的能力。
我们小组设计的这个系统虽然并不复杂,但由三个例化元件组成,有多个接口需要衔接,对于初次接VHDL和FPGA的我们来说任何一个小小的错误都足以让我们焦头烂额。
实验的过程中总是出现这样那样的问题,有时没有思路一筹莫展,这当中无疑是锻炼人的意志品质的,更让我明白研究需要持之以恒的毅力。
一个人的力量有限,团队合力才能共克难关,往往是队友的一句话或一个想法启发了自己,带来的是巨大的进展;遇到瓶颈时相互之间难免摩擦,解决之后再次和好如初。
这一段经历无疑对人生道路有着极强的指导意义,为今后的任职发展奠定良好的心理基础。
课程设计也使我积累了一定的经验,了解VHDL设计的方便和灵活性,扩展了自己的工程素养,相信这些经验和素养在我以后的学习和工作中会有很大的作用。
在本次课程设计的整个过程中,得到了高月春教员的大力支持,在此感谢高教员的细心讲解和耐心的指点。
4 附录
完整程序eo(electronic organ):
1.顶层设计eo.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity eo is
Port ( clk50MHz :in std_logic; --pin_28内部输入50MHz系统时钟handTOauto : in std_logic; --键盘输入/自动演奏切换按钮code1 :out std_logic_vector(6 downto 0);
--音符显示信号(七段数码管显示) index1 :in std_logic_vector(7 downto 0);
--键盘输入信号(8个按钮) high1 :out std_logic; --高低音节信号spkout :out std_logic); --音频信号(接
蜂鸣器)
end eo;
architecture Behavioral of eo is
component player
Port ( clk :in std_logic;
Auto: in std_logic;
index2:in std_logic_vector(7 downto 0);
index0 : out std_logic_vector(7 downto 0));
end component;
component tonemaker
Port ( index : in std_logic_vector(7 downto 0);
code : out std_logic_vector(6 downto 0);
high : out std_logic;
tone0 : out integer range 0 to 2047);
end component;
component speaker
Port ( clk1 : in std_logic;
tone1 : in integer range 0 to 2047;
spks : out std_logic);
end component;
signal tone2: integer range 0 to 2047;
signal indx:std_logic_vector(7 downto 0);
begin
u0: player port
map(clk=>clk50MHZ,index2=>index1,index0=>indx,Auto=>handtoAuto) ;
u1: tonemaker port
map(index=>indx,tone0=>tone2,code=>code1,high=>high1);
u2: speaker port map(clk1=>clk50MHZ,tone1=>tone2,spks=>spkout); end Behavioral;
2.音调发生器模块tonemaker.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity tonemaker is
Port ( index : in std_logic_vector(7 downto 0) --音符输入信号code : out std_logic_vector(6 downto 0); --音符显示信号high : out std_logic; -高低音显示信号
tone0 : out integer range 0 to 2047); --音符的分频系数end tonemaker;
architecture Behavioral of tonemaker is
begin
search :process(index)
--此进程完成音符到音符的分频系数译码,音符的显示,高低音阶begin
case index is
when "10001000" => tone0<=1600;code<="0100100";high<='0';--15 when "10000100" => tone0<=1500;code<="0100000";high<='0';--16 when "00000001" => tone0<=773; code<="0000000";high<='1';--8 when "00000010" => tone0<=912; code<="0001111";high<='1';--7 when "00000100" => tone0<=996; code<="0100000";high<='1';--6 when "00001000" => tone0<=1076;code<="0100100";high<='1';--5 when "00010000" => tone0<=1198;code<="1001100";high<='1';--4 when "00100000" => tone0<=1290;code<="0000110";high<='0';--3 when "01000000" => tone0<=1372;code<="0010010";high<='0';--2 when "10000000" => tone0<=1410;code<="1001111";high<='0';--1 when others => tone0<=10; code<="1111111";high<='0';
end case;
end process;
end Behavioral;
3.数控分频模块speaker.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity speaker is
Port ( clk1 : in std_logic; --系统时钟tone1 : in integer range 0 to 2047; --音符分频系数spks : out std_logic); --驱动扬声器的音频信号end speaker;
architecture Behavioral of speaker is
signal preclk,fullspks:std_logic;
begin
pulse1:process(clk1) --此进程对系统时钟进行6分频variable count:integer range 0 to 12;
begin
if clk1'event and clk1='1' then count:=count+1;
if count=3 then preclk<='1';
elsif count=6 then preclk<='0';count:=0;
end if;
end if;
end process pulse1;
genspks:process(preclk,tone1)
--此进程按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率
variable count11:integer range 0 to 2047;
begin
if preclk'event and preclk='1' then
if count11<tone1 then count11:=count11+1;fullspks<='1';
else count11:=0;fullspks<='0';
end if;
end if;
end process;
delaysps:process(fullspks)
--此进程对fullspks进行2分频将脉冲展宽,使扬声器有足够发声功率variable count2 :std_logic:='0';
begin
if fullspks'event and fullspks='1' then count2:=not count2;
if count2='1' then spks<='1';
else spks<='0';
end if;
end if;
end process;
end Behavioral;
4.自动演奏模块player.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity player is
Port ( clk,Auto : in std_logic; --系统时钟;键盘输入/自动演奏index2 : in std_logic_vector(7 downto 0); --键盘输入信号index0 : out std_logic_vector(7 downto 0)); --音符信号输出end player;
architecture Behavioral of player is
signal count0:integer range 0 to 264; signal clk2:std_logic;
begin
pulse0:process(clk,Auto)
--此进程完成对系统时钟8M的分频,得到4Hz的信号clk2 variable count:integer range 0 to 8000000;
begin
if Auto='1' then count:=0;clk2<='0';
elsif clk'event and clk='1' then count:=count+1;
if count=4000000 then clk2<='1';
elsif count=8000000 then clk2<='0';count:=0;
end if;
end if;
end process;
music:process(clk2) --此进程完成自动演奏部分曲的地址累加begin
if clk2'event and clk2='1' then
if count0=264 then count0<=0;
else count0<=count0+1;
end if;
end if;
end process;
com1:process(count0,Auto,index2)
begin
if Auto='0' then
case count0 is --此case语句:存储自动演奏的《友谊地久天长》when 0 => index0<="10001000"; --15
when 1 => index0<="10001000"; --15
when 2 => index0<="10001000"; --15
when 3 => index0<="10001000"; --15
when 4 => index0<="10000000"; --1
when 5 => index0<="10000000"; --1
when 6 => index0<="10000000"; --1
when 7 => index0<="10000000"; --1
when 8 => index0<="10000000"; --1
when 9 => index0<="10000000"; --1
when 10 => index0<="11111111"; --/
when 11=> index0<="10000000"; --1
when 12=> index0<="10000000"; --1
when 13=> null; --/
when 14=> index0<="10000000"; --1
when 15=> index0<="10000000"; --1
when 16=> index0<="10000000"; --1
when 17=> index0<="10000000"; --1
when 18=> index0<="00100000"; --3
when 19=> index0<="00100000"; --3
when 20=> index0<="00100000"; --3
when 21=> index0<="00100000"; --3
when 22=> index0<="01000000"; --2
when 23=> index0<="01000000"; --2
when 24=> index0<="01000000"; --2
when 25=> index0<="01000000"; --2
when 26=> index0<="01000000"; --2
when 27=> index0<="01000000"; --2
when 28=> index0<="11111111"; --/
when 29=> index0<="10000000"; --1 when 30=> index0<="10000000"; --1 when 31=> null; --/
when 32=> index0<="01000000"; --2 when 33=> index0<="01000000"; --2 when 34=> index0<="01000000"; --2 when 35=> index0<="01000000"; --2 when 36=> index0<="00100000"; --3 when 37=> index0<="00100000"; --3 when 38=> index0<="00100000"; --3 when 39=> index0<="00100000"; --3 when 40=> index0<="10000000"; --1 when 41=> index0<="10000000"; --1 when 42=> index0<="10000000"; --1 when 43=> index0<="10000000"; --1 when 44=> index0<="10000000"; --1 when 45=> index0<="10000000"; --1 when 46=> index0<="11111111"; --/ when 47=> index0<="10000000"; --1 when 48=> index0<="10000000"; --1 when 49=> null; --/
when 50=> index0<="00100000"; --3 when 51=> index0<="00100000"; --3 when 52=> index0<="00100000"; --3 when 53=> index0<="00100000"; --3 when 54=> index0<="00001000"; --5 when 55=> index0<="00001000"; --5 when 56=> index0<="00001000"; --5 when 57=> index0<="00001000"; --5 when 58=> index0<="00000100"; --6 when 59=> index0<="00000100"; --6 when 60=> index0<="00000100"; --6 when 61=> index0<="00000100"; --6 when 62=> index0<="00000100"; --6
when 63=> index0<="00000100"; --6 when 64=> index0<="11111111"; --/ when 65=> index0<="00000100"; --6 when 66=> index0<="00000100"; --6 when 67=> index0<="00000100"; --6 when 68=> index0<="00000100"; --6 when 69=> null; --/
when 70=> index0<="00001000"; --5 when 71=> index0<="00001000"; --5 when 72=> index0<="00001000"; --5 when 73=> index0<="00001000"; --5 when 74=> index0<="00001000"; --5 when 75=> index0<="00001000"; --5 when 76=> index0<="11111111"; --/ when 77=> index0<="00100000"; --3 when 78=> index0<="00100000"; --3 when 79=> null; --/
when 80=> index0<="00100000"; --3 when 81=> index0<="00100000"; --3 when 82=> index0<="00100000"; --3 when 83=> index0<="00100000"; --3 when 84=> index0<="10000000"; --1 when 85=> index0<="10000000"; --1 when 86=> index0<="10000000"; --1 when 87=> index0<="10000000"; --1 when 88=> index0<="01000000"; --2 when 89=> index0<="01000000"; --2 when 90=> index0<="01000000"; --2 when 91=> index0<="01000000"; --2 when 92=> index0<="01000000"; --2 when 93=> index0<="01000000"; --2 when 94=> index0<="11111111"; --/ when 95=> index0<="10000000"; --1 when 96=> index0<="10000000"; --1
when 97=> null; --/
when 98=> index0<="01000000"; --2 when 99=> index0<="01000000"; --2 when 100=> index0<="01000000"; --2 when 101=> index0<="01000000"; --2 when 102=> index0<="00100000"; --3 when 103=> index0<="00100000"; --3 when 104=> index0<="00100000"; --3 when 105=> index0<="00100000"; --3 when 106=> index0<="10000000"; --1 when 107=> index0<="10000000"; --1 when 108=> index0<="10000000"; --1 when 109=> index0<="10000000"; --1 when 110=> index0<="10000000"; --1 when 111=> index0<="10000000"; --1 when 112=> index0<="11111111"; --/ when 113=> index0<="10000100"; --16 when 114=> index0<="10000100"; --16 when 115=> null; --/
when 116=> index0<="10000100"; --16 when 117=> index0<="10000100"; --16 when 118=> index0<="10000100"; --16 when 119=> index0<="10000100"; --16 when 120=> index0<="10001000"; --15 when 121=> index0<="10001000"; --15 when 122=> index0<="10001000"; --15 when 123=> index0<="10001000"; --15 when 124=> index0<="10000000"; --1 when 125=> index0<="10000000"; --1 when 126=> index0<="10000000"; --1 when 127=> index0<="10000000"; --1 when 128=> index0<="10000000"; --1 when 129=> index0<="10000000"; --1 when 130=> index0<="11111111"; --/
when 131=> index0<="00000100"; --6 when 132=> index0<="00000100"; --6 when 133=> index0<="00000100"; --6 when 134=> index0<="00000100"; --6 when 135=> null; --/
when 136=> index0<="00001000"; --5 when 137=> index0<="00001000"; --5 when 138=> index0<="00001000"; --5 when 139=> index0<="00001000"; --5 when 140=> index0<="00001000"; --5 when 141=> index0<="00001000"; --5 when 142=> index0<="11111111"; --/ when 143=> index0<="00100000"; --3 when 144=> index0<="00100000"; --3 when 145=> null; --/
when 146=> index0<="00100000"; --3 when 147=> index0<="00100000"; --3 when 148=> index0<="00100000"; --3 when 149=> index0<="00100000"; --3 when 150=> index0<="10000000"; --1 when 151=> index0<="10000000"; --1 when 152=> index0<="10000000"; --1 when 153=> index0<="10000000"; --1 when 154=> index0<="01000000"; --2 when 155=> index0<="01000000"; --2 when 156=> index0<="01000000"; --2 when 157=> index0<="01000000"; --2 when 158=> index0<="01000000"; --2 when 159=> index0<="01000000"; --2 when 160=> index0<="11111111"; --/ when 161=> index0<="10000000"; --1 when 162=> index0<="10000000"; --1 when 163=> null; --/
when 164=> index0<="01000000"; --2
when 165=> index0<="01000000"; --2 when 166=> index0<="01000000"; --2 when 167=> index0<="01000000"; --2 when 168=> index0<="00000100"; --6 when 169=> index0<="00000100"; --6 when 170=> index0<="00000100"; --6 when 171=> index0<="00000100"; --6 when 172=> index0<="00001000"; --5 when 173=> index0<="00001000"; --5 when 174=> index0<="00001000"; --5 when 175=> index0<="00001000"; --5 when 176=> index0<="00001000"; --5 when 177=> index0<="00001000"; --5 when 178=> index0<="11111111"; --/ when 179=> index0<="00100000"; --3 when 180=> index0<="00100000"; --3 when 181=> null; --/
when 182=> index0<="00100000"; --3 when 183=> index0<="00100000"; --3 when 184=> index0<="00100000"; --3 when 185=> index0<="00100000"; --3 when 186=> index0<="00001000"; --5 when 187=> index0<="00001000"; --5 when 188=> index0<="00001000"; --5 when 189=> index0<="00001000"; --5 when 190=> index0<="00000100"; --6 when 191=> index0<="00000100"; --6 when 192=> index0<="00000100"; --6 when 193=> index0<="00000100"; --6 when 194=> index0<="00000100"; --6 when 195=> index0<="00000100"; --6 when 196=> index0<="11111111"; --/ when 197=> index0<="00000001"; --8 when 198=> index0<="00000001"; --8
when 199=> index0<="00000001"; --8 when 200=> index0<="00000001"; --8 when 201=> null; --/
when 202=> index0<="00001000"; --5 when 203=> index0<="00001000"; --5 when 204=> index0<="00001000"; --5 when 205=> index0<="00001000"; --5 when 206=> index0<="00001000"; --5 when 207=> index0<="00001000"; --5 when 208=> index0<="11111111"; --/ when 209=> index0<="00100000"; --3 when 210=> index0<="00100000"; --3 when 211=> null; --/
when 212=> index0<="00100000"; --3 when 213=> index0<="00100000"; --3 when 214=> index0<="00100000"; --3 when 215=> index0<="00100000"; --3 when 216=> index0<="10000000"; --1 when 217=> index0<="10000000"; --1 when 218=> index0<="10000000"; --1 when 219=> index0<="10000000"; --1 when 220=> index0<="01000000"; --2 when 221=> index0<="01000000"; --2 when 222=> index0<="01000000"; --2 when 223=> index0<="01000000"; --2 when 224=> index0<="01000000"; --2 when 225=> index0<="01000000"; --2 when 226=> index0<="11111111"; --/ when 227=> index0<="10000000"; --1 when 228=> index0<="10000000"; --1 when 229=> null; --/
when 230=> index0<="01000000"; --2 when 231=> index0<="01000000"; --2 when 232=> index0<="01000000"; --2
when 233=> index0<="01000000"; --2 when 234=> index0<="00100000"; --3 when 235=> index0<="00100000"; --3 when 236=> index0<="00100000"; --3 when 237=> index0<="00100000"; --3 when 238=> index0<="10000000"; --1 when 239=> index0<="10000000"; --1 when 240=> index0<="10000000"; --1 when 241=> index0<="10000000"; --1 when 242=> index0<="10000000"; --1 when 243=> index0<="10000000"; --1 when 244=> index0<="11111111"; --/ when 245=> index0<="10000100"; --16 when 246=> index0<="10000100"; --16 when 247=> null; --/
when 248=> index0<="10000100"; --16 when 249=> index0<="10000100"; --16 when 250=> index0<="10000100"; --16 when 251=> index0<="10000100"; --16 when 252=> index0<="10001000"; --15 when 253=> index0<="10001000"; --15 when 254=> index0<="10001000"; --15 when 255=> index0<="10001000"; --15 when 256=> index0<="10000000"; --1 when 257=> index0<="10000000"; --1 when 258=> index0<="10000000"; --1 when 259=> index0<="10000000"; --1 when 260=> index0<="10000000"; --1 when 261=> index0<="10000000"; --1 when 262=> index0<="11111111"; --/ when 263=> index0<="11111111"; --/ when 264=> index0<="11111111"; --/ when others => null;
end case;。