第一篇:FPGA实验报告
FPGA实验报告
专业:XXX 姓名:XXX 学号:XX
一:实验目的
1.熟悉Modelsim和Quartus II软件的运行环境和使用
2.熟练使用Quartus II仿真软件生成网表。
3.熟悉FPGA前仿真和后仿真的整个流程。二:实验内容
编写counter计数器,在Quartus II仿真软件中生成网表,再在Modelsim中进行后仿真。三: 实验步骤
1.在Modelsim编写源程序(counter计数器及激励),编译源文件,确保程序的正确性,并进行前仿真,生成波形图如下:
附:源程序如下:
module counter(q,clk,reset);
input clk,reset;
output [3:0] q;
reg [3:0] q;
always @(posedge reset or negedge clk)
if(reset)
q <= 4'b0;
else
q <= q + 1;endmodule module top;
reg CLK,RESET;
wire [3:0] Q;
counter c1(Q,CLK,RESET);
initial
CLK=1'b0;
always
#1 CLK=~CLK;
initial
$monitor($time,“Q=%d”,Q);
initial
begin
RESET=1'b1;
#5 RESET=1'b0;
#180 RESET=1'b1;
end endmodule 2.新建文件夹,将源程序counter.v放进去。然后启动Quartus II仿真软件,生成网表。
1).在【File】下拉菜单中选中New Project Wizard选项,出现对话框。并指定工程工作目录、工程名称和顶层模块名,如图(a)所示。
2).添加(Add)counter.v文件。如图(b)所示。
3).选择器件系列
4).指定其它EDA工具,如图(d)所示。
5).完成工程设置,如图(e)所示。
6).单击启动编译按钮,完成工程的编译。
7).选中【processing】-【Start】-【Start analysis & synthesis】进行综合和分析。
(a)
(b)
(c)
(d)
(e)
8).选中【Tools】-【Netlist viewer】-【RTL viewer】生成网表如下图所示:
3.新建文件夹,将生成的vo,sdo文件,altera时延文件cyclone-atoms.v及编写的top.v文件拷入,在Modelsim中进行后仿真。
1).新建工程,向工程中添加vo,top,及时延文件。
2).将vo文件时延尺寸改为ns,并在top程序的首部添加命令:`timescale 1 ns / 1 ns。
3).编译并进行仿真,生成波形图如下:
四:心得体会
通过本次实验,我基本熟悉掌握了前仿真、后仿真的整个实验步骤及流程,熟练掌握了Modelsim和Quartus仿真软件的使用方法。
第二篇:FPGA交通灯实验报告
交通灯实验报告
一,实验目的
实现两路信号灯交替亮起,并利用两组数码管分别对两路信号进行倒计时。
两路信号时间分别为:
V:绿灯(30S)
H:红灯(35S)
黄灯(5s)
绿灯(30S)
红灯(35S)
黄灯(5S)
二,实验步骤 建立工程
可在欢迎界面点击“Creat a New Project”进入工程建立界面,亦可关闭欢迎界面,点击菜单栏的“File”,点击“New Project Wizard”进入建立工程界面。右侧为建立工程界面,点击next。
在此界面选定工程路径,取好工程名,点击“Next”。注意:路径中不能有中文,工程名也不能有中文。
一直点击“Next”进入器件设置界面,DE2-70开发工具采用的Cyclone II系列的EP2C70F896C6N。点击“Finish”,完成工程建立
1、点击“File”,点击“New” 选择“Verilog HDL” 2,点击主界面工具栏中的 选择“Verilog HDL”
3、写入verilog代码。
代码如下:
module traffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);
parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;
input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;
//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always@(posedge Clk_50M or negedge Rst)begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1;
end
else
begin
if(Cnt_1Hz>=25000000)
end
//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always@(posedge Clk_1Hz)begin
end
begin
Cnt_1Hz<=1;
Clk_1Hz<=~Clk_1Hz;
end
else
Cnt_1Hz<=Cnt_1Hz + 1;
case(state)
S1:
end
always@(posedge Clk_1Hz)begin
case(stateV)
S1:
begin
if(CntV>=30)
CntV<=1;
begin
if(Cnt30>=30)
Cnt30<=1;
else
Cnt30<=Cnt30 + 1;S2:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S3:
begin
if(Cnt30>=30)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S4:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;end endcase
else
CntV<=CntV + 1;
S2: begin
end
end if(CntV>=5)
CntV<=1;
else
CntV<=CntV + 1;end
S3:
begin
if(CntV>=35)
CntV<=1;
else
CntV<=CntV + 1;end endcase always@(posedge Clk_1Hz)begin
case(stateH)
S1:
end
always@(negedge Clk_50M or negedge Rst)begin
begin
if(CntH>=35)
CntH<=1;
else
CntH<=CntH + 1;
S2:
begin
if(CntH>=30)
CntH<=1;end
else
CntH<=CntH + 1;end
S3:
begin
if(CntH>=5)
CntH<=1;
else
CntH<=CntH + 1;end endcase
case(state)
S1:
end always@(negedge Clk_50M or negedge Rst)begin
case(state)
S1:
end
//16进制计数器转换为用于显示的10进制计数器 always@(posedge Clk_50M)begin
if(CntVV>29)
begin
CntDis[7:4]<=3;
CntDis[3:0]<=CntVV20;end else if(CntVV>9)begin
CntDis[7:4]<=1;
CntDis[3:0]<=CntVV30;end else if(CntHH>19)begin
CntDiss[7:4]<=2;
CntDiss[3:0]<=CntHH10;end else
CntDiss<=CntHH;
end
if(Cnt30>=5)
end
end S3:
begin
state<=S4;
end S4:
begin
state<=S1;
end default:
begin
state<=S1;
end endcase
if(Cnt30>=30)
if(Cnt30>=5)always@(posedge Clk_1Hz)begin
case(state)
S1:
end
always@(posedge Clk_50M or negedge Rst)
begin
stateH<=S1;
stateV<=S1;
end S2:
begin
stateH<=S1;
stateV<=S2;
end S3:
begin
stateH<=S2;
stateV<=S3;
end S4:
begin
stateH<=S3;
stateV<=S3;
end endcase begin
if(!Rst)
begin
LedR_H<=0;
else
LedG_H<=0;LedY_H<=0;
LedR_V<=0;
LedG_V<=0;end LedY_V<=0;
begin
case(state)
S1:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;end
S2:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;end
S3:
begin
LedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
S4:
begin LedR_H<=0;LedG_H<=0;
end
LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
default:
begin
end LedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;end
endcase assign led15=state;
endmodule
module SEG7_LUT input [3:0] iDIG;output reg
always @(iDIG)begin
case(iDIG)4'h1: oSEG = 7'b1111001;
//---t----4'h2: oSEG = 7'b0100100;// |
| 4'h3: oSEG = 7'b0110000;// lt rt
4'h4: oSEG = 7'b0011001;// |
| 4'h5: oSEG = 7'b0010010;//---m----4'h6: oSEG = 7'b0000010;// |
| 4'h7: oSEG = 7'b1111000;// lb rb 4'h8: oSEG = 7'b0000000;// |
| 4'h9: oSEG = 7'b0011000;//---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;[6:0] oSEG;[6:0] oSEG;(oSEG,iDIG);
end
4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcase endmodule 编译工程
保存文件,将文件放在所建工程所在路径下 点击主界面工具栏中的图标
也可点击菜单栏中“Processing”,点击“Start Compilation”
分配关键如下:
Clk_50M Input PIN_AD15 LedG_H Output PIN_AD9 LedG_V Output PIN_AJ6 LedR_H Output PIN_AJ7)LedR_V Output PIN_AJ5)LedY_H Output PIN_AD8 LedY_V Output PIN_AK5 Rst Input PIN_AA23 Seg7_HH[6] Output PIN_G1 Seg7_HH[5] Output PIN_H3 Seg7_HH[4] Output PIN_H2 Seg7_HH[3] Output PIN_H1 Seg7_HH[2] Output PIN_J2 Seg7_HH[1] Output PIN_J1 Seg7_HH[0] Output PIN_K3
Seg7_HL[6] Seg7_HL[5] Seg7_HL[4] Seg7_HL[3] Seg7_HL[2] Seg7_HL[1] Seg7_HL[0] Seg7_VH[6] Seg7_VH[5] Seg7_VH[4] Seg7_VH[3] Seg7_VH[2] Seg7_VH[1] Seg7_VH[0] Seg7_VL[6] Seg7_VL[5] Seg7_VL[4] Seg7_VL[3] Seg7_VL[2] Seg7_VL[1] Seg7_VL[0] Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output PIN_E4 PIN_F4 PIN_G4 PIN_H8 PIN_H7 PIN_H4 PIN_H6 PIN_AD17 PIN_AF17 7 PIN_AE17 7 PIN_AG16 PIN_AF16 7 PIN_AE16 7 PIN_AG13 PIN_AD12 PIN_AD11 PIN_AF10 8 PIN_AD10 PIN_AH9 8 PIN_AF9 8 PIN_AE8 8
烧写代码
在管脚配置完成后,还需将工程再编译一次,成功后,点击主界面工具栏中的亦可点击主界面菜单栏中“Tools”,点击“Programmer”
进入代码烧写界面后,点击“Start”,当“Progress”为100%时,表示烧写完成,这是可观察DE2-70板现象
获得预期的效果,两组的信号红黄绿灯交替切换,计数器记为零时信号灯切换状态,红灯35s,黄灯5s,绿灯30s。三,心得体会
通过本次实验初步了解了EDA技术,熟悉了FPGA开发板的开发流程,锻炼了动手能力。
第三篇:FPGA秒表实验报告
课程设计报告
专业班级 课 程 题 目 秒表的设计 学 号 姓 名 同 组 人 成 绩
2013年5月
一、设计目的
1.进一步熟悉七段码译码器的硬件接口。2.掌握用扫描方法驱动多个数码管硬件接口。3.掌握秒表VHDL的编程方法。
二、系统总体设计(1).设计要求:
1.秒表共有6个输出显示,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应,6个计数器的输出全都为BCD码输出,这样便于和显示译码器的连接。当计时达60分钟后,蜂鸣器鸣响10声。
2.整个秒表还需有一个启动信号和一个归零信号,以便秒表能随意停止及启动。3.秒表的逻辑结构较简单,它主要由显示译码器、分频器、十进制计数器、六进制计数器和报警器组成。在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲。
(2).实验原理: 秒表由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。秒表的工作原理与数字时基本相同,唯一不同的是秒表的计时时钟信号,由于其分辨率为0.01秒,所以整个秒表的工作时钟是在100Hz的时钟信号下完成。当秒表的计时小于1个小时时,显示的格式是mm-ss-xx(mm表示分钟:0~59;ss表示秒:0~59;xx表示百分之一秒:0~99),当秒表的计时大于或等于一个小时时,显示的和多功能时钟是一样的,就是hh-mm-ss(hh表示小时:0~99),由于秒表的功能和钟表有所不同,所以秒表的hh表示的范围不是0~23,而是0~99,这也是和多功能时钟不一样的地方。在设计秒表的时候,时钟的选择为100Hz。变量的选择:因为xx(0.01秒)和hh(小时)表示的范围都是0~99,所以用两个4位二进制码(BCD码)表示;而ss(秒钟)和mm(分钟)表示的范围是0~59,所以用一个3位的二进制码和一个4位的二进制码(BCD)码表示。显示的时候要注意的问题就是小时的判断,如果小时是00,则显示格式为mm-ss-xx,如果小时不为00,则显示hh-mm-ss。
三、详细设计
1.计时模块:计时模块执行计时功能,计时方法和计算机一样是对标准时钟脉冲计数。他是由四个十进制计数器和俩个六进制计数器构成,其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。
COUNT10CLKSTARTCLRCOUTDAOUT[3..0]源程序:inst2
(1)十进制计数器(count_10)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity COUNT10 is port(CLK,START,CLR : in std_logic;
COUT : out std_logic;
DAOUT : out std_logic_vector(3 downto 0));end COUNT10;architecture one of COUNT10 is signal h0 : std_logic_vector(3 downto 0);signal h1 : std_logic;begin process(CLK,CLR)begin if CLR='1' then h0<=“0000”;elsif CLK'event and CLK='1' then
if START='1' then
if h0=“1001” then
h0<=“0000”;
h1<='1';
else h0<=h0+1;
h1<='0';
end if;
end if;
end if;end process;DAOUT<=h0;COUT<=h1;end one;
(2)六进制计数器(count_6)
COUNT6CLKSTARTCLRinst1COUTDAOUT[3..0]
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity COUNT6 is port(CLK,START,CLR : in std_logic;
COUT : out std_logic;
DAOUT: out std_logic_vector(3 downto 0));end COUNT6;architecture two of COUNT6 is signal h0 : std_logic_vector(3 downto 0);signal h1 : std_logic;begin process(CLK,CLR)begin if CLR='1' then h0<=“0000”;elsif CLK'event and CLK='1' then
if START='1' then
if h0=“0101” then
h0<=“0000”;
h1<='1';
else h0<=h0+1;
h1<='0';
end if;
end if;
end if;end process;DAOUT<=h0;COUT<=h1;end two
2.计时显示器(deled)
计时显示电路的作用是将计时值在LED数码管上显示出来。计时电路产生的值经过BCD七段译码后,驱动LED数码管。计时显示电路的实现方案采用扫描显示。部分源程序:
delednum[3..0]led[6..0]inst3
Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity deled is port(num: in std_logic_vector(3 downto 0);led:out std_logic_vector(6 downto 0));end deled;architecture a of deled is begin process(num)begin case num is when“0000”=>led<=“1111110”;when “0001”=>led<=“0110000”;when “0010”=>led<=“1101101”;when “0011”=>led<=“1111001”;when “0100”=>led<=“0110011”;when “0101”=>led<=“1011011”;when “0110”=>led<=“1011111”;when “0111”=>led<=“1110000”;when “1000”=>led<=“1111111”;when “1001”=>led<=“1111011”;when OTHERS=>led<=“0000000”;end case;end process;end a;
3.分频
fenpinclrclkqinst4
library ieee;use ieee.std_logic_1164.all;
entity fenpin is
port(clr,clk: in std_logic;q: buffer std_logic);end fenpin;architecture b of fenpin is
signal counter:integer range 0 to 49999;begin
process(clr,clk)
begin
if(clk='1' and clk'event)then
if clr='1' then
counter<=0;
elsif counter=49999 then
counter<=0;
q<= not q;
else
counter<=counter+1;
end if;
end if;
end process;end b;
4.位选
seltimeclkclrdain0[3..0]dain1[3..0]dain2[3..0]dain3[3..0]dain4[3..0]dain5[3..0]daout[3..0]sel[2..0]inst5 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity seltime is port(clk:in std_logic;
clr:in std_logic;
dain0:in std_logic_vector(3 downto 0);
dain1:in std_logic_vector(3 downto 0);
dain2:in std_logic_vector(3 downto 0);
dain3:in std_logic_vector(3 downto 0);
dain4:in std_logic_vector(3 downto 0);
dain5:in std_logic_vector(3 downto 0);
daout:buffer std_logic_vector(3 downto 0);
sel:buffer std_logic_vector(2 downto 0));end seltime;architecture three of seltime is signal m:std_logic_vector(2 downto 0);signal n:std_logic_vector(3 downto 0);begin n<=“0000” when clr='1' else
dain0 when m=“000” else dain1 when m=“001”else dain2 when m=“010”else dain3 when m=“011”else dain4 when m=“100” else dain5;process(clr,clk,dain0,dain1,dain2,dain3,dain4,dain5)begin if clk 'event and clk='1'then if m=“101” then m<=“000”;else m <=m+1;end if;end if;sel<=m;end process;daout<=n;end three;
5.警告
ALARMCLKdainqinst
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ALARM is port(CLK: in std_logic;
dain: in std_logic;
q: out std_logic);end ALARM;architecture four of ALARM is signal count: std_logic_vector(1 downto 0);begin process(clk)begin q<=count(1);if(clk'event and clk='1')then
if(dain='1')then
if(count=“10”)then
count<=“00”;
else
count<=count+1;
end if;
end if;
end if;
end process;
q<=count(1);end four;原理图:
四、仿真分析 1.仿真结果:
2.管脚分配:
五.设计中遇到的问题及解决方法
问题:
1.对秒表设计的原理理解不到位,试验不能正常进行。2.因为程序输入不正确,导致程序编译不成功。
3.管脚分配不合理,导致结果不能显示或者不能正常显示。解决方法:
1.进一步理解实验的原理,各部分的组成以及功能。2.运行程序之前仔细检查程序,并适当注释。3.按照规定分配管脚,注意区别不能定义的管脚。
六.心得体会:
因为对EDA技术及Quartus软件的相关知识知道的不够深入,在设计过程
中我们遇到了很多困难,但通过从网上找一些相关资料,最终完成了设计任务。开始做设计时总是会出现各种错误,经过不停的编译及改错最终得到了正确的程序。其实这些错误的主要原因是自己的粗心造成的,如果细心一些这些错误时可以避免的。在编程时,要使用层次化结构的思想,这样程序检查起来也比较方便,调试时也给了自己很大的方便,只要一个模块一个模块的进行调就可以了,充分体现了结构化编程的优势。在设计中要求我们要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我们要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法在数字系统设计中发挥越来越重要的作用。总之这次的设计受益匪浅。
第四篇:FPGA可调数字时钟实验报告
浙江大学城市学院
实验报告纸
一、实验要求
1、用vhdl编程,实现10进制计数器
2、用vhdl编程,实现60进制计数器
3、用vhdl编程,实现数字时钟,时、分、秒、毫秒分别显示在数码管上。
4、实现可调数字时钟的程序设计,用按键实现时、分、秒、毫秒的调整。
二、实验原理
用VHDL,行为级描述语言实现实验要求。思路如下:
1、分频部分:由50MHZ分频实现1ms的技术,需要对50MHZ采取500000分频。
2、计数部分:采用低级影响高级的想法,类似进位加1的思路。对8个寄存器进行计数,同步数码管输出。
3、数码管输出部分:用一个拨码开关控制显示,当sw0=0时,四位数码管显示秒、毫秒的计数。当sw0=1时,四位数码管显示时、分得计数。
4、调整部分:分别用四个按键控制时、分、秒、毫秒的数值。先由一个开关控制计数暂停,然后,当按键按下一次,对应的数码管相对之前的数值加1,,通过按键实现时间控制,最后开关控制恢复计数,完成时间调整。
5、整个实现过程由一个文件实现。
三、实验过程
各个引脚说明: Clk:50MHZ SW:数码管切换,SW=’0’时,数码管显示为秒,毫秒。SW=’1’时,数码管显示为时,分。
SW1:暂停与启动。SW1=’0’时,时钟启动,SW=’1’时,时钟暂停。
SW2:时钟调整接通按钮,当SW2=’0’时,不进行调整,当SW=’1’时,通过按键调整时间。
KEY0: 毫秒调整,按一次实现+1功能 KEY1:秒调整,按一次实现+1功能
浙江大学城市学院 实 验 报 告 纸
KEY2:分调整,按一次实现+1功能 KEY3:时调整,按一次实现+1功能 Q0;第一个数码管 Q1;第二个数码管 Q2: 第三个数码管 Q3: 第四个数码管
1、源代码如下:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity paobiao is port(clk,sw,key0,key1,key2,key3,sw1,sw2:in std_logic;
q0:out std_logic_vector(6 downto 0);
q1:out std_logic_vector(6 downto 0);
q2:out std_logic_vector(6 downto 0);
q3:out std_logic_vector(6 downto 0));end paobiao;architecture behave of paobiao is signal cntt1 :integer range 0 to 10;signal cntt2 :integer range 0 to 10;signal cntt3 :integer range 0 to 10;signal cntt4 :integer range 0 to 6;signal cntt5 :integer range 0 to 10;signal cntt6 :integer range 0 to 10;signal cntt7 :integer range 0 to 10;signal cntt8 :integer range 0 to 6;浙江大学城市学院 实 验 报 告 纸
signal cntttt1 :integer range 0 to 10;signal cntttt2 :integer range 0 to 10;signal cntttt3 :integer range 0 to 10;signal cntttt4 :integer range 0 to 6;signal cntttt5 :integer range 0 to 10;signal cntttt6 :integer range 0 to 10;signal cntttt7 :integer range 0 to 10;signal cntttt8 :integer range 0 to 6;
begin
process(clk)--,key0,key1,key2,key3)
variable cnt :integer range 0 to 500000;
--variable cnt9 :integer range 0 to 3000000000;
variable cnt1 :integer range 0 to 10;
variable cnt2 :integer range 0 to 10;
variable cnt3 :integer range 0 to 10;
variable cnt4 :integer range 0 to 6;
variable cnt5 :integer range 0 to 10;
variable cnt6 :integer range 0 to 10;
variable cnt7 :integer range 0 to 10;
variable cnt8:integer range 0 to 6;
begin if(clk'event and clk='1')then
if(sw1='0')then if(cnt>=2)then
cnt:=0;
cnt1:=cnt1+1;浙江大学城市学院 实 验 报 告 纸
if(cnt1=10)then
cnt1:=0;
cnt2:=cnt2+1;
if(cnt2=10)then
cnt1:=0;
cnt2:=0;
cnt3:=cnt3+1;
if(cnt3=10)then
cnt1:=0;
cnt2:=0;
cnt3:=0;
cnt4:=cnt4+1;
if(cnt4=6)then
cnt1:=0;
cnt2:=0;
cnt3:=0;
cnt4:=0;
cnt5:=cnt5+1;
if(cnt5=10)then
cnt5:=0;
cnt6:=cnt6+1;
if(cnt6=6)then
cnt5:=0;
cnt6:=0;
cnt7:=cnt7+1;
if(cnt7=4)then
cnt5:=0;
cnt6:=0;
cnt7:=0;浙江大学城市学院 实 验 报 告 纸
cnt8:=cnt8+1;
if(cnt8=3)then
cnt5:=0;
cnt6:=0;
cnt7:=0;
cnt8:=0;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
else cnt:=cnt+1;
end if;
if(sw2='0')then
cntt1<=cnt1;
cntt2<=cnt2;
cntt3<=cnt3;
cntt4<=cnt4;
cntt5<=cnt5;
cntt6<=cnt6;
cntt7<=cnt7;
cntt8<=cnt8;
else
cnt1:=cntttt1;
cnt2:=cntttt2;
cnt3:=cntttt3;浙江大学城市学院 实 验 报 告 纸
cnt4:=cntttt4;
cnt5:=cntttt5;
cnt6:=cntttt6;
cnt7:=cntttt7;
cnt8:=cntttt8;
cntt1<=cnt1;
cntt2<=cnt2;
cntt3<=cnt3;
cntt4<=cnt4;
cntt5<=cnt5;
cntt6<=cnt6;
cntt7<=cnt7;
cntt8<=cnt8;
end if;
end if;end if;end process;
process(key0)variable cnttt1 :integer range 0 to 10;variable cnttt2 :integer range 0 to 10;begin if(key0'event and key0='0')then
cnttt1:=cnttt1+1;
if(cnttt1=10)then
cnttt1:=0;
cnttt2:=cnttt2+1;
if(cnttt2=10)then 浙江大学城市学院 实 验 报 告 纸
cnttt2:=0;
end if;
end if;
cntttt1<=cnttt1;
cntttt2<=cnttt2;end if;
end process;process(key1)variable cnttt3 :integer range 0 to 10;variable cnttt4 :integer range 0 to 10;begin if(key1'event and key1='0')then
cnttt3:=cnttt3+1;
if(cnttt3=10)then
cnttt3:=0;
cnttt4:=cnttt4+1;
if(cnttt4=6)then
cnttt4:=0;
end if;
end if;cntttt3<=cnttt3;
cntttt4<=cnttt4;end if;end process;process(key2)variable cnttt5 :integer range 0 to 10;variable cnttt6 :integer range 0 to 10;begin
if(key2'event and key2='0')then 浙江大学城市学院 实 验 报 告 纸
cnttt5:=cnttt5+1;
if(cnttt5=10)then
cnttt5:=0;
cnttt6:=cnttt6+1;
if(cnttt6=6)then
cnttt6:=0;
end if;
end if;cntttt5<=cnttt5;
cntttt6<=cnttt6;
end if;end process;process(key3)variable cnttt7 :integer range 0 to 10;variable cnttt8 :integer range 0 to 10;begin
if(key3'event and key3='0')then
cnttt7:=cnttt7+1;
if(cnttt7=4)then
cnttt7:=0;
cnttt8:=cnttt8+1;
if(cnttt8=3)then
cnttt8:=0;
end if;
end if;
cntttt7<=cnttt7;
cntttt8<=cnttt8;
end if;浙江大学城市学院 实 验 报 告 纸
end process;
--end if;--end process;
process(cntt1,cntt5)
begin
if(sw='0')then
case cntt1 is
when 0=>q0<=“1000000”;
when 1=>q0<=“1111001”;
when 2=>q0<=“0100100”;
when 3=>q0<=“0110000”;
when 4=>q0<=“0011001”;
when 5=>q0<=“0010010”;
when 6=>q0<=“0000010”;
when 7=>q0<=“1011000”;
when 8=>q0<=“0000000”;
when 9=>q0<=“0010000”;
when others=>q0<=NULL;end case;else
case cntt5 is
when 0=>q0<=“1000000”;
when 1=>q0<=“1111001”;
when 2=>q0<=“0100100”;
when 3=>q0<=“0110000”;
when 4=>q0<=“0011001”;
when 5=>q0<=“0010010”;
when 6=>q0<=“0000010”;
浙江大学城市学院 实 验 报 告 纸
when 7=>q0<=“1011000”;
when 8=>q0<=“0000000”;
when 9=>q0<=“0010000”;
when others=>q0<=NULL;end case;
end if;
end process;
process(cntt2,cntt6)
begin if(sw='0')then
case cntt2 is
when 0=>q1<=“1000000”;
when 1=>q1<=“1111001”;
when 2=>q1<=“0100100”;
when 3=>q1<=“0110000”;
when 4=>q1<=“0011001”;
when 5=>q1<=“0010010”;
when 6=>q1<=“0000010”;
when 7=>q1<=“1011000”;
when 8=>q1<=“0000000”;
when 9=>q1<=“0010000”;
when others=>q1<=NULL;end case;else
case cntt6 is
when 0=>q1<=“1000000”;
when 1=>q1<=“1111001”;
when 2=>q1<=“0100100”;浙江大学城市学院 实 验 报 告 纸
when 3=>q1<=“0110000”;
when 4=>q1<=“0011001”;
when 5=>q1<=“0010010”;
when 6=>q1<=“0000010”;
when 7=>q1<=“1011000”;
when 8=>q1<=“0000000”;
when 9=>q1<=“0010000”;
when others=>q1<=NULL;end case;end if;
end process;process(cntt3,cntt7)
begin
if(sw='0')then
case cntt3 is
when 0=>q2<=“1000000”;
when 1=>q2<=“1111001”;
when 2=>q2<=“0100100”;
when 3=>q2<=“0110000”;
when 4=>q2<=“0011001”;
when 5=>q2<=“0010010”;
when 6=>q2<=“0000010”;
when 7=>q2<=“1011000”;
when 8=>q2<=“0000000”;
when 9=>q2<=“0010000”;
when others=>q2<=NULL;end case;else
case cntt7 is 浙江大学城市学院 实 验 报 告 纸
when 0=>q2<=“1000000”;
when 1=>q2<=“1111001”;
when 2=>q2<=“0100100”;
when 3=>q2<=“0110000”;
when 4=>q2<=“0011001”;
when 5=>q2<=“0010010”;
when 6=>q2<=“0000010”;
when 7=>q2<=“1011000”;
when 8=>q2<=“0000000”;
when 9=>q2<=“0010000”;
when others=>q2<=NULL;end case;end if;
end process;
process(cntt4,cntt8)
begin if(sw='0')then
case cntt4 is
when 0=>q3<=“1000000”;
when 1=>q3<=“1111001”;
when 2=>q3<=“0100100”;
when 3=>q3<=“0110000”;
when 4=>q3<=“0011001”;
when 5=>q3<=“0010010”;
when others=>q3<=NULL;end case;else
case cntt8 is
when 0=>q3<=“1000000”;浙江大学城市学院 实 验 报 告 纸
when 1=>q3<=“1111001”;
when 2=>q3<=“0100100”;
when 3=>q3<=“0110000”;
when 4=>q3<=“0011001”;
when 5=>q3<=“0010010”;
when 6=>q3<=“0000010”;
--when 7=>q3<=“1011000”;--when 8=>q3<=“0000000”;--when 9=>q3<=“0010000”;
when others=>q3<=NULL;end case;end if;
end process;end behave;
2、原理图如下:
浙江大学城市学院 实 验 报 告 纸
3、功能仿真如下
1、秒、毫秒计数仿真
2、分、时计数仿真
注释:由于仿真时间限制,小时不能显示。注意SW由0变成1;
浙江大学城市学院 实 验 报 告 纸
3、暂停的仿真,数码管显示用秒,毫秒。
4、按键调整的仿真,主要仿真毫秒的仿真
四、实验结果
实验结果均完成所有要求,但有一个bug,在实现调整功能的时候,不能实时调整数码管暂停下来的数字,只能从之前调整过的数值起开始调整,不过能实现调整之后,开启时钟,时钟即在设定的时间开始跑。当然找到解决的方法,当由于思路和已经 写好的程序冲突性较大,所以此处不再修改。
五、心得体会
本次实验在分频的基础上进行拓展,同时应用数码管显示,开关和按键的控制,比较系统的做了一个实验,对自身的提高还是很有帮助的。
说到心得,此次实验告诉我一下经验:
1、在开始写程序之前最好先评估好自己的思路,简易画出想象中的原理图,再进行编程,对之后的修改有很大的帮助。
2、程序写长了,发现错得时候,修改比较麻烦,所有注意编程习惯很重要,适当的加一些注释,提高程序的可读性。
3、程序最好分模块写,比较清晰。
浙江大学城市学院 实 验 报 告 纸
第五篇:FPGA实验报告北航电气技术实验
FPGA电气技术实践
实验报告
院(系)名称 专业名称 学生学号 学生姓名 指导教师
宇航学院
飞行器设计与工程(航天)
XXXXXXXX
XXXXXX
XXXX
2017年11月XX日
`
` 实验一
四位二进制加法计数器与一位半加器的设计 实验时间:2017.11.08(周三)晚
实验编号20
一、实验目的
1、熟悉QuartusII的VHDL的文本编程及图形编程流程全过程。
2、掌握简单逻辑电路的设计方法与功能仿真技巧。
3、学习并掌握VHDL语言、语法规则。
4、参照指导书实例实现四位二进制加法计数器及一位半加器的设计。
二、实验原理
.略
三、实验设备
1可编程逻辑实验箱EP3C55F484C8 一台(包含若干LED指示灯,拨码开关等)2计算机及开发软件QuartusII 一台套
四、调试步骤
1四位二进制加法计数器
(1)参照指导书实例1进行工程建立与命名。(2)VHDL源文件编辑
由于实验箱上LED指示灯的显示性质为“高电平灭,低电平亮”,为实现预期显示效果应将原参考程序改写为减法器,且”q1<= q1+1”对应改为”q1<= q1-1”,以实现每输入一个脉冲“亮为1,灭为0”。
由于参考程序中的rst清零输入作用并未实现,所以应将程序主体部分的最外部嵌套关于rst输入是否为1的判断,且当rst为1时,给四位指示灯置数”1111”实现全灭,当rst为0时,运行原计数部分。
(3)参照指导书进行波形仿真与管脚绑定等操作,链接实验箱并生成下载文件(4)将文件下载至实验箱运行,观察计数器工作现象,调试拨动开关查看是否清零。可以通过改变与PIN_P20(工程中绑定为clk输入的I/O接口)相连导线的另一端所选择的实验箱频率时钟的输出口位置,改变LED灯显示变化频率。
并且对照指导书上对实验箱自带时钟频率的介绍,可以通过改变导线接口转换输入快慢,排查由于clk输入管脚损坏而可能引起的故障。
` 2一位半加器
(1)参照指导书实例1进行工程建立与命名。
(2)图形源文件编辑:由于实验箱上LED指示灯的显示性质为“高电平灭,低电平亮”,为实现预期显示效果应将原电路图中两个输出管脚与非门串联以实现原参考输出“高电平亮,低电平灭”。
(3)参照指导书进行波形仿真与管脚绑定等操作,链接实验箱并生成下载文件(4)将文件下载至实验箱运行,观察半加器工作现象,调试拨动开关查看进位与置数指示是否正常工作。
五、实验现象
1.四位二进制加法计数器
SW1下拨为0时,四个LED指示灯可以对输入脉冲从”0000”到”1111”进行十六位循环计数(其中亮为1,灭为0)。SW1上拨为1时可以实现四个LED灯保持全灭清零。且四位二进制加法计数器功能成功实现
2.一位半加器
SW1与SW2输入分别为”00”、”01”、”10”、”11”时,进位指示与置数指示灯分别显示”00”、”01”、”01”、”10”(其中亮为1,灭为0)。且一位半加器功能成功实现。
六、实验代码
1四位二进制加法计数器(已修改)
entity count4 is
port(clk:in std_logic;--waishizhong,fpga_ex2_6
rst:in std_logic;--F1 pin-ab15
q:out std_logic_vector(3 downto 0));--led4-1
end;architecture b1 of count4 is
signal q1:std_logic_vector(3 downto 0);
begin
process(clk,rst)
begin
if(rst='0')then
if(clk'event and clk='1')then q1<= q1-1;
end if;
else q1<=“1111”;
end if;
end process;`
q<=q1;end 2一位半加器
七、结果分析
1若在加载运行文件后实验箱上无反应,可以通过更换不同频率输入管脚查看是否为实验箱自带时钟的故障。
2实验箱上LED显示灯与设计逻辑相反时可以通过修改程序逻辑或给电路图添加非门实现正逻辑显示。
` 实验二
16×16LED点阵四字循环显示 实验时间:2017.11.08(周三)晚
实验编号20
一、实验目的
1、掌握VHDL编程技巧和各种输入输出显示方法。
2、学习并分析指导书中实例,从中发现感兴趣的题目,并以此自设计一个有内容,功能稍复杂的主、子程序综合应用例程,实现调试与验证。
3、实现LED点阵“高山仰止”四字清晰循环显示。
二、实验原理
.1 LED显示原理
16×16扫描LED点阵的工作原理同8位扫描数码管类似,其结构示意图(图1)与等效电路图(图2)如下。它有16个共阴极输出端口,每个共阴极对应有16个 LED显示灯,所以其扫描译码地址需4位信号线(管脚对应COL1-COL4),从右起为第一列且COL1-4对应”0000”。其汉字扫描码由16位段地址(从下至上管脚对应ROW1-ROW16)输入。本设计选用的LED列扫描,汉字信号行输入的方式,显示完整汉字。
图1 16×16LED点阵 图2 16×16点阵LED等效电路
列循环扫描,通过对每一列的扫描来完成对字母的现实,本设计为使列扫描符合视觉暂留要求,扫描频率至少大于16×8=128Hz,周期小于7.8ms,以此给人以连续的感觉。汉字的信息储存
用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。第一步是在程序中建立汉字数据库。第二步是在扫描模块的控制下,配合列扫描的次序正确地输出这些数据。获得图像数据的步骤是,先将要显示的每一幅图像画在一个如(图3)所示的被分成16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,汉字取模可由专用软件进行。
`
图3 16*16点阵显示模块
由于本实验箱为从右至左依次对应”0000”列到”1111”列,从下至上为最高位到最低位,于平时习惯的认字方向相反,所以注意在逐列扫描的设计中要对字取“反模”。
例如要在右边起第2列的从上到下数2、4、6、8行亮,则列编号为”0001”、行输入为”***0”就可以实现了。
3延时环节
为使汉字不断地循环显示,并且使每个汉子显示后停留,就需要在中间加一定的延时和循环环节。在这一环节中,可以通过修改每个显示和停留周期包含的总时钟脉冲数值来控制每个字的显示时间,运用状态机设计方法给四个汉字对应的不同输入状态进行编码,即可使汉字依次清晰显示。
三、实验设备
1可编程逻辑实验箱EP3C55F484C8 一台(包含16×16LED点阵一组等)2计算机及开发软件QuartusII 一台套
四、调试步骤
1建立工程,命名为ledgrq1616。建立VHDL程序文件命名为1ed1616grq.vhd。2按照第六部分原程序输入代码,并按所示表格绑定管脚。编写程序及绑定管脚时时注意第二部分中所叙述的扫描显示顺序以及对应取反字模的方法。
3编译无误后开启实验箱,生成.sof传输文件并下载至实验箱,确保运行模式为1,且CPRL_SW拨码开关为”00XX”。
4观察实验箱上现象,通过改接不同频率的脉冲输入管脚或改变每个字符停留周期包含的总脉冲数来保证有足够快的扫描频率与大约每个字大约一秒多的充足停留时间,并查看是否有“高山仰止”四字依次有停顿的清晰的循环显示。
五、实验现象
当时钟输入线接FRQH_Q2(3000000Hz)管脚时,设定每个周期为5000000个脉冲时,` 实现“高山仰止”在16×16LED点阵上清晰循环显示。
六、实验代码
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity led1616grq is port(clk: in std_logic;--时钟
data: out std_logic_vector(15 downto 0);--行输入
addrs: out std_logic_vector(3 downto 0));--列地址 end led1616grq;
architecture chw_arc of led1616grq is signal fenpin:std_logic_vector(1 downto 0);--分频信号 signal ad:std_logic_vector(3 downto 0);--地址中转信号 begin
process(clk)--产生一个大约1s的分频信号模块
variable cnt:integer:=0;
variable tmp:std_logic_vector(1 downto 0);
begin
if clk'event and clk='1' then
if cnt<5000000 then
cnt:=cnt+1;
else
cnt:=0;
if tmp=“11” then
tmp:=“00”;
else
tmp:=tmp+1;
end if;
end if;
end if;
fenpin<=tmp;end process;
process(clk)--送16位地址程序
variable js:integer:=0;
variable cnt:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if js<10000 then
js:=js+1;
else
js:=0;`
if cnt=“1111” then
cnt:=“0000”;
else cnt:=cnt+1;
end if;
end if;
end if;ad<=cnt;
end process;process(fenpin,ad)
begin
case fenpin is--besure to get the opposite model of the word--and exchange the hight 8bit to the low 8bit
--then write begin 1111 to 0000
when “00”=>
case ad is
--”高”的字模
when “0000”=>data<=“***0”;--00 00 when “0001”=>data<=“***0”;--04 00
when “0010”=>data<=“***0”;--04 FE
when “0011”=>data<=“***0”;--04 82
when “0100”=>data<=“***0”;--04 02
when “0101”=>data<=“***0”;--F4 7A
when “0110”=>data<=“***0”;--94 4A
when “0111”=>data<=“***0”;--94 4A
when “1000”=>data<=“***0”;--96 4A
when “1001”=>data<=“***1”;--95 4A
when “1010”=>data<=“***0”;--94 4A
when “1011”=>data<=“***0”;--F4 7A
when “1100”=>data<=“***0”;--04 02
when “1101”=>data<=“***0”;--04 02
when “1110”=>data<=“***0”;--04 FE
when “1111”=>data<=“***0”;--04 00
when others=>null;
end case;
when “01”=>
case ad is
when “0000”=>data<=“***0”;--0000 “山”的字模
when “0001”=>data<=“***0”;--0000
when “0010”=>data<=“***0”;--7FF0
when “0011”=>data<=“***0”;--2000
when “0100”=>data<=“***0”;--2000 `
when “0101”=>data<=“***0”;--2000
when “0110”=>data<=“***0”;--2000
when “0111”=>data<=“***1”;--3FFF
when “1000”=>data<=“***0”;--2000
when “1001”=>data<=“***0”;--2000
when “1010”=>data<=“***0”;--2000
when “1011”=>data<=“***0”;--2000
when “1100”=>data<=“***0”;--3FF0
when “1101”=>data<=“***0”;--0000
when “1110”=>data<=“***0”;--0000
when “1111”=>data<=“***0”;--0000
when others=>null;
end case;
when “10”=>
case ad is
when “0000”=>data<=“***0”;--0000 “仰”的字模
when “0001”=>data<=“***0”;--0000
when “0010”=>data<=“***0”;--07FC
when “0011”=>data<=“***0”;--0804
when “0100”=>data<=“***0”;--0404
when “0101”=>data<=“***1”;--FFCF
when “0110”=>data<=“***0”;--0000
when “0111”=>data<=“***0”;--0402
when “1000”=>data<=“***0”;--0804
when “1001”=>data<=“***1”;--1FCF
when “1010”=>data<=“***0”;--0000
when “1011”=>data<=“***1”;--0007
when “1100”=>data<=“***0”;--FFF8
when “1101”=>data<=“***0”;--0060
when “1110”=>data<=“***0”;--0080
when “1111”=>data<=“***0”;--0100
when others=>null;
end case;
when “11”=>
case ad is
when “0000”=>data<=“***0”;--0000“止”的字模
when “0001”=>data<=“***0”;--4000
when “0010”=>data<=“***0”;--4000
when “0011”=>data<=“***0”;--4040
when “0100”=>data<=“***0”;--4040
when “0101”=>data<=“***0”;--4040
when “0110”=>data<=“***0”;--4040
when “0111”=>data<=“***0”;--4040 `
when “1000”=>data<=“***1”;--7FFF
when “1001”=>data<=“***0”;--0400
when “1010”=>data<=“***0”;--0400
when “1011”=>data<=“***0”;--0400
when “1100”=>data<=“***1”;--7FFF
when “1101”=>data<=“***0”;--4000
when “1110”=>data<=“***0”;--4000
when “1111”=>data<=“***0”;--4000
when others=>null;
end case;
when others=>null;
end case;end process;addrs<=ad;end chw_arc;
管脚绑定如下:
七、结果分析
设备调试与程序调试一样均为FPGA目标器件功能实现的必须工作,根据加载后实际显示情况,同样可以反推出QuartusII无法直接报错的引脚绑定方面的问题以及程序书写逻辑问题,实验中具体出现的情况如下:
(1)显示为一团不断闪烁的重叠形状 原因:可能为间隔时间太短 措施:应增大间隔周期数,延长停顿
`(2)字符形状与设计不同/错位
原因:如果为行顺序错位或乱序,但每一列仍为从右至左扫描,可能为ROW1-15管脚绑定错位:如果为列出现顺序及显示正确但位置错位,可能为CLK1-3管脚绑定错位;上述两种情况也可同时发生。
措施:将时钟输入频率放缓至可以看清每一列出现的顺序位置及显示内容,与所设计的字模对照,判断是哪几个ROW管脚及CLK错位,重新绑定即可。
(3)实验箱开启后毫无显示
原因:可能是工作模式的拨码开关并非”00XX”,或时钟管脚故障。
措施:选用其他频率的管脚试接;若排除管脚问题,查看模式显示数码管数值是否为1,如不是,改变工作模式,重新加载文件。
` 实验三
蜂鸣器/扬声器电子音乐演奏
实验时间:2017.11.15(周三)晚
实验编号20
一、实验目的
1、熟练掌握QuartusII平台各模块操作及实验箱调试方法。
2、用元件例化语句调用方式,任意自选题设计一个有内容,功能较复杂的主、子程序综合应用的多模块集成例程,并实现调试与验证。
3、实现电子音乐《天空之城》的主旋律循环播放,并通过LED灯指示音符。
二、实验原理
.1、电子音符演奏
乐曲硬件电路产生音乐是和音乐频率和音乐的持续时间有关;音符的持续时间需根据乐曲的速度和每个音符的节拍数来确定。设计所用简谱及音符和频率的关系如下:
2、演奏节拍控制
该演奏电路演奏的乐曲是《天空之城》,其最小的节拍为1拍,将1拍的时长定位0.25S,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长(5Hz由24MHz的基准频率分频产生),对于占用时间较长的节拍,(一定是节拍的整数倍),如全音符为4拍,2/4音符为2拍,1/4音符为1拍。
3、演奏电路模块
乐曲硬件演奏电路系统主要有音调分频器和乐曲存储模块两个部分组成,其余还有音乐节拍发生器等等。音调分频器对24MHz(由基准频率产生)的频率进行分频,得到与各个音节对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中写入一个乐曲曲谱真值序列,由一个计数器来控制此序列的输出,而由计数器的计` 数时钟信号作为乐曲节拍控制信号。
4程序设计思路
实验中采用层次化设计思路,音乐发生器的设计包括四个模块:时钟分频模块、自动演奏模块、音符显示模块、音调分频模块。分好层次之后,编写每个模块的程序。
时钟分频模块通过基准时钟频率clk(24MHz)产生两个时钟信号。自动演奏模块接收4hz的时钟信号,输出音调代码。显示模块利用音调代码查找并输出对应LED灯显示情况。同时将音调对应的给8盏LED指示灯,分别显示高中低音符。音调分频模块接收音调代码对应的分频系数,并据此分频,将对应频率的信号输出给扬声器供其发声。
三、实验设备
1可编程逻辑实验箱EP3C55F484C8 一台(含蜂鸣器、扬声器、若干LED灯等)2计算机及开发软件QuartusII 一台套
四、调试步骤
1建立工程,命名为grqbeep01。建立VerilogHDL程序文件命名为grqbeep01.v。2按照第六部分原程序输入代码,并按所示表格绑定管脚。
3编译无误后开启实验箱,将时钟输入管脚P20接Q0(24000000Hz)。
4生成.sof传输文件并下载至实验箱,确保运行模式为3,且CPRL_SW拨码开关为”0110”。
5观察实验箱上现象,确定蜂鸣器与扬声器的器件使用设定方法,对比其效果差异。
五、实验现象
1跳线BZ1未调整时
下载完毕,听到完整的由蜂鸣器播放的循环《天空之城》音乐,可是声音很小,LED指示灯显示没有错误。
2跳线BZ1由23调整到12时
下载测试,听到声音洪亮的循环播放的《天空之城》音乐,并且音调很好,数码管显示音符正常,实现预期功能。
六、实验代码
`timescale 1ns / 1ps module grqbeep01(clk,beep,led);input clk;//时钟管脚
` output beep;//蜂鸣器管脚 output [7:0]led;//led指示管脚 reg beep;reg [22:0]i;reg clk_4hz;reg [7:0]led;
reg [16:0]count,div_num;reg [6:0]music;//以下为主体
always@(posedge clk)//4hz生成部分
begin if(i==23'h47868c)begin i<=0;
clk_4hz=~clk_4hz;end else i=i+1'b1;end
always@(posedge clk_4hz)begin
if(music==7'd122)//总共的音符节拍数 music<=0;else
music<=music+1'b1;end always@(posedge clk)begin
if(count==div_num)begin
count<=0;beep=~beep;end else
count<=count+1'b1;end parameter//输入查表可得的低中高音符赫兹数 L0=17'h00000, L1=17'h1754e, L2=17'h14c81, L3=17'h1284a, L4=17'h117A8, L5=17'h14e70, L6=17'h0ddf2, L7=17'h0c5ba, M1=17'h0ba9e, ` M2=17'h0a648, M3=17'h0941f, M4=17'h08bcf, M5=17'h07c90, M6=17'h06ef9, M7=17'h062dd, H1=17'h05d68, H2=17'h05322, H3=17'h04a11, H4=17'h045e9, H5=17'h3e48, H6=17'h377d, H7=17'h316f;always@(posedge clk_4hz)begin case(music)//乐谱输入 7'd0:div_num=M6;7'd1:div_num=M7;7'd2:div_num=H1;7'd3:div_num=H1;7'd4:div_num=H1;7'd5:div_num=M7;7'd6:div_num=H1;7'd7:div_num=H1;7'd8:div_num=H3;7'd9:div_num=H3;7'd10:div_num=M7;7'd11:div_num=M7;7'd12:div_num=M7;7'd13:div_num=M7;7'd14:div_num=M7;7'd15:div_num=M7;7'd16:div_num=M3;7'd17:div_num=M3;7'd18:div_num=M6;7'd19:div_num=M6;7'd20:div_num=M6;7'd21:div_num=M5;7'd22:div_num=M6;7'd23:div_num=M6;7'd24:div_num=H1;7'd25:div_num=H1;7'd26:div_num=M5;7'd27:div_num=M5;7'd28:div_num=M5;7'd29:div_num=M5;` 7'd30:div_num=M5;7'd31:div_num=M5;7'd32:div_num=M2;7'd33:div_num=M3;7'd34:div_num=M4;7'd35:div_num=M4;7'd36:div_num=M4;7'd37:div_num=M3;7'd38:div_num=M4;7'd39:div_num=M4;7'd40:div_num=H1;7'd41:div_num=H1;7'd42:div_num=M3;7'd43:div_num=M3;7'd44:div_num=M3;7'd45:div_num=M3;7'd46:div_num=H1;7'd47:div_num=H1;7'd48:div_num=M7;7'd49:div_num=M7;7'd50:div_num=M7;7'd51:div_num=M3;7'd52:div_num=M4;7'd53:div_num=H1;7'd54:div_num=H1;7'd55:div_num=M7;7'd56:div_num=M7;7'd57:div_num=M7;7'd58:div_num=M7;7'd59:div_num=M7;7'd60:div_num=M7;//第二段乐谱
7'd61:div_num=M6;7'd62:div_num=M7;7'd63:div_num=H1;7'd64:div_num=H1;7'd65:div_num=H1;7'd66:div_num=M7;7'd67:div_num=H1;7'd68:div_num=H1;7'd69:div_num=H3;7'd70:div_num=H3;7'd71:div_num=M7;7'd72:div_num=M7;` 7'd73:div_num=M7;7'd74:div_num=M7;7'd75:div_num=M7;7'd76:div_num=M7;7'd77:div_num=M3;7'd78:div_num=M4;7'd79:div_num=M6;7'd80:div_num=M6;7'd81:div_num=M6;7'd82:div_num=M5;7'd83:div_num=M6;7'd84:div_num=M6;7'd85:div_num=H1;7'd86:div_num=H1;7'd87:div_num=M5;7'd88:div_num=M5;7'd89:div_num=M5;7'd90:div_num=M5;7'd91:div_num=M5;7'd92:div_num=M5;7'd93:div_num=M2;7'd94:div_num=M3;7'd95:div_num=M4;7'd96:div_num=M4;7'd97:div_num=H1;7'd98:div_num=H1;7'd99:div_num=H1;7'd100:div_num=M7;7'd101:div_num=H1;7'd102:div_num=H2;7'd103:div_num=H2;7'd104:div_num=H3;7'd105:div_num=H3;7'd106:div_num=H1;7'd107:div_num=H1;7'd108:div_num=H1;7'd109:div_num=M7;7'd110:div_num=M6;7'd111:div_num=M6;7'd112:div_num=M7;7'd113:div_num=M7;7'd114:div_num=M5;7'd115:div_num=M5;7'd116:div_num=M6;` 7'd117:div_num=M6;7'd118:div_num=M6;7'd119:div_num=M6;7'd120:div_num=M6;7'd121:div_num=M6;endcase end
always@(div_num)//定义每一种音符的LED指示方案
begin case(div_num)
L5,H5:led=8'b1111_1111;L6,H6:led=8'b0111_1111;L7,M1:led=8'b0011_1111;M2,M3:led=8'b0001_1111;M4,L4,H4,M5:led=8'b0000_1111;M6,M7:led=8'b0000_0111;H1,L1:led=8'b0000_0011;H2,L2:led=8'b0000_0001;H3,L3:led=8'b0000_0000;default: led=8'bx;endcase end endmodule 管脚绑定如下:
七、结果分析
1实验指导书由于篇幅有限,并未介绍全部硬件的管脚连接与使用方法,但是实验室中的完整实验箱说明书可以查阅到所有硬件资料。例如本实验中,指导书上只是概略提及了模式3中有BZSP接口可以实现蜂鸣器/扬声器放音,却并未提及调用切换方法,在老师帮助下在实验箱完整说明书中找到BZ1跳线使用方法,最终实现扬声器响亮播放。
2实验中的实际运行输入时钟频率必须与程序设计频率完全一致,设计程序也要优先参考实验箱所提供的自身时钟,否则输出音调和分频后的输出节拍均会因基准频率不符而有明显变化,可能有完全变调或频率过低而声音失真的情况。
`
实验感想
本次实验前后时间跨度有三周,从中收获的不仅仅是指导书中的一种新的Ada类编程语言的使用方法,更是一种对于短时间内接纳新的理论并迅速结合已知储备,实现实践运用与二次创新的能力锻炼。
能够借此机会下定决心,实现很久之前就有的学习Verilog的目标,更加深刻感受到C类编程语法的强大之处,同时也再一次锻炼了查找学习资源与阅读自学的能力。
为了能够深刻学习并学以致用,以上三个实验只是成果的一小部分,关于TFT_LCD以及LCD1602的驱动控制,以及Verilog语法规范与设计思路所读的40多篇文献,与两本课本,调试的17组程序,虽然来不及在课堂上展示,但是在我自己购置的手册齐全的DJ51单片机与我的TMS320F28335的DSP开发板上,均实现了非常令人喜悦的显示效果。而且实际上我所缺的,不能很方便找到的资源,其实就是那本完整的硬件说明书,但是至于其他,收获惊喜的比想象多了不少。对于硬件控制设计的理解也从大二的“仅仅是单片机”“不就是驱动个电机吗”,有了更多的深入的思考。
毕竟,“高山仰止,景行行止,虽不能至,心向往之”。
各种编程语言与平台,最终都是用不同的方式叙述同一种逻辑。编程的使用,只是让构思的逻辑与想法最快生成可以感受到的成果的途径,是表达的工具,也是最基础的链接理论到实物的媒介,但是其中最不可替代的只是一直存在的想法而已。
`