您好,欢迎来到好土汽车网。
搜索
您的当前位置:首页电子节拍器的设计与实现

电子节拍器的设计与实现

来源:好土汽车网
数字系统与逻辑设计实验----电子节拍器

北 京 邮 电 大 学

数字系统与逻辑设计实验报告 电子节拍器的设计与实现

学院 : 电子工程学院 班级 : 2013211207 学号: 2013210999 姓名: 刘炜伦

日期 : 2015-11-08

1

数字系统与逻辑设计实验----电子节拍器

电子节拍器的设计与实现

一. 设计课题的任务要求

设计并实现一个具有声光显示的电子节拍器。 基本要求:

1、 速度在 40~120 次/分钟范围内连续可调,通过 2 个按键进行速度调节,一个用来增 加,一个用来减少,当长按按键时,按 5 次/秒的速度连续增加或减少,用 3 个数码 管显示当前速度。

2、 节拍有 1/4、2/4、3/4、4/4、3/8、6/8 可选,通过一个按键选择,用 2 个数码管显示。

3、 通过一个按键开始和停止打节拍,开始后按照设置好的节拍和速度打节拍。 4、 要求有声音和灯光提示,声音要有强弱区别,灯光可用不同颜色的发光二极管表示 强弱。 提高要求: 1、

通过一个按键选择时值(节奏类型),并在用点阵显示,如下图。

2、

实现在无节奏型的情况下,用点阵计时,点阵的显示从0到9,时间间隔为一秒,从而帮助使用者学习乐理知识。

二. 系统设计(设计思路,总体框图,分块设计)

1. 设计思路

程序分为输入模块,分频模块,控制模块和显示模块四大模块,其中显示模块又可细分为数码管显示,点阵显示,LED灯亮灯显示和蜂鸣器发声四个部分。输入有reset(复位键),st(开关键),tn(调速键),tk(调节拍键),tj(调节奏键)五个键。利用三个数码管显示速率,两个数码管显示节拍型,使用点阵显示节奏型,无节奏时点阵显示0到9的计时(时间间隔为1秒)。对于开关,速率,节拍,节奏的调节,使用5HZ的时钟信号进行防抖和控制调节的速度。利用取余函数将节拍器的速率的个十百位数字分别提取出来,并通过扫描显示将节拍器的速率和节拍型显示出来。LED灯和点阵的信号依据节奏和节拍型确定,先考虑节奏型,分列

2

数字系统与逻辑设计实验----电子节拍器

出各个节奏型的信号,如果无节奏型再考虑节拍型,确定节拍型的信号。最后蜂鸣器的信号由红灯信号与250HZ高频相乘所得信号和绿灯信号与 500HZ高频相乘所得信号共同合成。 2.总体框图 (1)系统顶层框图

(2)系统对外接口图

(3)逻辑划分方框图

3

数码管显示电路 点阵显示电路 LED灯显示电路 蜂鸣器发声电路 节拍器中心控制电路 系统复位 复位键Reset 开关键st 速率调节键tn 节拍选择键st 节奏选择键st 节 拍 控 制 器 蜂鸣器 LED显示 数码管扫描显示 点阵显示 数字系统与逻辑设计实验----电子节拍器

时钟 clk 分频器 n , k row ,list clk5 点阵 clk500,clk250,clk1 clk2,clk4,clk8 蜂鸣器 f 控制器 r ,g g b ,c 数码管 LED灯 复位键 reset 防抖 tj 节奏选择键 st tn 开关键 调速键 tk 节拍选择键 (4)逻辑流程图(由于状态先由有无节奏型确定,无节奏型时再看节拍型,

为了使图形简洁美观,避免画图时线条过多和交叉,此处将逻辑流程图分为两个部分,当从有节奏型转换为无节奏型时,状态转入先前的节拍型,而非默认的40HZ的1/4拍) 节奏型间的转换:

no 节奏选择键? yes 4 no 节奏选择键? yes 节奏型2 no 节奏选择键? yes no 节奏选择键? yes 节奏型1 no 节奏选择键? yes 节奏型5 无节奏型 no 节奏选择键? yes 节奏型4 节奏型3 数字系统与逻辑设计实验----电子节拍器

节拍内的转换:

(5)MDS图

节奏间的转移(其中0为无节奏,转移条件为节奏选择键输入tj):

节拍间的转移(转移条件为节拍选择键输入tk):

5

no 节拍键? yes no 节拍键? yes 3/4拍 no 节拍键? yes no 节拍键? yes 2/4拍 no 节拍键? yes 6/8拍 1/4拍 no 节拍键? yes 3/8拍 4/4拍 0 0 1 0 1 1 0 2 1 1 5 0 1 4 0 1 3 0 数字系统与逻辑设计实验----电子节拍器

3. 分块设计

0 01 1 06 0 1 1 0 02 1 0 03 1 05 0 1 04 0 (1) 分频模块:分频模块可以细分为两个部分,一个是与速率,节拍无关的普

通分频,一个是与其有关的分频

分频比的计算:待得信号单位时长 / 基础信号单位时长 第一部分:需要分出的信号有

clk500(用于蜂鸣器高音合成) clk250(用于蜂鸣器低音合成)

clk5(用于调速,选节拍,选节奏的防抖和控制其变化速度) clk1(用于无节奏时控制计时器在0到9间转换)

第二部分:需要分出的信号有 clk8(八分音符信号)

clk4(四分音符信号) clk2(二分音符信号)

(2) 调速,选拍,选节奏模块

对于速率,拍子和节奏的选择,各使用·一个按钮输入,通过循环实现重复选择。由于按钮输入时在上升沿有毛刺出现,为了防抖,引入5HZ的信号clk5,由clk5的上升沿决定是否变化。同时,clk5的引入控制了变化的速度。

(3) 数码管显示模块

6

数字系统与逻辑设计实验----电子节拍器

此模块共用到五个数码管,其中三个显示速率,两个显示节拍类型,通过引入clk250实现数码管的扫描显示。

节拍的显示可以通过k的值(6种情况)直接使用case语句分类输出。而速率的显示由于速率从每分钟40次到每分钟120次,中间共有81种情况,不可能直接依据其值n进行分类,写出每一种情况对应的数码管扫描输出。所以需要提前把速率的每一个数位上的数字提取出来,便于输出。提取每一位的数字可以利用取余函数rem, 具体如下:

c3<=n rem 10; c2<=((n-c3) rem 100)/10; c1<=(n-c2*10-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拍为例,则基本信号为四分音符信号clk4,再通过引入计数变量y1,y1在clk4的上升沿出现时发生变化,且在0到2间变化,若y1对3取余为0,则将基本信号赋值给红灯输出,否则将信号赋值给绿灯输出,从而实现信号的抽取(注意将此处得到的信号与普通分频得到的信号加以区分,占空比不为50%)。其余的节奏和节拍均可用类似的方法抽取出LED红绿灯的信号。

(6) 蜂鸣器发声模块

蜂鸣器的声是实现在LED灯显示的基础上的,由于LED的红灯亮时,蜂鸣器发出声调较低的响声(强音),当LED绿灯亮时发出声调较高的响声(弱音),蜂鸣器和LED间有明显的同步关系,则蜂鸣器的具体实现为:将LED红灯信号与次高频信号相乘,将LED绿灯信号与高频信号相乘,再将两者相加,赋值给蜂鸣器。实现语句可写为:

clkf<=(clkr and clk250) or (clkg and clk500)

7

数字系统与逻辑设计实验----电子节拍器

三. 仿真波形及波形分析

1. 分频波形分析

此处的分频为与速率,节拍,节奏无关的分频。从图中我们可以看出clk250是clk500的2分频,而clk5是clk250的50分频。在仿真的后半部分,当reset输入为1时,clk250不再随clk500上升沿的到来而发生翻转,因为reset为1时,程序中令每一个用于记录翻转的信号temp为0,无法到达发生翻转的数值。 2. 速率选择,节拍选择,节奏选择部分仿真

对n(速率)的分析:从图中可以看出,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的初始值为1,输入信号tj为0时,j值保持

不变;当输入信号tj为1且clk5的上升沿到来时,j的值加1。j的值在1到6间循环变换。当复位键信号reset为1时,j的值回复到默认设定

8

数字系统与逻辑设计实验----电子节拍器

值1。从后半部分可以看出,当tj输入为1而clk5的时钟上升沿没到来的话,j的值不变。

总体分析:由于clk5信号的引入,按键输入实现的防抖的效果。同时,clk5控制了速

率,节拍,节奏的变化速度,当clk5取值5HZ的信号时,能够实现每秒变化5次的效果。

3. 数码管显示部分仿真

对c(数码管)的分析;c控制6个数码管的亮灭,且为低电平有效。从图中可以看出,

当clk250的上升沿到来的时候,c的值发生改变。在此程序中,共使用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拍。

综合分析:当复位键reset输入信号为1时,用于扫描计数的q_tem值一

直为0,所以c中一直是数码管5亮,亮的时间延长。Reset值对b的输出值无影响。

9

数字系统与逻辑设计实验----电子节拍器

4.红绿灯输出,蜂鸣器输出部分仿真

总体分析:从图中开始部分可以看出,当开关键输入为1且clk5的上升沿

到来时,开关信号才输入有效,所以第二次开关键输入为1而无clk1的上升沿到来时,红绿灯蜂鸣器均有输出,不发生改变;末尾处开关输入为1且有上升沿,从“开”的状态转换为“关”状态,输出均为0。

红绿灯输出信号分析:开始时,k=1,p=1或p=5,由于p<10,为普通节拍型1/4拍,

所以红灯信号等于时钟信号clk4;

然后,k=2,p=0,由于p<10,为普通节拍型2/4拍,红绿信

号单位置1时长与clk4的单位置1时长相等,且交替置1,表

10

数字系统与逻辑设计实验----电子节拍器

示红绿灯每次亮灯时长与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的顺序为红绿绿。则此时表示的节奏型为四分音符时长强拍八分音符时长弱拍八分音符时长弱拍,即“红~空空绿空绿空”“强~空空弱空弱空”的节奏型。

蜂鸣器分析:蜂鸣器的信号由红灯信号与clk250相乘加上绿灯信号与clk250

相乘所得。所以从图上可以看到,当红灯信号为1时,蜂鸣器等于信号clk250,当绿灯信号为1时,蜂鸣器等于信号clk500,否则蜂鸣器信号为0。

四. 源程序

library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity jiepaiqi is

port(clk,st,tn,tk,tj,reset:in std_logic; b:out 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;

11

数字系统与逻辑设计实验----电子节拍器

signal clk500,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:integer 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 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;

12

数字系统与逻辑设计实验----电子节拍器

p2:process(reset,clk500) --clk500分频,得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')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; else tem1<=tem1+1; end if; end if; end process p4;

p5:process(reset,clk5,tn) --调速率n

13

数字系统与逻辑设计实验----电子节拍器

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,reset,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')then --防抖 if (clk5'event and clk5='1') then

14

数字系统与逻辑设计实验----电子节拍器

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; 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 case;

when 1 =>c<=\"101111\"; case c2 is

when 0 =>b<=\"1111110\";

15

数码管扫描显示 提取速率的个十百位数字 数字系统与逻辑设计实验----电子节拍器

when 1 =>b<=\"0110000\"; 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<=\"1111011\"; when others=>b<=\"0000000\"; end case;

when 2 => c<=\"110111\"; case c3 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<=\"1011111\"; when 7 =>b<=\"1110000\"; when 8 =>b<=\"1111111\"; when 9 =>b<=\"1111011\"; when others=>b<=\"0000000\"; end case;

when 3 =>c<=\"111101\"; case k is

when 1 =>b<=\"0110000\";

16

数字系统与逻辑设计实验----电子节拍器

when 2 =>b<=\"1101101\"; when 3 =>b<=\"1111001\"; when 4 =>b<=\"0110011\"; when 5 =>b<=\"1111001\"; 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 =>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'event and clk1='1')then if p=9 then p<=0;

17

数字系统与逻辑设计实验----电子节拍器

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<=\"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<=\"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<=\"11111110\"; when 14 =>list<=\"00111100\";

18

数字系统与逻辑设计实验----电子节拍器

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 =>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 =>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\"; case p is

when 0 =>list<=\"00100100\"; when 1 =>list<=\"00100000\"; when 2 =>list<=\"00111100\"; when 3 =>list<=\"00111100\"; when 4 =>list<=\"00111100\";

19

数字系统与逻辑设计实验----电子节拍器

when 5 =>list<=\"00111100\"; when 6 =>list<=\"00111100\"; 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\"; 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<=\"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<=\"00010000\"; when 11 =>list<=\"00100100\"; when 12 =>list<=\"00100100\"; when 13 =>list<=\"10010010\"; when 14 =>list<=\"00100100\";

20

数字系统与逻辑设计实验----电子节拍器

when others=>list<=\"00000000\"; end case;

when 4 =>row<=\"11111011\"; case p is

when 0 =>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 =>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 =>list<=\"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<=\"11011011\"; when 14 =>list<=\"00110110\";

21

数字系统与逻辑设计实验----电子节拍器

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 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

22

数字系统与逻辑设计实验----电子节拍器

if (clk4'event and clk4='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;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 (reset='1' or st='1') then y4<=0; elsif (clk8'event and clk8='1')then if y4=2 then y4<=0;

23

数字系统与逻辑设计实验----电子节拍器

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 rem 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<='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';

24

数字系统与逻辑设计实验----电子节拍器

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' then clkf<=(clkr and clk250) or (clkg and clk500);f<=clkf;r<=clkr;g<=clkg;

else clkf<='0';r<='0';g<='0'; end if;

end process p14;

r_out<=r;g_out<=g;f_out<=clkf; --信号给输出红绿灯及蜂鸣器输出端口赋值 end a;

五. 功能说明及资源利用情况

1. 功能说明

本次实验所写程序完成的基本功能如下:

25

数字系统与逻辑设计实验----电子节拍器

(1)速度在 40~120 次/分钟范围内连续可调,通过1个按键进行速度调节,用来增 加速率,当长按按键时,按 5 次/秒的速度连续增加,当速率达到120时循环增加回到40,用 3 个数码 管显示当前速度。

( 2)节拍有 1/4、2/4、3/4、4/4、3/8、6/8 可选,通过一个按键选择,用 2 个数码管显示。

(3)可以使用一个按键开始和停止打节拍,开始后按照设置好的节拍和速度打节拍。

( 4)通过蜂鸣器发声和LED灯光来表示节奏和节拍,声音有强弱区别,灯光用红色和绿色两种发光二极管对应表示 强弱。 (6/8拍的声音仅有强弱,没有设定次强;6/8的发光二极管仅有两色,与声音的强弱相对应)

完成的提高功能有以下两个:

(1)通过一个按键选择时值(节奏类型),并在用点阵显示,如下图。

节奏型的选择共设有以上图中的1,2,4,5,6共五种选择,当节奏型为无时,节拍器为普通节拍型(见基本功能)

(2)在无节奏型的情况下,用点阵计时,点阵的显示从0到9,时间间隔为一秒。对于乐理不太了解的使用者,可以根据计时器来对比各种节拍,节奏型发声的时间间隔,从而学习乐理知识。(何为1/4, 2/4, 3/4, 4/4, 3/8, 6/8拍,以4为“分母”的拍子和以8为“分母”的拍子的时长关系是什么,各个节奏型的发声时长是多少,节奏型的符号是什么意思等)

2. 资源利用情况

实验室开发板部件的使用情况:

(1) 输入按键5个:reset(复位), st(开关), tn(调速),

tk(节拍选择), tj(节奏选择)

(2) 数码管5个:三个显示速率,两个显示节奏 (3) 点阵:计时器和显示节奏型 (4) 蜂鸣器

26

数字系统与逻辑设计实验----电子节拍器

(5) LED灯两个 程序占用情况:

六. 故障及问题分析

1. 故障:当调节速率的按键摁下时,速率的增加是随机的。

问题分析:按键按下时,输入量从0到1的上升沿有许多的毛刺,所以不能使用输

入信号的上升沿来控制速率的增加。

解决办法:引入5HZ的时钟信号clk5,当输入信号为1时,来一个clk5的上升沿

就改变一次速率的值。

2. 故障:程序从clk48(四分音符信号或八分音符信号)中利用分频得出红灯信号,

再将红灯信号取非后与上clk48后所得信号赋值给绿灯信号。结果除了1/4拍外红灯发光时长均过长(占总时间50%),绿灯每节内发光的次数不对,且有某些节拍每一节中第一次亮的时间为其他的1/2。

问题分析:分频后的信号的占空比还是50%,并不是每隔一定时长将原信号抽取出来,

我们实验中所要获得的红绿灯信号与普通分频得到的信号是有本质的区别的,其占空比并不一定为50%。

解决办法:引入循环计数变量tem,,tem对拍子的分子取余后若为零则将信号clk48

赋值给红灯,否则赋值给绿灯。

27

数字系统与逻辑设计实验----电子节拍器

3. 故障:数码管显示存在闪烁现象

问题分析:人眼能够识别的最高频率是30hz,若单个数码管每秒闪烁次数小于30,则

会被人眼识别出来。数码扫描的频率过低。

解决办法;增大控制数码管显示的时钟信号的频率。 4. 故障:点阵扫描的显示中点与点的亮度不一。

问题分析:点阵分为行扫描和列扫描两种,使用时必须严格按照点阵本身设定决定使

用行扫描还是列扫描。

解决办法:点阵开始时使用的是列扫描,改为行扫描即可。

七. 总结和结论

本次实验是《数字系统与逻辑设计》这门课程一次综合的应用,是一次我们将课本知识运用到实际生活中的机会。通过这次实验,我加深了对课本知识的理解,进一步掌握了Qyartus软件的使用。同时,通过这次实验,我懂得了数码管,点阵和蜂鸣器的工作原理。俗话说,实践出真知。通过实践,在加深对知识的了解的同时,更是增加了我对学习的兴趣,让人感觉课本的知识不再枯燥。

当然,在学习上的收获还有很重要的一点,就是如何进行综合课题的设计。从理解题目要求,到根据题目的要求画出顶层框图,确定对外接口,画出逻辑划分图确定各个部分间的关系,再得出逻辑流程图并据此画出状态转移图。从写出基本的代码程序到仿真,从下载程序到实验板实现基本功能到修改代码使功能更齐全更完善,再到最后的写报告对实验做出总结和反思,这就是进行一个综合课题设计的流程。通过则一次的实验,我们对综合课题设计有了一个总体上的认识:综合课题设计的过程是从上到下,从总体到部分的,先从总体把握问题,再将问题划分为一个个小的模块,分开解决。这对于以后我们做更大的课题的帮助是显而易见的。 除了学习上的收获,我的收获还有如下几点:

1.永远不要被困难吓倒,只要你一步步坚定地往前走,所有的麻烦终会被解决。开始接触实验的时候真的觉得不知道从何处下手,感觉自己不可能完成这个任务。可是随着学习相关的乐理知识,再到画出顶层框图、对外接口图、逻辑划分图、逻辑流程图、MDS图,心中对于自己要做的事就有几分的了解,不再觉得无从下手。再到找出以前的课本,复习Quartus2的使用方法和语法,慢慢写出简单的程序,到最后整个实验的完成。现在回头看时,才发现原来自己写的程序是那么的简单,和开始时的感觉是完全不同的。所以,可能你走的每一

28

数字系统与逻辑设计实验----电子节拍器

步都很小,但是每当你走出一步后,就会觉得视野更开阔了,更加知道自己要往哪个方向走了。

2.磨刀不误砍柴工。这点已经写了很多次了,但还是要写下来提醒自己才行。这点体会比较深刻主要是因为仿真和修改完善自己的程序的问题。这次实验我写的程序是用多线程的方法的,并没有分模块。由于程序的变量较多,而我又没有分模块,所以写代码的过程中偶尔会忘记某些变量的作用,这对我修改程序产生了一定不好的影响。而后期的仿真的时候,更是不得已将程序重新拆分出来构建新的工程,浪费了大量的时间。对于一个大的课题,分模块是必须的,不能因为贪图一时的便利就省了这一步,磨刀定不误砍柴工。

3.必须深刻理解课题设计的要求,理解题意,细心谨慎。这一点我在这次的实验中做得不太好。我在做这个电子节拍器之前对于乐理知识的了解不多,甚至分不清拍子和节奏的区别,所以只能通过手机下载电子节拍器学习了解相关知识,再根据自己的理解来设计我要做的电子节拍器。可是由于理解出现了一些偏差,以至于对6/8拍的把握不大准确,以及对一两个音符有了误解(导致节奏型只做了5种,还有两种没做,以为和5种中的重复了)。所以说,理解题意、明白需求很重要。

总的来说,这次的实验还是比较的,可能过程有些曲折,可能结果有点小瑕疵,但毕竟是投入进去做了的,自己也有了许多的收获,这无论对于将来的学习还是工作,帮助都是极大的。

29

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- howto234.com 版权所有 湘ICP备2022005869号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务