《EDA技术与应用》实训报告

时间:2024.4.13

  

《EDA技术与应用》实训报告

        

                    姓  名           

指导教师:

              2010 年 11 月 16

实训题目:交通灯控制电路的设计

1.系统设计

1.1 设计要求

1.1.1 设计任务

用EDA实训仪实现交通灯控制电路设计,用LED显示东西、南北方向红灯、绿灯和黄灯情况,并在数码管上显示倒计时时间,整个控制电路符合实际交通道路控制要求。

1.1.2 技术要求

① 用EDA实训仪上的2只八段数码管分别显示道路东西和南北通行和禁止的倒计时时间。

② 能设置道路东西和南北两侧通行和禁止的倒计时时间,最大设置时间为99秒,最小设置时间为1秒。

③ 交通灯用红、绿、黄三种发光二极管(LED)显示控制的结果。

④ 红、绿、黄灯显示的次序应符合实际交通道路控制的要求。

1.2 方案论证

1.2.1 总体思路

总体设计思路框图:

 

根据交通灯控制要实现的功能,使用设计一个清零键实现清零恢复到初始状态,设计一个使能键实现对交通灯的运行和停止。一个方向的3种等灯按如下顺序点亮,并往复循环:绿灯——黄灯——红灯。为了实现黄灯亮时可以闪烁,专门设计控制黄灯的程序。

每种灯亮的时间采用一个减法计数器进行计数,计数器用与执法设计,这样只需改变预置数据就能改变计数器的模。倒计时用2个数码管分别交替显示数据。

1.2.2 设计方案

2.各个模块程序的设计

① 分频器的设计

该模块将的脉冲信号进行分频,产生1的方波,作为系统的时钟计时脉冲信号。

 

② 控制电路

该模块主要是整个电路控制系统,通过使能端接受信号开始工作,初始化后接受来自数码管输出的反馈进行下一次灯亮,并控制数码管显示倒计时以及对交通灯初始化的控制。

 

③ 黄灯闪烁控制电路

       为了使黄灯实现闪烁功能特将黄灯单独设置一个模块,将情况分为3种,实现东西、南北方向黄灯闪烁和全灭。

 

④ 倒计时电路

        根据控制信号,驱动交通信号以及倒计时数码管的显示以及使能控制。

 

3.制作与调试过程

   打开Quartus Ⅱ软件,对程序编译成功后下载到EDA试验箱。进入初始化状态,数码管开始30s倒计时,LED开始亮,并开始自动进行准换。当K8拨到上方时,交通灯停止;当S15按下时,交通灯自动恢复到初始化状态。

4.结论

   基本实现要求,初始化倒计时30s,南北方向为红灯,东西方向为绿灯;30s倒计时结束时,东西方向开始黄灯闪烁3秒,同时南北方向还为红灯,3秒结束后东西方向变为红灯,南北方向变为绿灯,黄灯熄灭。K8拨到上方时,交通灯停止;S15按下时,交通灯自动恢复到初始化状态。

5.实训心得体会

   通过本次实训,我对EDA技术和应用有一个大概的了解了。在拿到题目后,我首先进行了单元模块的设计,分频器模块,时间模块,红灯绿灯模块,黄灯模块,再将每一个单元模块设计完成后进行编译,再反复的修改之后终于编译成功,在设计的过程中还应该多联系下实际情况,要了解实际情况下交通信号灯的工作情况,这样才能更好的完成这次交通灯设计。但是我没有完成这次实训的全部内容,还有些扩展功能没有实现,例如用4只数码管分别显示东西、南北方向的倒计时,我只显示了东西方向的倒计时。特殊情况下的智能控制还有高峰期与平时期的自动转换等等这些扩展功能还需要我进一步的学习才能掌握。总体来说这次的实训设计使我巩固了以前学习到的知识,还是我掌握了以前没有掌握的知识,同时也锻炼了自己的编程能力。

 6.参考文献

     【1】 新编数字逻辑电路 北京邮电大学出版社 江国强   20##年12月

     【2】 EDA技术与应用  电子工业出版社      江国强   20##年4月

【3】  数字电路EDA入门---VHDL程序实例集 北京邮电大学出版社 张亦华

附录:

①交通灯的总体电路

② 程序清单

分频器模块:

module clkgen(clk,newclk);

input clk;

output newclk;

reg    newclk;

reg[24:0]  cnter;

always @(posedge clk)

       begin

              if(cnter<20000000-1) cnter=cnter+1;

                     else cnter=0;

              if(cnter==20000000-1) newclk=1;

                     else newclk=0;

              end

endmodule

时间模块:

module cnt100(en,clk,lod,d,q);

input clk,lod,en;

input[7:0] d;

output reg[7:0] q;

always @(posedge clk or negedge lod or posedge en)

    if(en) begin q[7:0]=q[7:0];end

    else

       begin

              if(~lod) q=d;

                     else

                     begin

                         if(q==0) q='h99;

                            else  begin q=q-1;end

                         if(q[3:0]=='hf) q[3:0]=9;

                     end

   end

endmodule

红灯和路灯模块:

module contr(lod,clk,clrn,qa,aq,d,flag);

input[7:0] aq;

input      clk,clrn;

output reg[7:0] qa;

output reg[7:0] d;

output reg  lod;

output reg[1:0]  flag;

reg[1:0]  qc;

initial begin qa='h30;d='b01100110; flag=0;end

always @(posedge clk or negedge clrn)

begin

    if(~clrn) lod=0;

    else

       begin

              if(aq==0) lod=0;

              else lod=1;

       end

end

always @(negedge lod or negedge clrn)

begin

    if(~clrn)

              begin

                     qa='h30;d='b01100110;qc=0;flag=2;

              end

    else

       begin

              qc=qc+1;

              case (qc)

              0:begin qa='h30;d='b01100110;flag=2;end

              1:begin qa='h03;d='b00100010;flag=0;end

              2:begin qa='h30;d='b10011001;flag=2;end

              3:begin qa='h03;d='b10001000;flag=1;end

              default:begin qa='h30;d='b01100110;qc=0;end

              endcase

       end

end

endmodule 

黄灯模块:

module contr_h(flag,clk,clrn,aq,d_h);

input[7:0] aq;

input      clk,clrn;

input [1:0] flag;

output reg[3:0] d_h;

reg[1:0]  qc;

reg aa,bb;

always @(posedge clk or negedge clrn)

begin

    if(~clrn)

              d_h='b0000;

       else

       begin

              if(flag==0)

                     begin

                         if(aq=='h03) d_h='b1010;

                            if(aq=='h02) d_h='b0000;

                            if(aq=='h01) d_h='b1010;

                            if(aq=='h00) d_h='b0000;

                     end

              if(flag==1)

                     begin

                         if(aq=='h03) d_h='b0101;

                            if(aq=='h02) d_h='b0000;

                            if(aq=='h01) d_h='b0101;

                            if(aq=='h00) d_h='b0000;

                     end

       end

end 

endmodule 


第二篇:EDA技术及应用 实验报告


《EDA技术及应用》

实验报告

系 部: 电子通信工程系 指导教师:

实验一 点亮LED设计

一、实验目的

通过此实验让用户逐步了解、熟悉和掌握FPGA开发软件QuartusⅡ的使用方法及Verilog HDL的编程方法。

本实验力求以详细的步骤和讲解让读者以最快的方式了解EDA技术开发以及软件的使用,从而快速入门并激起读者对EDA技术的兴趣。

二、实验内容

试验箱上有8个发光二极管LED1-LED8。在QuickSOPC核心板上LED1-LED8分别与FPGA芯片的50、53-55、176和47-49引脚相连。

本实验的内容是建立可用于控制LED亮|灭的简单硬件电路,要求点亮SmartSOPC实验箱上的4个发光二级管(LED1、LED3、LED5和LED7)。

三、实验原理

FPGA器件同单片机一样,为用户提供了许多灵活独立的输入/输出I/O口(单元)。FPGA每个I/O口可以配置为输入、输出、双向I/O、集电极开路和三态门等各种组态。作为输出口时,FPGA的I/O口可以吸收最大为24mA的电流,可以直接驱动发光二级管LED等器件。所以只要正确分配并锁定引脚后,在相应的引脚上输出低电平“0”,就可实现点亮该发光二极管的功能

四、实验步骤

1)启动QuartusⅡ建立一个空白工程,然后命名为led.qpf。

2)新建Verilog HDL源程序文件led.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误 ,则找出并改正错误,直至编译成功为止。

3)从设计文件创建模块,由led.v生成名为led.bsf的模块符号文件。

4)将led符号(led.bsf)加入到BDF文件中,添加引脚和其他基本单元(引脚包括输入、输出和双向),并对引脚命名,将与led符号led【7..0】连接的管教命名为led【7..0】。

5)选择【Assignments】>>【Device...】中的EPIC6Q240C8的目标器件型号,并对相应的引脚进行锁定。

6)将led.bdf设置为顶层实体,对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并改正错误,直至编译成功为止

7)最后拿出跳线短接帽跳接到SmartSOPC试验箱上JP6的LED1-LED8。使LED1-LED8分别与FPGA引脚50、53-55、176和47-49相连。拿出Altera ByteBlasterⅡ下载电缆,并将此电缆的两端分别接到PC机的打印机并口和QuickSOPC核心板上的JTAG下载口上,打开

电源,执行下载命令,把程序下载到FPGA器件中,此时,即可在SmartSOPC试验箱上观察发光二极管,看是否与设计相符。

五、实验程序

module led(led);

output[7:0]

//模块名led //定义输出端口 //输出0xAA led; assign led = 8'b10101010;

endmodule

六、思考题

(1)写出使用QuartusII软件开发工程的完整的流程。

实验二流水灯实验

一、实验目的

通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及Verilog HDL的编程方法。学习简单时序电路的设计和硬件测试。

二、实验内容

本实验的内容是建立可用于控制LED流水灯的简单硬件电路,要求在SmartSOPC实验箱上实现LED1-LED8发光二极管流水灯显示。

三、实验原理

(1)在LED1-LED8引脚上周期性的输出流水数据,如原来输出的数据是11111100则表示点亮LED1、LED2,流水一次后,输出的数据应该是11111000,而此时则应点亮LED1-LED3三个发光二极管。就可以实现LED流水灯。为了方便观察,流水速度最好是2Hz左右。在QuickSOPC核心板上有一48Hz的标准时钟源,该时钟脉冲CLOCK与芯片的28脚相连。为了产生2Hz的时钟脉冲,在此调用了一个分频模块,通过修改频系数来改变输出频,当分频系数为24*10的6次方时,输出极为2Hz的频率信号。

(2)int_div分频模块说明:int_div弄快是一个占空比为50%的任意整数分频器。输入时钟为clock,输出时钟为clk_out。其中F_DIV为分频系数,分频系数范围1-2的n次方,若要改变分频系数,改变参数F_DIV和F_DIV_WIDTH到相应范围即可。

四、实验步骤

1)启动QuartusⅡ建立一个空白工程,然后命名为led_water.qpf。

2)新建Verilog HDL源程序文件ledwater.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误 ,则找出并改正错误,直至编译成功为止。

3)从设计文件创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。

4)将电脑中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。

5)新建图形设计文件命名为led_water.bdf并保存。将led符号(led.bsf)加入到BDF文件中,添加引脚和其他基本单元(引脚包括输入、输出和双向),并对引脚命名,将与led符号led【7..0】连接的管教命名为led【7..0】,与int_div模块clock连接的管脚命名为clock。int_div模块的clk_out与ledwater模块的clk相连接。修改参数,将F_DIV的值改为24000000,F_DIV_WIDTH的值改为25,保存参数。

6)选择【Assignments】>>【Device...】中的EPIC6Q240C8的目标器件型号,并对相应的引脚进行锁定。

7)将led.bdf设置为顶层实体,对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并改正错误,直至编译成功为止

8)最后拿出跳线短接帽跳接到SmartSOPC试验箱上JP6的LED0-LED7。使LED0-LED7分别与FPGA引脚50、53-55、176和47-49相连。拿出Altera ByteBlasterⅡ下载电缆,并将此电缆的两端分别接到PC机的打印机并口和QuickSOPC核心板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中,此时,即可在SmartSOPC试验箱上观察流水灯。

9)更改分频模块的分频系数,并重新编译下载,观察流水灯的变化。

五、实验程序

module ledwater(led,clk);

output[7:0]led;

input

reg[8:0] clk; //模块名ledwater //定义LED输出口 //定义时钟输入口 //定义输出寄存器

//寄存器输出

//过程 led_r; assign led = led_r[7:0]; always @(posedge clk)

begin

led_r <= led_r << 1; if(led_r == 9'd0) //是,则输出左移一位 //循环完毕吗? //是,则重新赋初值 led_r <= 9'b111111111;

end

endmodule

六、思考题

1.本实验顶层采用了图形输入的方式,若采用文本输入方式,如何编写顶层文件?写出相应程序。

实验三 键盘、LED发光实验

一、实验目的

通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及Verilog HDL的编程方法,熟悉以Verilog HDL文件为顶层模块的设计。学习和体会分支条件语句case的使用方法及FPGAI/O口的输出控制。

二、实验内容

SmartSOPC试验箱上有8个按键KEY1-KEY8和8个发光二极管LED1-LED8.在SmartSOPC试验箱上有8个按键KEY1-KEY8通过跳线JP6的KEY1-KEY8分别与芯片上的121-124、143、141、158和156引脚相连。

本实验的内容是要求在SmartSOPC试验箱上完成对8个按键KEY1-KEY8进行控制,一旦有输入判断其键值,并点亮相应个发光二极管。

三、实验原理

FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的,一旦I/O口被设置为输入口使用时,该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚即可用作专用输入引脚。只要正确分配并锁定引脚后,一旦在KEY1-KEY8中有键输入,在检测到键盘输入的情况下,继续判断其键盘值并作出相应的处理。

四、实验步骤

1)启动QuartusⅡ建立一个空白工程,然后命名为keyled.qpf。

2)新建Verilog HDL源程序文件keyled.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误 ,则找出并改正错误,直至编译成功为止。

3)选择目标器件并对相应的引脚进行锁定,在这里所选择的器件是EPIC6Q240C8。

4)对该工程文件进行全程编译处理,若在编译过程中发现错误 ,则找出并改正错误,直至编译成功为止。

5)最后拿出跳线短接帽跳接到JP6的LED0-LED7、KEY1-KEY8使LED1-LED8、KEY1-KEY8和芯片对应的引脚相连。拿出Altera ByteBlasterⅡ下载电缆,并将此电缆的两端分别接到PC机的打印机并口和QuickSOPC核心板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中。观察发光管LED1-LED8的亮灭状态,按下KEY1-KEY8的任一键,再次观察发光管的状态。

五、实验程序

module keyled(key,led);

input[7:0] key;

output[7:0]led;

reg[7:0]

reg[7:0] //模块名keyled //定义键盘输入口 //定义发光管输出口 //定义寄存器 led_r; buffer_r;

assign led = led_r;

always@(key)

begin

//输出键值 //过程1 buffer_r = key; //读取键值

case(buffer_r) 8'b11111110:led_r = 8'b11111110; //是键KEY1,则给寄存器赋值0xfe

8'b11111101:led_r = 8'b11111100; //是键KEY2,则给寄存器赋值0xfc

8'b11111011:led_r = 8'b11111000; //是键KEY3,则给寄存器赋值0xf8

8'b11110111:led_r = 8'b11110000; //是键KEY4,则给寄存器赋值0xf0

8'b11101111:led_r = 8'b11100000; //是键KEY5,则给寄存器赋值0xe0

8'b11011111:led_r = 8'b11000000; //是键KEY6,则给寄存器赋值0xc0

8'b10111111:led_r = 8'b10000000; //是键KEY7,则给寄存器赋值0x80

8'b01111111:led_r = 8'b00000000; //是键KEY8,则给寄存器赋值0x00

default: led_r = 8'b11111111; //否则给寄存器赋值0xff endcase

end

endmodule

六、思考题

1.能否用if语句改写本实验程序?如果能,写出相应程序。

实验四 静态数码管显示实验

一、实验目的

学习7段数码管显示译码器的设计,进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及Verilog HDL的编程方法,学习LPM兆功能模块的调用。

二、实验内容

SmartSOPC试验箱上有2个4位动态共阳极数码管LED12和LED13。其中8个位码DIG0-DIG7和8位段码SEG0-SEG7分别与FPGA相应的引脚相连。这样,只要DIG0-DIG7上一直输出低电平“0”,则8个数码管将显示相同的数码,这样8位动态的LED数码管就变成了静态的LED。

本实验的内容是建立7段译码显示模块,用于控制LED数码管的静态显示。要求SmartSOPC试验箱上的数码管依次显示0-9和A-F16个字符。

三、实验原理

数码管LED显示是工程项目中使用较广的一种输出显示器件。常见的数码管有共阴和共阳2种。共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将8个发光二极管的阳极连接在一起作为公共端。公共端常被作位码,而将其他的8位称作段码。如图所示为共阳数码管及电路,数码管有8个段分别为:h、g、f、e、d、c、b和a(h为小数点),只要公共端为高电平”1”,某个段输出低电平“0”则相应的段就亮。例如数码管的8个段h、g、f、e、d、c、b、a分别接1、0、1、0、0、1、0、0,数码管就显示“2”。本实验通过分频模块int_div分频得到1Hz的频率信号,加载于4位计数器的时钟输入端,计数循环输出0~9、A~F 16个数。最后通过七段译码器模块译码后在数码管上显示出来。

四、实验步骤

1)启动Quartus Ⅱ建立一个空白工程,然后命名为sled.qpf。

2)新建Verilog HDL源程序文件decl7s.v,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

3)从设计文件创建模块,由decl7s.v生成名为decl7s.bsf的模块符号文件。

4)将光盘中EDA_Component 目录下的int_div.bsf和int_div.v拷贝到工程目录。

5)添加4位计数器兆功能模块。

(1)从【Tools】》【MegaWizard Plug-In Manager?】打开如图所示添加兆功能模块向导。选择【Creat a new custom megafunction variation】新建一个新的兆功能模块。

(2)在图中按next进入向导第2页。安图所示选择和设置,注意标记。

6)新建图形设计文件命名为

五、实验程序 module decl7s(d,seg); input[3:0] d; output[7:0]seg; reg[7:0] seg_r;

assign seg = seg_r;

always @(d) begin case(d) 4'h0:seg_r = 8'hc0; 4'h1:seg_r = 8'hf9; 4'h2:seg_r = 8'ha4; 4'h3:seg_r = 8'hb0; 4'h4:seg_r = 8'h99; 4'h5:seg_r = 8'h92; 4'h6:seg_r = 8'h82; 4'h7:seg_r = 8'hf8;

4'h8:seg_r = 8'h80;

//模块名decl7s //输入4位二进制码 //七段译码输出 //定义数码管输出寄存器

//输出数码管译码结果//七段译码

//显示0

//显示1 //显示2 //显示3 //显示4 //显示5

//显示6

//显示7

//显示8

4'h9:seg_r = 8'h90; //显示9

4'ha:seg_r = 8'h88; //显示a

4'hb:seg_r = 8'h83; //显示b

4'hc:seg_r = 8'hc6; //显示c

4'hd:seg_r = 8'ha1; //显示d

4'he:seg_r = 8'h86; //显示e

4'hf:seg_r = 8'h8e; //显示f

endcase

end

endmodule

六、思考题

1.本实验采用的是共阳极数码管,若采用共阴极数码管,有什么不同?

2.如何显示HHHHHHHH和PPPPPPPP?

实验五 动态数码管显示实验

一、实验目的

二、实验内容

三、实验原理

四、实验步骤

五、实验程序

module scan_led(clk_1k,d,dig,seg); input clk_1k; input[31:0] d; output[7:0]dig;

output[7:0] seg;

reg[7:0] seg_r; reg[7:0] dig_r;

reg[3:0] disp_dat; reg[2:0]count;

assign dig = dig_r; assign seg = seg_r;

always @(posedge clk_1k)

//模块名scan_led

//输入时钟 //输入要显示的数据 //数码管选择输出引脚 //数码管段输出引脚

//定义数码管输出寄存器 //定义数码管选择输出寄存器//定义显示数据寄存器 //定义计数寄存器

//输出数码管选择

//输出数码管译码结果

//定义上升沿触发进程

begin count <= count + 1'b1; end

always @(posedge clk_1k) begin case(count) 3'd0:disp_dat = d[31:28]; 3'd1:disp_dat = d[27:24]; 3'd2:disp_dat = d[23:20]; 3'd3:disp_dat = d[19:16]; 3'd4:disp_dat = d[15:12]; 3'd5:disp_dat = d[11:8]; 3'd6:disp_dat = d[7:4];

3'd7:disp_dat = d[3:0];

endcase case(count) 3'd0:dig_r = 8'b01111111; 3'd1:dig_r = 8'b10111111; 3'd2:dig_r = 8'b11011111; 3'd3:dig_r = 8'b11101111; 3'd4:dig_r = 8'b11110111; 3'd5:dig_r = 8'b11111011; 3'd6:dig_r = 8'b11111101;

3'd7:dig_r = 8'b11111110;

endcase

//选择扫描显示数据 //第一个数码管 //第二个数码管 //第三个数码管 //第四个数码管 //第五个数码管 //第六个数码管 //第七个数码管

//第八个数码管

//选择数码管显示位

//选择第一个数码管显示//选择第二个数码管显示//选择第三个数码管显示//选择第四个数码管显示//选择第五个数码管显示//选择第六个数码管显示//选择第七个数码管显示//选择第八个数码管显示

end

always @(disp_dat) begin case(disp_dat) 4'h0:seg_r = 8'hc0; 4'h1:seg_r = 8'hf9; 4'h2:seg_r = 8'ha4; 4'h3:seg_r = 8'hb0; 4'h4:seg_r = 8'h99; 4'h5:seg_r = 8'h92; 4'h6:seg_r = 8'h82; 4'h7:seg_r = 8'hf8; 4'h8:seg_r = 8'h80; 4'h9:seg_r = 8'h90; 4'ha:seg_r = 8'h88; 4'hb:seg_r = 8'h83; 4'hc:seg_r = 8'hc6; 4'hd:seg_r = 8'ha1; 4'he:seg_r = 8'h86;

4'hf:seg_r = 8'h8e;

endcase

end endmodule 六、思考题

1.说出数码管动态显示的原理。

//七段译码

//显示0

//显示1 //显示2 //显示3 //显示4 //显示5

//显示6

//显示7 //显示8 //显示9 //显示a //显示b //显示c //显示d

//显示e

//显示f

实验六

一、实验目的

二、实验内容

三、实验原理

四、实验步骤

五、实验程序

module decl7s(d,seg); input[3:0] d; output[7:0]seg; reg[7:0] seg_r;

assign seg = seg_r;

always @(d)

按键去抖动实验 //模块名decl7s //输入4位二进制码 //七段译码输出 //定义数码管输出寄存器 //输出数码管译码结果

begin

case(d)

4'h0:seg_r = 8'hc0;

4'h1:seg_r = 8'hf9;

4'h2:seg_r = 8'ha4;

4'h3:seg_r = 8'hb0;

4'h4:seg_r = 8'h99;

4'h5:seg_r = 8'h92;

4'h6:seg_r = 8'h82;

4'h7:seg_r = 8'hf8;

4'h8:seg_r = 8'h80;

4'h9:seg_r = 8'h90;

4'ha:seg_r = 8'h88;

4'hb:seg_r = 8'h83;

4'hc:seg_r = 8'hc6;

4'hd:seg_r = 8'ha1;

4'he:seg_r = 8'h86;

4'hf:seg_r = 8'h8e;

endcase

end

endmodule

六、思考题

1.比较下面两段程序的异同,并画出电路结构图always@ ( posedge clk)

//七段译码 //显示0 //显示1 //显示2 //显示3 //显示4 //显示5 //显示6 //显示7 //显示8 //显示9 //显示a //显示b //显示c //显示d //显示e //显示f .

begin

dout1<=key_in; //非阻塞赋值 dout2<=dout1;

dout3<=dout2;

end

always@ ( posedge clk)

begin

dout1<=key_in; //阻塞赋值 dout2<=dout1;

dout3<=dout2;

end

实验七 硬件电子琴实验

一、实验目的

学习利用蜂鸣和按键设计电子琴。

二、实验内容

在SmartSOPC实验箱上的实现实现一个简易电子琴。按下KEY1~KEY7分别表示中音的;按住KEY8再按KEY1~KEY7分别表示高音的DO、RE、MI、FA、SOL、LA、SI。

三、实验原理

硬件电路和3.12相同。乐曲演奏的原理是:由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系如图3.15所示。所有不同频率的信号都是从统一基准频率分频而得来的,由于音阶频率多为非整数,而分频系数又不能位小数,故必须将计算得到的分频数进行四舍五入取整,基准频率和分频系数应综合考虑加以选择,从而保证音乐不会走调。如在48MHz时钟下,中音1(对应点频率值为523.3Hz)的分频系数应为:48000000/(2*523.3)=0xb327,这样只对系统时钟进行45863次分频即可得所要的中音1.至于其他音符,同样可由一式求出对应的分频分数,这样利用程序可以很轻松地得到相应的乐声。

四、实验步骤

1)在QuartusⅡ中建立一个工程项目文件beep1.qpf,并在该项目下新建

五、实验程序

module beep1(clk,key,beep,led); input clk;

//模块名称beep

//系统时钟48MHz //按键输入 //蜂鸣器输出端 //LED输出

input[7:0]key; output beep; output[7:0]led;

reg beep_r;

//寄存器

reg[15:0]count,count_end; reg[7:0]key_r;

always@(posedge clk) begin

always @(key) begin

count <= count + 1'b1; begin

count <= 16'h0; beep_r <= !beep_r;

//计数器加1

if((count == count_end)&(!(count_end == 16'hffff)))

//计数器清零 //取反输出信号

end

end

key_r = key; case(key_r)

//取键值

8'b11111110:count_end = 16'hb327; 8'b11111101:count_end = 16'h9fa0; 8'b11111011:count_end = 16'h8e32; 8'b11110111:count_end = 16'h8637; 8'b11101111:count_end = 16'h7794; 8'b11011111:count_end = 16'h6a88; 8'b10111111:count_end = 16'h5ee8; 8'b01111110:count_end = 16'h59ab; 8'b01111101:count_end = 16'h4fce; 8'b01111011:count_end = 16'h471a; 8'b01110111:count_end = 16'h431c; 8'b01101111:count_end = 16'h3bca; 8'b01011111:count_end = 16'h3544; 8'b00111111:count_end = 16'h2f74; default:count_end = 16'hffff;

//中音1的分频系数值 //中音2的分频系数值 //中音3的分频系数值 //中音4的分频系数值 //中音5的分频系数值 //中音6的分频系数值 //中音7的分频系数值 //高音1的分频系数值 //高音2的分频系数值 //高音3的分频系数值 //高音4的分频系数值 //高音5的分频系数值 //高音6的分频系数值 //高音7的分频系数值

endcase

end

assign beep =beep_r; assign led =key_r; endmodule 六、思考题

1. 举例说明产生不同音符的原理。

//输出音乐 //输出按键状态

实验八 数字时钟设计

一、实验目的

学习数字时钟的硬件设计

二、实验内容

在SmartSOPC 实验箱上完成一个可以设计的数字时钟,其显示时间范围是00:00:00~23:59:59,且该时钟具有暂时停计时和清零等功能。

三、实验原理

一个完整的时钟应由3部分组成:秒脉冲发生电路、计数显示部分和时钟调整部分。一个时钟的标准与否主要取决秒脉冲的精度。为了保证计时准确我们对系统时钟48MHz进行了48000000分频,从而得到1Hz的秒脉冲。至于显示部分与LED数码原理相同,而校时电路用户

可以自由发挥,如定义3个键keystart、keymon和keyadd,分别用于控制时钟的计时开始、调整功能选择和加1处理,从而完成对现在时间的调整。本实验的较时电路在此仅完成了暂时、清零等功能。

四、实验步骤

1)在QuartusⅡ中建立一个工程项目文件clock.qpf,并在该项目下新建Verilog HDL源程序文件clock.v输入程序代码并保存。完整的Verilog HDL程序参考程序清单3.15.

2)选择目标器件并对相应的引脚进行锁定,在这里选择的器件为Altera公司Cyclone系列的EPIC6Q240C8芯片。

3)对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至鬓已成功为止。

4)硬件连接、下载程序

(1)如果核心板是QuickSOPC-1C12须执行此步骤,如果不是则跳过此步。拿出试验箱配置的连线将核心板上PACK区的引脚236、237、238和239分别与数码管显示区的COM3(DIG-COM)的DIG~DIG7相对连接。

(2)拿出跳线短接帽跳接到JP6的KEY0、KEY1。拿出Altera ByteBlasterⅡ下载电缆,并将此电缆的两端分别接到PC机的打印机并口和QuickSOPC核心板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中。观察数码管的显示状态。按下按键KEY1、KEY2观察数字时钟上的时间有什么变化。

五、实验程序

module clock(clk,key,dig,seg);

input clk;

//模块名clock //输入时钟 //输入按键 input[1:0] key;

output[7:0]dig; output[7:0] seg;

reg[7:0] seg_r; reg[7:0] dig_r;

reg[3:0] disp_dat; reg[24:0]count; reg[23:0]hour; reg sec,keyen;

reg[1:0]dout1,dout2,dout3; wire[1:0]key_done;

assign dig = dig_r; assign seg = seg_r;

//秒信号产生部分

always @(posedge clk) begin count = count + 1'b1;

if(count == 25'd24000000) begin count = 25'd0;

sec = ~sec;

end

end

//数码管选择输出引脚 //数码管段输出引脚

//定义数码管输出寄存器 //定义数码管选择输出寄存器 //定义显示数据寄存器

//定义计数寄存器

//定义现在时刻寄存器 //定义标志位 //寄存器

//按键消抖输出

//输出数码管选择

//输出数码管译码结果

//定义clock上升沿触发

//0.5S到了吗?

//计数器清零 //置位秒标志

//按键消抖处理部分

assign key_done = (dout1 | dout2 | dout3); //按键消抖输出

always @(posedge count[17]) begin dout1 <= key; dout2 <= dout1; dout3 <= dout2;

end

always @(negedge key_done[0]) begin keyen = ~keyen; 关 end

//数码管动态扫描显示部分 always @(posedge clk) 变一次 begin case(count[17:15]) 3'd0:disp_dat = hour[3:0]; 3'd1:disp_dat = hour[7:4]; 3'd2:disp_dat = 4'ha;

3'd3:disp_dat = hour[11:8]; 3'd4:disp_dat = hour[15:12];

3'd5:disp_dat = 4'ha;

//将琴键开关转换为乒乓开

//count[17:15]大约1ms改

//选择扫描显示数据

//秒个位 //秒十位 //显示"-"

//分个位

//分十位 //显示"-"

3'd6:disp_dat = hour[19:16]; 3'd7:disp_dat = hour[23:20]; endcase

case(count[17:15]) 3'd0:dig_r = 8'b11111110; 3'd1:dig_r = 8'b11111101; 3'd2:dig_r = 8'b11111011; 3'd3:dig_r = 8'b11110111; 3'd4:dig_r = 8'b11101111; 3'd5:dig_r = 8'b11011111; 3'd6:dig_r = 8'b10111111; 3'd7:dig_r = 8'b01111111; endcase

end

always @(posedge clk)

begin

case(disp_dat)

4'h0:seg_r = 8'hc0; 4'h1:seg_r = 8'hf9; 4'h2:seg_r = 8'ha4; 4'h3:seg_r = 8'hb0; 4'h4:seg_r = 8'h99; 4'h5:seg_r = 8'h92; 4'h6:seg_r = 8'h82; 4'h7:seg_r = 8'hf8; //时个位 //时十位 //选择数码管显示位 //选择第一个数码管显示 //选择第二个数码管显示 //选择第三个数码管显示 //选择第四个数码管显示 //选择第五个数码管显示 //选择第六个数码管显示 //选择第七个数码管显示 //选择第八个数码管显示 //显示0 //显示1 //显示2 //显示3 //显示4 //显示5 //显示6 //显示7

4'h8:seg_r = 8'h80; 4'h9:seg_r = 8'h90; 4'ha:seg_r = 8'hbf; //显示8 //显示9 //显示- //不显示 default:seg_r = 8'hff; endcase if((count[17:15]== 3'd2)&sec) seg_r = 8'hff; end

//计时处理部分

always @(negedge sec or negedge key_done[1])//计时处理 begin

if(!key_done[1]) begin hour = 24'h0; //是清零键吗? //是,则清零 end else if(!keyen) begin hour[3:0] = hour[3:0] + 1'b1; if(hour[3:0] == 4'ha) begin hour[3:0] = 4'h0; hour[7:4] = hour[7:4] + 1'b1; //秒的十位加一 if(hour[7:4] == 4'h6) begin hour[7:4] = 4'h0; hour[11:8] = hour[11:8] + 1'b1;//分个位加一 //秒加1

if(hour[11:8] == 4'ha) begin hour[11:8] = 4'h0; hour[15:12] = hour[15:12] + 1'b1;//分十位加一 if(hour[15:12] == 4'h6) begin hour[15:12] = 4'h0; hour[19:16] = hour[19:16] + 1'b1;//时个位加一 if(hour[19:16] == 4'ha) begin hour[19:16] = 4'h0; hour[23:20] = hour[23:20] + 1'b1;//时十位加 end if(hour[23:16] == 8'h24) hour[23:16] = 8'h0; end end end end end

end

endmodule

六、思考题

1. 自己动手添加校时程序,写出相应程序。

更多相关推荐:
多媒体技术与应用课程设计报告

目录1作品简介12设计工具及平台13构思及创意14素材来源241图片来源242音频来源243视频来源25设计方法技巧及简要步骤251图片处理252音频处理353视频处理36设计结果4总结5致谢5参考文献51我的...

多媒体技术应用实验报告3

陕西理工学院实验报告20xx20xx学年第2学期院系教科学院专业班级教技1201学号120xx14005学生姓名曾志腾实验地点实验室计算机课件制作室实验日期20xx年5月6日成绩

多媒体技术应用实验报告2

陕西理工学院实验报告20xx20xx学年第2学期实验地点实验室计算机课件制作室实验日期20xx年4月29日成绩院系教科学院专业班级教技1201学号120xx14005学生姓名曾志腾

多媒体技术与应用学生实验报告POWERPOINT20xx部分

西安邮电大学数字艺术学院本科学生实验报告姓名xxx学院xxxx专业xxxx班级xxxxx实验课程名称ppt的制作试验时间年月日指导教师及职称实验成绩开课时间2020学年第学期3插入多张空白幻灯片并添加不同的文本...

多媒体技术PS3-实验报告

实验四Photoshop的高级操作1学号20xx13522姓名徐青青专业信息管理与信息系统成绩实验目的掌握图像的路径操作及应用路径描边路径选取掌握图像的文字操作及应用文字编辑变形文字能独立运用路径和文字工具完成...

多媒体技术PS4-实验报告

实验五Photoshop的高级操作2学号20xx13522姓名徐青青专业信息管理与信息系统成绩实验目的掌握图像的蒙版应用图层蒙版矢量蒙版剪切蒙版快速蒙版掌握通道的应用通道抠图独立运用蒙版和通道完成一个复杂的图像...

多媒体技术实验报告

多媒体实验报告姓名学号专业班级授课老师实验1图像采集与编辑实验一实验目的1了解数码相机基本使用2熟悉PHOTOSHOP在图像处理上的用途3掌握PHOTOSHOP一些基本的图像操作二实验内容1用数码相机拍摄照片2...

多媒体技术基础实验报告

多媒体实验报告实验一数字音频实验一实验时间20xx年3月29日一实验目的1了解不同数字音频指标对所生成声音文件音质的影响2掌握音频播放器的基本使用方法3对声音文件进行简单的编辑和特殊效果处理4了解不同编码算法对...

多媒体技术实验报告

云计算刘钊计算机科学与技术1008060072摘要文章以云计算为主简单而精要地向大家介绍了云计算技术的概念发展演变基本特征部署模型和服务架构以及中国的云计算发展状况及其相关的产业链关键词云计算中国云计算一概述1...

多媒体计算机技术实验报告

南昌大学实践报告学生姓名谢某某学号0149001506109专业班级软件工程20xx实践类型验证综合设计创新实践日期20xx1130实践成绩以下主要内容由学生完成一实验项目名称多媒体音频信息的采集与处理二实验目...

多媒体技术关于声音编辑的实验报告

深圳大学实验报告班级实验时间实验报告提交时间教务处制一实验目的1掌握利用AdobeAudition进行录音2掌握利用AdobeAudition对所录制的音乐进行降噪等各种处理使声音听起来很丰满同时加入背景音乐进...

《多媒体技术》实验报告模板

实验报告课程名称多媒体技术与应用实验项目名称视频处理大作业班级与班级代码实验室名称或课室专业任课教师学号姓名实验日期20xx1222广东商学院教务处制一实验目的1练习和熟悉PhotoshopPremierepr...

多媒体技术与应用实验报告(23篇)