现。本实验设计项目作为“梁祝”乐曲演奏电路的实现。我们知道,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。图10-3中,模块U1类似于弹琴的人的手指;U2类似于琴键;U3类似于琴弦或音调发声器。
下面首先来了解图10-3的工作原理:
1、音符的频率可以由图10-3中的SPEAKERA获得,这是一个数控分频器(其详细工作原理可参考实验5-3)。由其clk端输入一具有较高频率(这里是12MHz)的信号,通过SPEAKERA分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。SPEAKERA对clk输入信号的分频比由11位预置数Tone[10..0]决定。SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone[10..0] 与SPKOUT的输出频率,就有了对应关系。例如在TONETABA模块中若取Tone[10..0]=1036,将发音符为\音的信号频率。
2、音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图10-3中模块TONETABA 的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKER输入口停留的时间即为此音符的节拍值。模块TONETABA 是乐曲简谱码对应的分频预置数查表电路,其中设置了“梁祝”乐曲全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和音调发生器模块NOTETABS的clk的输入频率决定,在此为4Hz。这13个值的输出由对应于TONETABA 的4位输入值Index[3..0]确定,而Index[3..0] 最多有16种可选值。输向TONETABA中Index[3..0]的值ToneIndex[3..0]的输出值与持续的时间由模块NOTETABS 决定。
3、在NOTETABS 中设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。例如,NOTETABS 在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间,相应地,所对应的“3”音符分频预置值为1036,在SPEAKERA 的输入端停留了1秒。随着NOTETABS 中的计数器按4Hz的时钟速率作加法计数时,即随地址值递增时,音符数据ROM 中的音符数据将从ROM中通过ToneIndex[3..0]端口输向TONETABA模块,“梁祝”乐曲就开始连续自然地演奏起来了。
(3) 实验内容1:定制例10-32的NoteTabs模块中的音符数据ROM“music”。该ROM中的音符数据已列在例10-33中。注意该例数据表中的数据位宽、深度和数据的表达类型。此外,为了节省篇幅,例中的数据都横排了,实用中应该以每一分号为一行来展开,否则会出错。
最后对该ROM进行仿真,确认例10-33中的音符数据已经进入ROM中。
(4) 实验内容2:根据给出的乘法器逻辑原理图及其各模块的VHDL描述,在QuartusII上完成全部设计,包括编辑、编译、综合和仿真操作等。给出仿真波形,并作出详细说明。
(5) 实验内容3:硬件验证。先将引脚锁定,使CLK12MHz与clock9相接,接受12MHz时钟频率(用短路帽在clock9接“12MHz”);CLK8Hz 与clock2相接,接受4Hz频率;发音输出SPKOUT接Speaker;与演奏发音相对应的简谱码输出显示可由CODE1在数码管5显示;HIGH1为高八度音指示,可由发光管D5指示,最后向目标芯片下载适配后的SOF逻辑设计文件。实验电路结构图为NO.1。
(6) 实验内容4:填入新的乐曲,如“采茶舞曲”、或其它熟悉的乐曲。操作步骤如下:
1、根据所填乐曲可能出现的音符,修改例10-3的音符数据表格,同时注意每一音符的节拍长短; 2、如果乐曲比较长,可增加模块NOTETABA中计数器的位数,如9位时可达512个基本节拍。
(7) 实验内容5:争取可以在一个ROM装上多首歌曲,可手动或自动选择歌曲。 (8) 实验内容6:根据此项实验设计一个电子琴,硬件测试可用电路结构图NO.3。
(9) 思考题1:用LFSR设计可编程分频器,对本实验中的音阶发生电路的可编程计数器(实现可编程分频功能)用LFSR替代。
(10) 思考题2:例10-30中的进程DelaySpkS对扬声器发声有什么影响?
(11) 思考题3:在电路上应该满足哪些条件,才能用数字器件直接输出的方波驱动扬声器发声?
(12) 实验报告:用仿真波形和电路原理图,详细叙述硬件电子琴的工作原理及其4个VHDL文件中相关
语句的功能,叙述硬件实验情况。
乐曲演奏电路的VHDL逻辑描述如下: 【例10-29】
LIBRARY IEEE; -- 硬件演奏电路顶层设计 USE IEEE.STD_LOGIC_1164.ALL;
ENTITY Songer IS
PORT ( CLK12MHZ : IN STD_LOGIC; --音调频率信号 CLK8HZ : IN STD_LOGIC; --节拍频率信号
CODE1 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);-- 简谱码输出显示 HIGH1 : OUT STD_LOGIC; --高8度指示 SPKOUT : OUT STD_LOGIC );--声音输出 END;
ARCHITECTURE one OF Songer IS COMPONENT NoteTabs
PORT ( clk : IN STD_LOGIC;
ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END COMPONENT;
COMPONENT ToneTaba
PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ; CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; HIGH : OUT STD_LOGIC;
Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) ); END COMPONENT;
COMPONENT Speakera
PORT ( clk : IN STD_LOGIC;
Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC ); END COMPONENT;
SIGNAL Tone : STD_LOGIC_VECTOR (10 DOWNTO 0);
SIGNAL ToneIndex : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN
u1 : NoteTabs PORT MAP (clk=>CLK8HZ, ToneIndex=>ToneIndex);
u2 : ToneTaba PORT MAP (Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1); u3 : Speakera PORT MAP(clk=>CLK12MHZ,Tone=>Tone, SpkS=>SPKOUT );
END;
【例10-30】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Speakera IS
PORT ( clk : IN STD_LOGIC;
Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC ); END;
ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK, FullSpkS : STD_LOGIC; BEGIN
DivideCLK : PROCESS(clk)
VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN
PreCLK <= '0'; -- 将CLK进行16分频,PreCLK为CLK的16分频 IF Count4>11 THEN PreCLK <= '1'; Count4 := \
ELSIF clk'EVENT AND clk = '1' THEN Count4 := Count4 + 1; END IF; END PROCESS;
GenSpkS : PROCESS(PreCLK, Tone)-- 11位可预置计数器
VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0); BEGIN
IF PreCLK'EVENT AND PreCLK = '1' THEN
IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1'; ELSE Count11 := Count11 + 1; FullSpkS <= '0'; END IF; END IF; END PROCESS;
DelaySpkS : PROCESS(FullSpkS)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音 VARIABLE Count2 : STD_LOGIC; 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;
【例10-31】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ToneTaba IS
PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ; CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; HIGH : OUT STD_LOGIC;
Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) ); END;
ARCHITECTURE one OF ToneTaba IS BEGIN
Search : PROCESS(Index) BEGIN
CASE Index IS -- 译码电路,查表方式,控制音调的预置数
WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN OTHERS => NULL; END CASE; END PROCESS; END;
【例10-32】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY NoteTabs IS
PORT ( clk : IN STD_LOGIC;
ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END;
ARCHITECTURE one OF NoteTabs IS
COMPONENT MUSIC --音符数据ROM
PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END COMPONENT;
SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN
CNT8 : PROCESS(clk, Counter) BEGIN
IF Counter=138 THEN Counter <= \
ELSIF (clk'EVENT AND clk = '1') THEN Counter <= Counter+1; END IF; END PROCESS;
u1 : MUSIC PORT MAP(address=>Counter , q=>ToneIndex, inclock=>clk); END; 【例10-33】
WIDTH = 4 ; --“梁祝”乐曲演奏数据 DEPTH = 256 ;
ADDRESS_RADIX = DEC ; DATA_RADIX = DEC ;
CONTENT BEGIN--注意,以下的数据排列方法只是为了节省空间,实用文件中要展开以下数据,每一组占一行 00: 3 ; 01: 3 ; 02: 3 ; 03: 3; 04: 5; 05: 5; 06: 5;07: 6; 08: 8; 09: 8; 10: 8 ; 11: 9 ; 12: 6 ; 13: 8; 14: 5; 15: 5; 16: 12;17: 12;18: 12; 19:15; 20:13 ; 21:12 ; 22:10 ; 23:12; 24: 9; 25: 9; 26: 9; 27: 9; 28: 9; 29: 9;
30: 9 ; 31: 0 ; 32: 9 ; 33: 9; 34: 9; 35:10; 36: 7; 37: 7; 38: 6; 39: 6; 40: 5 ; 41: 5 ; 42: 5 ; 43: 6; 44: 8; 45: 8; 46: 9; 47: 9; 48: 3; 49: 3; 50: 8 ; 51: 8 ; 52: 6 ; 53: 5; 54: 6; 55: 8; 56: 5; 57: 5; 58: 5; 59: 5; 60: 5 ; 61: 5 ; 62: 5 ; 63: 5; 64:10; 65:10; 66:10; 67:12; 68: 7; 69: 7; 70: 9 ; 71: 9 ; 72: 6 ; 73: 8; 74: 5; 75: 5; 76: 5; 77: 5; 78: 5; 79: 5; 80: 3 ; 81: 5 ; 82: 3 ; 83: 3; 84: 5; 85: 6; 86: 7; 87: 9; 88: 6; 89: 6; 90: 6 ; 91: 6 ; 92: 6 ; 93: 6; 94: 5; 95: 6; 96: 8; 97: 8; 98: 8; 99: 9; 100:12 ;101:12 ;102:12 ;103:10;104: 9;105: 9;106:10;107: 9;108: 8;109: 8; 110: 6 ;111: 5 ;112: 3 ;113: 3;114: 3;115: 3;116: 8;117: 8;118: 8;119: 8; 120: 6 ;121: 8 ;122: 6 ;123: 5;124: 3;125: 5;126: 6;127: 8;128: 5;129: 5; 130: 5 ;131: 5 ;132: 5 ;133: 5;134: 5;135: 5;136: 0;137: 0;138: 0; END ;
附录:GW48 EDA/SOPC主系统使用说明
第一节
GW48教学实验系统原理与使用介绍
一、GW48系统使用注意事项 (用户必读!!!) a:闲置不用GW48系统时,必须关闭电源!!!
b:在实验中,当选中某种模式后,要按一下右侧的复位键,以使系统进入该结构模式工作。注意此复位键仅对实验系统的监控模块复位,而对目标器件FPGA没有影响,FPGA本身没有复位的概念,上电后即工作,在没有配置前,FPGA的I/O口是随机的,故可以从数码管上看到随机闪动,配置后的I/O口才会有确定的输出电平。
c:换目标芯片时要特别注意,不要插反或插错,也不要带电插拔,确信插对后才能开电源。其它接口都可
带电插拔。请特别注意,尽可能不要随意插拔适配板,及实验系统上的其他芯片。
e: 使用实验系统前,查阅系统的默认设置ppt文件:EDA技术与VHDL书实验课件说明_必读 .ppt。 二、GW48系统主板结构与使用方法
以下将详述GW48系列SOPC/EDA实验开发系统(GW48-PK2/CK)结构与使用方法,对于这2种型号的不同之处将给予单独指出。该系统的实验电路结构是可控的。即可通过控制接口键,使之改变连接方式以适应不同的实验需要。因而,从物理结构上看,实验板的电路结构是固定的,但其内部的信息流在主控器的控制下,电路结构将发生变化---重配置。这种“多任务重配置”设计方案的目的有3个:1、适应更多的实验与开发项目;2、适应更多的PLD公司的器件;3、适应更多的不同封装的FPGA和CPLD器件。系统板面主要部件及其使用方法说明如下。以下是对GW48系统主板功能块的注释。
主板右数第2、3列“目标板插座”信号相同PIO60PIO62PIO64PIO66PIO76ooooooooooPIO61PIO63PIO65PIO67PIO77PIO68PIO70PIO72PIO74PIO78ooooooooooPIO69PIO71PIO73PIO75PIO79ByteBlast(MV)TCKTDOTMSnSTATDIooooooooooSEL0SEL1GNDCON1TCKoo+12VTDOoo-12VTMSooSEL0nSTAooSEL1TDIoo1.8VPIO0oo3.3V2.5VooPIO1PIO2ooPIO3PIO4ooPIO5PIO6ooPIO7PIO8ooPIO9PIO10ooPIO11PIO12ooPIO13PIO14ooPIO15PIO16ooPIO17PIO18ooPIO19PIO20ooPIO21PIO22ooPIO23PIO24ooPIO25GNDooVCC3940目标板插座1CON2VCCooGNDCLOCK9ooooCLOCK5ooooooCLOCK2SPEAKERooCLOCK0ooPIO48ooPIO49PIO46ooPIO47PIO44ooPIO45PIO42ooPIO43PIO40ooPIO41PIO38ooPIO39PIO36ooPIO37PIO34ooPIO35PIO32ooPIO33PIO30ooPIO31PIO28ooPIO29PIO26ooPIO273940目标板插座2在线编程座ByteBlast IIDCLKCONF_DONEnCONFIGDATA0ASDOooooooooooGNDVCCIOnCEnCSOGND在线编程座
附图1 GW48 EDA系统电子设计二次开发信号图
(1) “模式选择键”:按动该键能使实验板产生12种不同的实验电路结构。这些结构如第二节的13张实验电路结构图所示。例如选择了“NO.3”图,须按动系统板上此键,直至数码管“模式指示”数码管显示“3”,于是系统即进入了NO.3 图所示的实验电路结构。
(2) 适配板:这是一块插于主系统板上的目标芯片适配座。对于不同的目标芯片可配不同的适配座。可用的目标芯片包括目前世界上最大的六家FPGA/CPLD厂商几乎所有CPLD、FPGA和所有ispPAC等模拟EDA器件。
第七节的表中已列出多种芯片对系统板引脚的对应关系,以利在实验时经常查用。
(3) ByteBlasterMV编程配置口:如果要进行独立电子系统开发、应用系统开发、电子设计竞赛等开发实践活动,首先应该将系统板上的目标芯片适配座拔下(对于Cyclone器件不用拔),用配置的10芯编程线将“ByteBlasterMV”口和独立系统上适配板上的10芯口相接,进行在系统编程(如GWDVP-B板),进行调试测试。“ByteBlasterMV”口能对不同公司,不同封装的CPLD/FPGA进行编程下载,也能对isp单片机89S51等进行编程。编程的目标芯片和引脚连线可参考附图1,从而进行二次开发。
(4)ByteBlasterII编程配置口:该口主要用于对Cyclone系列AS模式专用配置器件EPCS4和EPCS1等编程。
(5)混合工作电压源:系统不必通过切换即可为CPLD/FPGA目标器件提供5V、3.3V、2.5V、1.8V和1.5V工作电源,此电源位置可参考附图1。 (6)JP5编程模式选择跳线:(仅GW48-PK2型含此)。如果要对Cyclone的配置芯片进行编程,应该将跳线接于“ByBtII”端,在将标有“ByteBlasterII”编程配置口同适配板上EPCS4/1的AS模式下载口用10芯线连接起来,通过QuartusII进行编程。当短路“Others”端时,可对其它所有器件编程,端口信号参考附图1。
(7)JP6/JVCC/VS2编程电压选择跳线:跳线JVCC(GW48—PK2型标为“JP6”)是对编程下载口的选择跳线。对5V器件,如10K10、10K20、7128S、1032、95108、89S51单片机等,必须选“5.0V”。而对低于或等于3.3V的低压器件,如1K30、1K100、10K30E、20K300、Cyclone、7128B等一律选择“3.3V”一端。
(8)并行下载口:此接口通过下载线与微机的打印机口相连。来自PC机的下载控制信号和CPLD/FPGA的目标码将通过此口,完成对目标芯片的编程下载。计算机的并行口通信模式最好设置成“EPP”模式。
(9)键1~键8 :为实验信号控制键,此8个键受“多任务重配置”电路控制,它在每一张电路图中的功能及其与主系统的连接方式随模式选择键的选定的模式而变,使用中需参照第二节中的电路图。 (10)键9~键14 :(GW48—PK2型含此键)此6个键不受“多任务重配置”电路控制,由于键信号速度慢,所以其键信号输入口是全开放的,各端口定义在插座“JP8”处,可通过手动节插线的方式来实用,键输出默认高电平。
注意,键1至键8是由“多任务重配置”电路结构控制的,所以键的输出信号没有抖动问题,不需要在目标芯片的电路设计中加入消抖动电路,这样,能简化设计,迅速入门。但设计者如果希望完成键的消抖动电路设计练习,必须使用键9至键14来实现。
(11)数码管1~8/发光管D1~D16 :受“多任务重配置”电路控制,它们的连线形式也需参照第二节的电路图。 (12)“时钟频率选择”:位于主系统的右小侧,通过短路帽的不同接插方式,使目标芯片获得不同的时钟频率信号。
对于“CLOCK0”,同时只能插一个短路帽,以便选择输向“CLOCK0”的一种频率:信号频率范围:0.5Hz–50MHz。由于CLOCK0可选的频率比较多,所以比较适合于目标芯片对信号频率或周期测量等设计项目的信号输入端。右侧座分三个频率源组,它们分别对应三组时钟输入端:CLOCK2、CLOCK5、CLOCK9。例如,将三个短路帽分别插于对应座的2Hz、1024Hz和12MHz,则CLOCK2、CLOCK5、CLOCK9分别获得上述三个信号频率。需要特别注意的是,每一组频率源及其对应时钟输入端,分别只能插一个短路帽。也就是说最多只能提供4个时钟频率输入FPGA:CLOCK0、CLOCK2、CLOCK5、CLOCK9。
(13)扬声器:与目标芯片的“SPEAKER”端相接,通过此口可以进行奏乐或了解信号的频率,它与目标器件的具体引脚号,应该查阅附录第3节的表格。 (14) PS/2接口:通过此接口,可以将PC机的键盘和/或鼠标与GW48系统的目标芯片相连,从而完成PS/2通信与控制方面的接口实验,GW48-GK/PK2含另一PS/2接口,引脚连接情况参见实验电路结构 NO.5(附图7)。
(15)VGA视频接口:通过它可完成目标芯片对VGA显示器的控制。详细连接方式参考附图 7(对GW48-PK2主系统),或附图13(GW48-CK主系统)。
(16) 单片机接口器件:它与目标板的连接方式也已标于主系统板上:连接方式可参见附图11。