北京邮电大学电子节拍器的设计与实现_第1页
北京邮电大学电子节拍器的设计与实现_第2页
北京邮电大学电子节拍器的设计与实现_第3页
北京邮电大学电子节拍器的设计与实现_第4页
北京邮电大学电子节拍器的设计与实现_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字系统与逻辑设计实验-电子节拍器电子节拍器的设计与实现一 设计课题的任务要求设计并实现一个具有声光显示的电子节拍器。 基本要求: 1、 速度在 40120 次/分钟范围内连续可调,通过 2 个按键进行速度调节,一个用来增 加,一个用来减少,当长按按键时,按 5 次/秒的速度连续增加或减少,用 3 个数码 管显示当前速度。 2、 节拍有 1/4、2/4、3/4、4/4、3/8、6/8 可选,通过一个按键选择,用 2 个数码管显示。 3、 通过一个按键开始和停止打节拍,开始后按照设置好的节拍和速度打节拍。 4、 要求有声音和灯光提示,声音要有强弱区别,灯光可用不同颜色的发光二极管表示 强弱。 提

2、高要求: 1、 通过一个按键选择时值(节奏类型),并在用点阵显示,如下图。 2、 实现在无节奏型的情况下,用点阵计时,点阵的显示从0到9,时间间隔为一秒,从而帮助使用者学习乐理知识。二 系统设计(设计思路,总体框图,分块设计)1. 设计思路 程序分为输入模块,分频模块,中央控制模块和显示模块四大模块,其中显示模块又可细分为数码管显示,点阵显示,LED灯亮灯显示和蜂鸣器发声四个部分。输入有reset(复位键),st(开关键),tn(调速键),tk(调节拍键),tj(调节奏键)五个键。利用三个数码管显示速率,两个数码管显示节拍型,使用点阵显示节奏型,无节奏时点阵显示0到9的计时(时间间隔为1秒)。

3、对于开关,速率,节拍,节奏的调节,使用5HZ的时钟信号进行防抖和控制调节的速度。利用取余函数将节拍器的速率的个十百位数字分别提取出来,并通过扫描显示将节拍器的速率和节拍型显示出来。LED灯和点阵的信号依据节奏和节拍型确定,先考虑节奏型,分列出各个节奏型的信号,如果无节奏型再考虑节拍型,确定节拍型的信号。最后蜂鸣器的信号由红灯信号与250HZ高频相乘所得信号和绿灯信号与500HZ高频相乘所得信号共同合成。2总体框图(1)系统顶层框图 系统复位蜂鸣器发声电路数码管显示电路点阵显示电路LED灯显示电路 节拍器中心控制电路(2)系统对外接口图蜂鸣器LED显示数码管扫描显示点阵显示节奏选择键st节拍选择

4、键st速率调节键tn开关键st复位键Reset节拍控制器 (3)逻辑划分方框图n , kclk500,clk250,clk1clk2,clk4,clk8frow ,listb ,cr ,g gclk5clk控制器分频器时钟时钟蜂鸣器LED灯数码管点阵tjtktnstreset防抖复位键调速键节拍选择键节奏选择键开关键noyes无节奏型节奏选择键?noyes节奏型1节奏选择键?noyes节奏型2节奏选择键?noyes节奏型4节奏选择键?noyes节奏型3节奏选择键?noyes节奏型5节奏选择键?(4)逻辑流程图(由于状态先由有无节奏型确定,无节奏型时再看节拍型,为了使图形简洁美观,避免画图时线条

5、过多和交叉,此处将逻辑流程图分为两个部分,当从有节奏型转换为无节奏型时,状态转入先前的节拍型,而非默认的40HZ的1/4拍)节奏型间的转换: noyes1/4拍节拍键?noyes2/4拍节拍键?noyes3/4拍节拍键?noyes4/4拍节拍键?noyes3/8拍节拍键?noyes6/8拍节拍键?节拍内的转换:(5)MDS图节奏间的转移(其中0为无节奏,转移条件为节奏选择键输入tj):101010101010012345节拍间的转移(转移条件为节拍选择键输入tk):1010101010100102030405063. 分块设计(1) 分频模块:分频模块可以细分为两个部分,一个是与速率,节拍无关

6、的普 通分频,一个是与其有关的分频分频比的计算:待得信号单位时长 / 基础信号单位时长第一部分:需要分出的信号有clk500(用于蜂鸣器高音合成)clk250(用于蜂鸣器低音合成)clk5(用于调速,选节拍,选节奏的防抖和控制其变化速度)clk1(用于无节奏时控制计时器在0到9间转换) 第二部分:需要分出的信号有 clk8(八分音符信号)clk4(四分音符信号)clk2(二分音符信号)(2) 调速,选拍,选节奏模块对于速率,拍子和节奏的选择,各使用·一个按钮输入,通过循环实现重复选择。由于按钮输入时在上升沿有毛刺出现,为了防抖,引入5HZ的信号clk5,由clk5的上升沿决定是否变化

7、。同时,clk5的引入控制了变化的速度。(3) 数码管显示模块此模块共用到五个数码管,其中三个显示速率,两个显示节拍类型,通过引入clk250实现数码管的扫描显示。节拍的显示可以通过k的值(6种情况)直接使用case语句分类输出。而速率的显示由于速率从每分钟40次到每分钟120次,中间共有81种情况,不可能直接依据其值n进行分类,写出每一种情况对应的数码管扫描输出。所以需要提前把速率的每一个数位上的数字提取出来,便于输出。提取每一位的数字可以利用取余函数rem, 具体如下: c3<=n rem 10; c2<=(n-c3) rem 100)/10; c1<=(n-c2*10-

8、c3)/100;(4) 点阵显示模块实验室提供的点阵是8乘8的行扫描点阵。点阵模块在此要实现两个功能能,一是在无节奏普通节拍的情况下实现从0到9的时钟计时(两个数字时间间隔为1秒),第二则是在有节奏型的情况下,将节奏型的符号显示在点阵上。为了实现此两个功能,要引入一个变量p来进行区分:当无节奏型(j=1)时,p在0到9间转换,实现计时功能;当有节奏型(j!=1)时,p=j+8,用于显示节奏符号的情况。实际上,点阵显示共有15种状态(10+5)。 (5) LED灯显示模块LED灯采用两个不同颜色的灯输出,一红一黄,分别代表强弱拍。根据有无节奏类型和节拍类型,可先确定一个基本的信号,以下以3/4拍

9、为例,则基本信号为四分音符信号clk4,再通过引入计数变量y1,y1在clk4的上升沿出现时发生变化,且在0到2间变化,若y1对3取余为0,则将基本信号赋值给红灯输出,否则将信号赋值给绿灯输出,从而实现信号的抽取(注意将此处得到的信号与普通分频得到的信号加以区分,占空比不为50%)。其余的节奏和节拍均可用类似的方法抽取出LED红绿灯的信号。(6) 蜂鸣器发声模块蜂鸣器的声是实现在LED灯显示的基础上的,由于LED的红灯亮时,蜂鸣器发出声调较低的响声(强音),当LED绿灯亮时发出声调较高的响声(弱音),蜂鸣器和LED间有明显的同步关系,则蜂鸣器的具体实现为:将LED红灯信号与次高频信号相乘,将L

10、ED绿灯信号与高频信号相乘,再将两者相加,赋值给蜂鸣器。实现语句可写为: clkf<=(clkr and clk250) or (clkg and clk500)三 仿真波形及波形分析1. 分频波形分析 此处的分频为与速率,节拍,节奏无关的分频。从图中我们可以看出clk250是clk500的2分频,而clk5是clk250的50分频。在仿真的后半部分,当reset输入为1时,clk250不再随clk500上升沿的到来而发生翻转,因为reset为1时,程序中令每一个用于记录翻转的信号temp为0,无法到达发生翻转的数值。2. 速率选择,节拍选择,节奏选择部分仿真 对n(速率)的分析:从图中

11、可以看出,n的初始值为40,输入信号tn为0时,n值保持不变;当输入信号tn为1且clk5的上升沿到来时,n的值加1。当复位键信号reset为1时,n的值回复到默认设定值40。从后半部分可以看出,当tn输入为1而clk5的时钟上升沿没到来的话,n的值不变。对k(节拍)的分析:从图中可以看出,k的初始值为1,输入信号tk为0时,k值保持不变;当输入信号tk为1且clk5的上升沿到来时,k的值加1。K的值在1到6间循环变换。当复位键信号reset为1时,k的值回复到默认设定值1。从后半部分可以看出,当tk输入为1而clk5的时钟上升沿没到来的话,k的值不变。对j(节奏)的分析:从图中可以看出,j的

12、初始值为1,输入信号tj为0时,j值保持不变;当输入信号tj为1且clk5的上升沿到来时,j的值加1。j的值在1到6间循环变换。当复位键信号reset为1时,j的值回复到默认设定值1。从后半部分可以看出,当tj输入为1而clk5的时钟上升沿没到来的话,j的值不变。总体分析:由于clk5信号的引入,按键输入实现的防抖的效果。同时,clk5控制了速率,节拍,节奏的变化速度,当clk5取值5HZ的信号时,能够实现每秒变化5次的效果。3. 数码管显示部分仿真 对c(数码管)的分析;c控制6个数码管的亮灭,且为低电平有效。从图中可以看出,当clk250的上升沿到来的时候,c的值发生改变。在此程序中,共使

13、用5个数码管,当一个clk250的上升沿到来时,换一个数码管亮,数码管亮的次序为5->4->3->1->0,然后再循环。由于每个数码管闪烁的频率为50hz,所以人眼无法分辨出来,实现每个管的稳定显示。对单个数码管的分析:b控制单个数码管7个管脚的亮灭,且为高电平有效。从图中可以看到:当n=40,k=1的时候,b表示的数字依次为0->4-> 0->1->4,表示速率为40hz每分钟和节拍型为1/4拍;当n=41,k=2的时候,b表示的数字依次为0->4->1->2->4,表示表示速率为41hz每分钟和节拍型为2/4拍。综合分

14、析:当复位键reset输入信号为1时,用于扫描计数的q_tem值一直为0,所以c中一直是数码管5亮,亮的时间延长。Reset值对b的输出值无影响。 4.红绿灯输出,蜂鸣器输出部分仿真总体分析:从图中开始部分可以看出,当开关键输入为1且clk5的上升沿到来时,开关信号才输入有效,所以第二次开关键输入为1而无clk1的上升沿到来时,红绿灯蜂鸣器均有输出,不发生改变;末尾处开关输入为1且有上升沿,从“开”的状态转换为“关”状态,输出均为0。 红绿灯输出信号分析:开始时,k=1,p=1或p=5,由于p<10,为普通节拍型1/4拍,所以红灯信号等于时钟信号clk4; 然后,k=2,p=0,由于p&

15、lt;10,为普通节拍型2/4拍,红绿信号单位置1时长与clk4的单位置1时长相等,且交替置1,表示红绿灯每次亮灯时长与clk4的单位高电平时长一致,且红绿灯交替闪烁; 然后,k=5,p=1,由于p<10,为普通节拍型3/8拍,红绿信号单位置1时长与clk8的单位置1时长相等,且置1顺序为红绿绿,表示红绿灯每次亮灯时长与clk8的单位高电平时长一致,且红绿灯发光顺序为红绿绿; 最后,k=1,p=13,由于p>10,为节奏型。从图中可以看到,红灯信号的单位置1时长与clk4单位高电平时长一致,绿灯信号单位置1时长与clk8单位高电平时长一致,且置1的顺序为红绿绿。则此时表示的节奏型为

16、四分音符时长强拍八分音符时长弱拍八分音符时长弱拍,即“红空空绿空绿空”“强空空弱空弱空”的节奏型。蜂鸣器分析:蜂鸣器的信号由红灯信号与clk250相乘加上绿灯信号与clk250相乘所得。所以从图上可以看到,当红灯信号为1时,蜂鸣器等于信号clk250,当绿灯信号为1时,蜂鸣器等于信号clk500,否则蜂鸣器信号为0。四 源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jiepaiqi isport(clk,st,tn,tk,tj,reset:in std_logic; b:ou

17、t std_logic_vector(6 downto 0); c:out std_logic_vector(5 downto 0); r_out,g_out,f_out:out std_logic; row:out std_logic_vector(7 downto 0); list:out std_logic_vector(7 downto 0) );end jiepaiqi;architecture a of jiepaiqi is signal n:integer range 40 to 120; signal k:integer range 1 to 6; signal clk500

18、,clk250, clk5, clk1,clk8,clk4,clk2,clk48,clkr,clkg,clkf,clkst:std_logic; signal tem500:integer range 0 to 49999; signal tem5:integer range 0 to 24; signal tem1:integer range 0 to 124; signal q_tem:integer range 0 to 4; signal c1:integer range 0 to 1; signal c2,c3:integer range 0 to 9; signal tem8:in

19、teger range 0 to 18749999; signal k1:integer range 0 to 7; signal y1:integer range 0 to 5; signal y2:integer range 0 to 5; signal y3:integer range 0 to 3; signal y4:integer range 0 to 2; signal r,g,f:std_logic; signal j:integer range 1 to 6; signal p:integer range 0 to 14; signal p_tem:integer range

20、 0 to 5; begin p1:process(reset,clk) -clk分频,得500HZ信号clk500 begin if reset='1'then tem500<=0; elsif (clk'event and clk='1')then if tem500=49999 then tem500<=0;clk500<=not clk500; else tem500<=tem500+1; end if; end if; end process p1; p2:process(reset,clk500) -clk500分频,

21、得250HZ信号clk250 begin if reset='1'then clk250<='0' elsif (clk500'event and clk500='1')then clk250<=not clk250; end if; end process p2; p3:process(reset,clk250) -clk250分频,得5HZ信号clk5 begin if reset='1'then tem5<=0; elsif (clk250'event and clk250='1&#

22、39;)then if tem5=24 then tem5<=0;clk5<=not clk5; else tem5<=tem5+1; end if; end if; end process p3; p4:process(reset,clk250) -clk250分频,得1HZ信号clk1 begin if reset='1'then tem1<=0; elsif (clk250'event and clk250='1')then if tem1=124 then tem1<=0;clk1<=not clk1; els

23、e tem1<=tem1+1; end if; end if; end process p4; p5:process(reset,clk5,tn) -调速率n begin if reset='1'then n<=40; elsif (tn='1' )then -防抖 if (clk5'event and clk5='1') then if (n=120) then n<=40; else n<=n+1; end if; end if; end if; end process p5; p6:process(tk,re

24、set,clk5) -调节拍型k begin if reset='1'then k<=1; elsif (tk='1')then -防抖 if (clk5'event and clk5='1') then if k=6 then k<=1; else k<=k+1; end if; end if; end if; end process p6; p7:process(tj,reset,clk5) -调节奏型j begin if reset='1'then j<=1; elsif (tj='1

25、')then -防抖 if (clk5'event and clk5='1') then if j=6 then j<=1; else j<=j+1; end if; end if; end if; end process p7; p8:process(reset,n,k,clk250) -数码管扫描显示 begin if (clk250'event and clk250='1')then if reset='1'then q_tem<=0; elsif q_tem=4 then q_tem<=0;

26、 else q_tem<=q_tem+1; end if; c3<=n rem 10; -提取速率的个十百位数字 c2<=(n-c3) rem 100)/10; c1<=(n-c2*10-c3)/100; case q_tem is when 0 =>c<="011111" case c1 is when 0 =>b<="1111110" when 1 =>b<="0110000" when others=>b<="0110000" end c

27、ase; when 1 =>c<="101111" case c2 is when 0 =>b<="1111110" when 1 =>b<="0110000" when 2 =>b<="1101101" when 3 =>b<="1111001" when 4 =>b<="0110011" when 5 =>b<="1011011" when 6 =>b<=&

28、quot;1011111" when 7 =>b<="1110000" when 8 =>b<="1111111" when 9 =>b<="1111011" when others=>b<="0000000" end case; when 2 => c<="110111" case c3 is when 0 =>b<="1111110" when 1 =>b<="0110

29、000" when 2 =>b<="1101101" when 3 =>b<="1111001" when 4 =>b<="0110011" when 5 =>b<="1011011" when 6 =>b<="1011111" when 7 =>b<="1110000" when 8 =>b<="1111111" when 9 =>b<="

30、1111011" when others=>b<="0000000" end case; when 3 =>c<="111101" case k is when 1 =>b<="0110000" when 2 =>b<="1101101" when 3 =>b<="1111001" when 4 =>b<="0110011" when 5 =>b<="1111001&quo

31、t; when 6 =>b<="1011111" when others=>b<="0000000" end case; when 4 =>c<="111110" case k is when 1 =>b<="0110011" when 2 =>b<="0110011" when 3 =>b<="0110011" when 4 =>b<="0110011" when 5 =

32、>b<="1111111" when 6 =>b<="1111111" when others=>b<="0000000" end case; end case; end if; end process p8; p9:process(j,reset,st,clk1,clk250) -点阵显示,此处为行扫描 begin if j=1 then if( reset='1' or st='1' or p>9) then p<=0; elsif (clk1'

33、;event and clk1='1')then if p=9 then p<=0; else p<=p+1; end if; end if; else p<=j+8; end if; if (clk250'event and clk250='1')then if reset='1'then p_tem<=0; elsif p_tem=5 then p_tem<=0; else p_tem<=p_tem+1; end if; case p_tem is when 0 =>row<="

34、;10111111" case p is when 0 =>list<="00111100" when 1 =>list<="00100000" when 2 =>list<="00111100" when 3 =>list<="00111100" when 4 =>list<="00100100" when 5 =>list<="00111100" when 6 =>list<=&

35、quot;00111100" when 7 =>list<="00111100" when 8 =>list<="00111100" when 9 =>list<="00111100" when 10 =>list<="00010000" when 11 =>list<="00111100" when 12 =>list<="00111100" when 13 =>list<=&qu

36、ot;11111110" when 14 =>list<="00111100" when others=>list<="00000000" end case; when 1 =>row<="11011111" case p is when 0 =>list<="00100100" when 1 =>list<="00100000" when 2 =>list<="00100000" when 3

37、 =>list<="00100000" when 4 =>list<="00100100" when 5 =>list<="00000100" when 6 =>list<="00000100" when 7 =>list<="00100000" when 8 =>list<="00100100" when 9 =>list<="00100100" when 10 =>

38、;list<="00010000" when 11 =>list<="00100100" when 12 =>list<="00100100" when 13 =>list<="10010010" when 14 =>list<="00100100" when others=>list<="00000000" end case; when 2 =>row<="11101111"

39、case p is when 0 =>list<="00100100" when 1 =>list<="00100000" when 2 =>list<="00111100" when 3 =>list<="00111100" when 4 =>list<="00111100" when 5 =>list<="00111100" when 6 =>list<="00111100&qu

40、ot; when 7 =>list<="00100000" when 8 =>list<="00111100" when 9 =>list<="00111100" when 10 =>list<="00010000" when 11 =>list<="00100100" when 12 =>list<="00111100" when 13 =>list<="11110010"

41、; when 14 =>list<="00110100" when others=>list<="00000000" end case; when 3 =>row<="11110111" case p is when 0 =>list<="00100100" when 1 =>list<="00100000" when 2 =>list<="00000100" when 3 =>list<=&

42、quot;00100000" when 4 =>list<="00100000" when 5 =>list<="00100000" when 6 =>list<="00100100" when 7 =>list<="00100000" when 8 =>list<="00100100" when 9 =>list<="00100000" when 10 =>list<="

43、00010000" when 11 =>list<="00100100" when 12 =>list<="00100100" when 13 =>list<="10010010" when 14 =>list<="00100100" when others=>list<="00000000" end case; when 4 =>row<="11111011" case p is when 0

44、 =>list<="00111100" when 1 =>list<="00100000" when 2 =>list<="00111100" when 3 =>list<="00111100" when 4 =>list<="00100000" when 5 =>list<="00111100" when 6 =>list<="00111100" when 7 =>

45、list<="00100000" when 8 =>list<="00111100" when 9 =>list<="00111100" when 10 =>list<="00010000" when 11 =>list<="00100100" when 12 =>list<="00100100" when 13 =>list<="10010010" when 14 =>l

46、ist<="00100100" when others=>list<="00000000" end case; when 5 =>row<="11111101" case p is when 10 =>list<="00011000" when 11 =>list<="00110110" when 12 =>list<="00110110" when 13 =>list<="1101101

47、1" when 14 =>list<="00110110" when others=>list<="00000000" end case; end case; end if;end process p9; p10:process(reset,clk,n) -依据n值,从clk分出8分音符间隔信号clk8 begin if reset='1'then tem8<=0; elsif (clk'event and clk='1')then if tem8=750000000/n-1

48、 then tem8<=0;clk8<=not clk8; else tem8<=tem8+1; end if; end if; end process p10; p11:process(clk8) -从clk8分出四分音符间隔信号clk4 begin if (clk8'event and clk8='1')then clk4<=not clk4; end if; end process p11; p12:process(clk4) -从clk4分出二分音符间隔信号clk2 begin if (clk4'event and clk4=&#

49、39;1')then clk2<=not clk2; end if; end process p12; p13:process(k,clk2,clk4,clk8,reset,st,clk48,p) -红绿灯闪烁输出定值 begin case k is -依据节拍型号赋值基本信号clk48,为红绿信号赋值做准备 when 1 =>clk48<=clk4;k1<=1; when 2 =>clk48<=clk4;k1<=2; when 3 =>clk48<=clk4;k1<=3; when 4 =>clk48<=clk4

50、;k1<=4; when 5 =>clk48<=clk8;k1<=3; when 6 =>clk48<=clk8;k1<=6; when others=>clk48<=clk4;k1<=1; end case; if (reset='1' or st='1') then y3<=0; elsif (clk8'event and clk8='1')then if y3=3 then y3<=0; else y3<=y3+1; end if; end if; if

51、(reset='1' or st='1') then y4<=0; elsif (clk8'event and clk8='1')then if y4=2 then y4<=0; else y4<=y4+1; end if; end if; if (reset='1' or st='1') then y1<=0; elsif (clk48'event and clk48='1')then if y1=k1-1 then y1<=0;y2<=y1 r

52、em k1; else y1<=y1+1;y2<=y1 rem k1; end if; end if; case p is -红绿灯信号赋值,10至14为节奏型,其余为基本节拍型(无节奏) when 10 =>clkr<=clk2;clkg<='0' when 11 =>clkr<=clk4;clkg<='0' when 12 =>clkr<=clk8;clkg<='0' when 13 => if y3<2 then clkr<=clk4;clkg<=&#

53、39;0' else clkg<=clk8;clkr<='0' end if; when 14=> if y4<2 then clkr<=clk4;clkg<='0' else clkg<=clk8;clkr<='0' end if; when others=> -节拍型的红绿灯信号赋值(从基本信号clk48抽取) if y2=0 then clkr<=clk48;clkg<='0' else clkg<=clk48;clkr<='0' end if; end case; end process p13; p14:process(st,clk5,clk500,clk250,clkr,clkg) -蜂鸣器输出赋值 begin if (st='1')then -开关防抖 if (clk5'event and clk5='1')then clkst<=not clkst; end if; end if; if clkst='1'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论