简易电子琴电路设计
一、 设计要求:
(1) 设计一个简易电子琴。
(2) 利用实验箱的脉冲源产生 1,2,3,……共 7 个或 14 个音阶信号。
(3) 用指示灯显示节拍
(4) 能产生颤音效果。
郁可唯的歌曲二、原理说明:
简易电子琴实现自动播放和手动弹奏两种模式,由一个开头选择。自动播放功能可以预置多首乐曲,可以通过手动选择,本设计预置了两首乐曲《梁祝》和《两只老虎》。手动弹奏设置了7个按键做琴键,分别对应7个音阶。
系统由8个模块组成,图1是顶层设计文件,其内部有7个功能模块:Speakera.v(例2)ToneTaba.v你要快乐 (例3),NoteTabs.v (例4),div_27.v,div-50.v,Keyboard.v,Dir.v。
模块ToneTaba音阶发生器,当4位发声控制输入Index中某一位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得该音阶的分频预置值;同时由Code输出对应该音阶简谱的LED显示,音阶越高,LED亮的数目越多。
模块Speakera中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块Speakera由端口Tone获得一个2进制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。
模块NoteTabs用于产生节拍控制(Index数据存留时间)和音阶选择信号,即在NoteTabs模块放置两个乐曲曲谱真值表,通过song来选择播放的音乐,00代表复位,01选乐曲《梁祝》,10选《两只老虎》,由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。
模块div-27和div_50是分频模块,通过计数的方式进行分频。div_27是由板上27M时钟分频产生4Hz的频率用于节拍控制,div_50是板上50M时钟产生12.5MHz用于Sperkera模块。
模块Keyboard是键盘输入模块,检测到一个按键按下,输出一个对应的按键值。
模块Dir是模式选择模块,用于选择系统自动播放模式和键盘输入模式。当Dir为1时,为键盘输入模式,当Dir为0时为自动播放模式。
图1 硬件电子琴电路结构
顶层模块说明:时钟模块为数控分频器和节拍发生器提供基准时钟;当Dir选择键盘输入时,通过按键输入得到按键编码,再经发声模块输出相应的频率的矩形波到蜂鸣器发出相应的琴音;当Dir选择自动播放时,系统自动播放预置的乐曲,并通过开关来选择预置的曲目,系统将预置的乐曲编码经过节拍发生器输入到发声模块中发出相应的乐曲。
三、电路与仿真
1、顶层电路图
Verilog代码:
module songer(Clk_50MHZ,Clk_27MHZ,Led,Spkout,song,Dir1,keyboard);
input        Clk_50MHZ,Clk_27MHZ,Dir1;                        //Dir = 1,手动弹奏
input[1:0]    song;                    //Choose song,00:clear,01:梁祝 ,10: 两只老虎
input[6:0]    keyboard;
output[11:0]    Led;
output        Spkout;
wire[10:0]    Tone;
wire[3:0]    ToneIndex,music,keyinput,Dirout;
wire        Q1,Q2;
//模块例化
NoteTabs    u0(    .Clk(Q2),    .song(song),    .ToneIndex(ToneIndex)    );
ToneTaba    u1(    .Index(Dirout),    .Code(Led),    .Tone(Tone)    );
Speakera    u2(    .Clk(Q1),    .Tone(Tone),    .SpkS(Spkout)    );
div_50        u3(    .inclk2(Clk_50MHZ),    .outclk2(Q1)    );
div_27        u4(    .inclk1(Clk_27MHZ),    .outclk1(Q2)        );
Keyboard        u5( .key(keyboard),    .keyout(keyinput)    );
Dir            u6( .Dir(Dir1),    .music(ToneIndex),    .keyboard(keyinput),    .Dirout(Dirout));
endmodule
仿真图:
2、Sperkera Verilog代码:

module Speakera(Clk,Tone,SpkS);
input Clk;
input[10:0] Tone;
output SpkS;
reg PreClk;
reg FullSpkS;
高品质mp3打包下载 reg[3:0] Count4=0;
reg[10:0]Count11=0;
reg Count2=0;
reg SpkS;
//12Mmz ->1Mhz
always@(posedge Clk)
    begin
王子文资料      if(Count4>11)begin
          PreClk<=1'b1;
          Count4<=1;
          end
      else begin
          PreClk<=1'b0;
          Count4<=Count4+1;
          end
    end
//according to Tone,fininsh the right number counter
always@(posedge PreClk)begin
  if(Count11==11'h7FF) begin//11111111111
      Count11<=Tone;
      FullSpkS<=1'b1;
      end
  else begin
      Count11<=Count11+1;
      FullSpkS<=0;
    end
  end
//double cycle ,get right frequency ,and its ratio :50:50
always@(posedge FullSpkS)begin
  Count2<=~Count2;
  if(Count2==1'b1)    SpkS<=1'b1;
  else  SpkS<=1'b0;
  end
endmodule

功能仿真波形:
3、ToneTaba Verilog代码:唐三最新老婆
module ToneTaba (Index,Code,Tone);
input[3:0] Index;
output[11:0] Code;
output[10:0]  Tone;
 
reg[11:0] Code;
reg[10:0] Tone;
 
always
  begin
  case(Index)
    4'b0000 :begin Tone<=11'b11111111111;Code<=12'b000000000000;end//2047
    4'b0001 :begin Tone<=11'b01100000101;Code<=12'b000000000001;end//773
    4'd0010 :begin Tone<=11'b01110010000;Code<=12'b000000000011;end//912
    4'd0011 :begin Tone<=11'b10000001100;Code<=12'b000000000111;end//1036
    4'd0101 :begin Tone<=11'b10010101101;Code<=12'b000000001111;end//1197
    4'd0110 :begin Tone<=11'b10100001010;Code<=12'b000000011111;end//1290
    4'd0111 :begin Tone<=11'b10101011100;Code<=12'b000000111111;end//1372;
不被祝福的幸福
    4'd1000 :begin Tone<=11'b10110000010;Code<=12'b000001111111;end//1410;
    4'd1001 :begin Tone<=11'b10111001000;Code<=12'b000011111111;end//1480;