音符的频率可以由PUI。SE元件的输出SPEAK获得,这是一个数控分频器,由其CLK 6MHz端输入6MHz脉冲信号,分频比由预置输入端D[13..0]决定。输出为方波信号,其频率为3 000 000/(1+D[13..0]),单位为Hz。
音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,TABLE元件首先是为PULSE元件提供决定所发音符的分频预置数,而此数停留的时间即为此音符的节拍值。在TABLE元件中设置了一个8位二进制计数器(计数最大值为138),这个计数器的计数频率选为4 Hz,所以每一计数值的停留时间为0.25s,即四四拍的4分音符持续时间。例如,化蝶乐曲的第一个音符?quot;低音3"(1拍),停留的时间需用4个计数时钟节拍,即1s。相应地,所对应的"低音3"音符分频预置值为9 100,其值在AF[13..0]输出端停留了1s。随着TABLE元件中的计数器按4Hz的时钟速率作加法计数时,化蝶乐曲就开始连续自然地演奏起来了。
底层元件的VHDL逻辑描述如下:
--PULSE元件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY pulse IS
PORT(clk:INSTD_LOGIC; 一一待分频时钟
d:IN STD_LOGIC_VECTOR(13 DOWNTO 0);
--分频预置数输入
fout:OUTSTD_LOGIC); 一一发音输出
END pulses
ARCHITECTURE behav OF pulse IS
SIGNAL count : STD_LOGIC-VECTOR(13DOWNTO 0);
SIGNAL cao,caoo1,cao2,load:STD_LOGIC‘
BEGIN
PROCESS(clk,load,d)
BEGIN
IF clk‘EVENT AND clk=‘l‘THEN
IF load=‘1‘THEN count<=d;
ELSE count<=count一1;
END IF;
END IF;
END PROCESS;
PROCESS(count)
BEGIN
IF count=0 THEN cao<=‘l‘;
ELSE cao<=‘0‘; END IF;
load<=cao;
END PROCESS;
PROCESS(clk) --去毛刺
BEGIN
IF clk‘EVENT ANDclk=‘1‘THEN
caol<=cao;
END IF;
END PROCESS;
PROCESS(cao1)
BEGIN
IF cao1‘EVENT AND cao1=‘1‘THEN
ca02<=NOT cao2;
END IF
fout<=cao2;
END PROCESS;
END behav;
一一TABLE元件
IBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY table IS
PORT(clk:IN STD_LOGIC;
af:OUT INTEGER RANGE 0 TO 16#3FFF#)
一一14位二进制数
END;
ARCHITECTURE one OF table IS
CONSTANT 1ow_3:INTEGER:=9100;
CONSTANT 1ow_5;INTEGER:=7652;
CONSTANT 1ow_6:INTEGER:=6817;
CONSTANT 1ow_7:INTEGER:=6073;
CONSTANT mid_1:INTEGER;=5732;
CONSTANT mid_2:INTEGER:=5107;
CONSTANT mid_3:INTEGER:=4550;
CONSTANT mid_5:INTEGER:=3826;
CONSTANT mid_6:INTEGER:=3408;
CONSTANT highl:INTEGER: =2866
CONSTANT stop:INTEGER:=0;
--休止符分频系数
SIGNAL counter:INTEGER RANGE 0 TO 138;
BEGIN
PROCESS(clk)
BEGIN
IF counter=138 THEN counter<=0;
ELSIF(clk‘EVENT AND clk=‘l‘)THEN
counter<=counter+1;
END IF;
END PROCESS;
PROCESS(counter)
BEGIN
CASE counter IS
WHEN 00=>af<=low_3; --低音3
WHEN 01=>af<=low_3;
WHEN 02=>af<=low_3;
WHEN 03=>af<=low_3;
WHEN 04?gt;af<=low_5;
WHEN 05=>af<=low_5;
WHEN 06=>af<=low_5;
WHEN 07=>af<=low_6;
WHEN 08=>af<=low_1;
WHEN 09=>af<=low_1;
WHEN 10=>af<=low_1;
WHEN 11=>af<=low_2;
……
WHEN 134=>af<=low_5;
WHEN 135=>>af<=low_5;
WHEN 136=>>af<=stop;
WHEN 137=>af<=stop;
WHEN 138=>>af<=stop;
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END; 4 实验验证
需要说明的是不同的数字系统其引脚锁定是不一样的,为了便于在实验系统上验证设计结果,必须按照实验系统的结构对输入和输出引脚进行锁定。本设计采用的是杭州康芯电子有限公司生产的GW48-CK实验系统,FPGA目标芯片的型号为EPFl0K10LC84。芯片配置成功后即可进行硬件测试:选择实验电路结构图NO.6,使CLK 6MH2与C10ck9相接(接受6MHz时钟频率),CLK 4Hz与Clock2相接(接受4Hz时钟频率),发音输出接SPEAK,当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏。
作者: 李小路 时间: 2021-9-12 19:34
谢谢分享