基于DE2115开发板的FPGA入门设计实验.docx

上传人:b****6 文档编号:13036631 上传时间:2023-06-10 格式:DOCX 页数:20 大小:2.47MB
下载 相关 举报
基于DE2115开发板的FPGA入门设计实验.docx_第1页
第1页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第2页
第2页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第3页
第3页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第4页
第4页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第5页
第5页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第6页
第6页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第7页
第7页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第8页
第8页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第9页
第9页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第10页
第10页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第11页
第11页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第12页
第12页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第13页
第13页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第14页
第14页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第15页
第15页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第16页
第16页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第17页
第17页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第18页
第18页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第19页
第19页 / 共20页
基于DE2115开发板的FPGA入门设计实验.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于DE2115开发板的FPGA入门设计实验.docx

《基于DE2115开发板的FPGA入门设计实验.docx》由会员分享,可在线阅读,更多相关《基于DE2115开发板的FPGA入门设计实验.docx(20页珍藏版)》请在冰点文库上搜索。

基于DE2115开发板的FPGA入门设计实验.docx

基于DE2115开发板的FPGA入门设计实验

基于DE2-115开发板的FPGA入门设计实验

1、Lab1:

4位加法器、减法器的设计

1.1摘要

在文件add_sub里面的工程文件operation_4.v为顶层文件,该顶层文件包含了三个子模块,分别为数码管显示模块,4位带进位的二进制加法器模块和4位带借位的二进制减法器模块,最后通过DE2-115开发板显示实验结果。

1.2程序

1)add_4bits.v加法器

moduleadder_4bits

inputclk,

inputrst_n,

input[3:

0]x,

input[3:

0]y,

outputreg[3:

0]sum,

outputregcarry_out//溢出位

);

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

{carry_out,sum}<=0;

else

{carry_out,sum}=x+y;

end

endmodule

2)substractor_4bits.v减法器

modulesubtractor_4bits

inputclk,

inputrst_n,

input[3:

0]x,

input[3:

0]y,

outputreg[3:

0]sub,

outputregborrow_out

);

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

{borrow_out,sub}<=0;

else

begin

if(x>=y)

{borrow_out,sub}={1'b0,x-y};

else

{borrow_out,sub}={1'b1,x-y};

end

end

endmodule

3)seg7_lut.v数码管显示译码模块

moduleSeg7_lut

input[3:

0]iDIG,

outputreg[6:

0]oSEG

);

always@(iDIG)

begin

case(iDIG)

4'h1:

oSEG=7'b1111001;//---t----

4'h2:

oSEG=7'b0100100;//||

4'h3:

oSEG=7'b0110000;//ltrt

4'h4:

oSEG=7'b0011001;//||

4'h5:

oSEG=7'b0010010;//---m----

4'h6:

oSEG=7'b0000010;//||

4'h7:

oSEG=7'b1111000;//lbrb

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;

4'hf:

oSEG=7'b0001110;

4'h0:

oSEG=7'b1000000;

endcase

end

endmodule

1.3结果

本设计通过VerilogHDL硬件描述语言。

描述加法、减法算法,包括了进位以及借位,最终可以在实验板上观察结果,验证了算法的正确性。

拨码开关SW[7:

0]输入两位计算值,SW[17]为复位按键,如下图所示:

该实验结果显示的是7+b=02,进位位在LEDG[0]显示,7-b=12,借位位在LEDR[0]显示。

计算过程如下:

 

2、Lab2:

三位二进制乘法器的设计

2.1摘要

在文件mult_3bits里面的工程文件operation_4.v为顶层文件,该顶层文件包含了两个子模块,分别为数码管显示模块和三位二进制乘法器模块,最后通过DE2-115开发板显示实验结果。

2.2程序

1)mult_3bits.v乘法器

modulemult_3bits

input[2:

0]x,

input[2:

0]y,

output[5:

0]mult_out

);

wire[2:

0]temp0=y[0]?

x:

3'd0;

wire[2:

0]temp1=y[1]?

x:

3'd0;

wire[2:

0]temp2=y[2]?

x:

3'd0;

assignmult_out=temp0+(temp1<<1)+(temp2<<2);

endmodule

2)seg7_lut.v文件与Lab1中的相同

2.3结果

本设计通过VerilogHDL硬件描述语言,通过移位以及加法,实现三位二进制乘法功能,最终可以在实验板上观察结果,验证了算法的正确性。

拨码开关SW[6:

0]输入两位计算值,SW[17]为复位按键,如下图所示:

 

3、Lab3:

序列检测器的设计

3.1摘要

通过VerilogHDL硬件描述语言,按照要求,设计一个序列检测器,在检测到4’b1111序列后输出高电平标志位,反之输出低电平。

电路在QuartusII中设计,最后通过波形图仿真和开发板得出实验结果。

3.2程序

sequence_detect.v序列检测器

modulesequence_detect

inputclk,

inputrst_n,

inputdin_en,//Hvaild

inputdin,

outputregdout

);

//capturetheposedgeofdin_enfordatareceive

regdin_en_r0,din_en_r1;

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

begin

din_en_r0<=0;

din_en_r1<=0;

end

else

begin

din_en_r0<=din_en;

din_en_r1<=din_en_r0;

end

end

wiredin_flag=(~din_en_r1&din_en_r0)?

1'b1:

1'b0;

//din_en的值由0变1时,din_flag的值变为高电平维持一个时钟周期(脉冲边沿检测)

//din_en作为数据输入的标志

//--------------------------------------------

reg[3:

0]sequence_data;//序列数据寄存器

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

begin

sequence_data<=0;//初始化时寄存器状态

dout<=0;//寄存器输出为0

end

elseif(din_flag)//din_en上升沿,din_flag=1

begin

sequence_data<={sequence_data[2:

0],din};//串行输入dout<=(sequence_data==4'b1111)?

1'b1:

1'b0;

end

end

endmodule

3.3结果

该程序中定义可串行输入接口:

din,串行输出接口dout,同时添加了数据输入标志信号din_en,以指示数据的输入。

串行数据输入序列通过移位操作,存入与sequence_data中,同时检测sequence_data,当出现4’b1111时,dout输出1表示检测到了要求的序列。

其中仿真结果如下:

 

4、Lab4:

变模计数器的设计

4.1摘要

在设计一个计数器的前提下,要求模值可变,即计算器最大值可变。

因此,这要求能动态改变计数器的模值,同时在数码管上实时显示输出结果。

在文件variable_counter里面的工程文件variable_counter.v为顶层文件,该顶层文件包含了一个数码管显示子模块,最后通过DE2-115开发板显示实验结果。

4.2内容

1)变模的实现

模值可以通过选择,也可以通过输入,来动态改变。

在该实验中,通过一个拨码开关SW[0]来选择模值“16”或者“64”,实现选择通过一个选择语句即可实现。

如下语句:

wire[7:

0]max_vaule=SW[0]?

8'd64:

8'd16;

2)输出显示

本实验通过2个7段数码管来显示数据。

同时为了肉眼能看到数据的变化,通过计数,实现0.25S的使能标志定点时间,以此标志位来作为计数器的计数周期,保证肉眼可以看得到数据的变化。

4.3程序

1)variable_counter.v变模计数器顶层模块

modulevariable_counter

inputclk,//CLOCK_50

inputrst_n,//SW17

input[0:

0]SW,//SW0控制变模

output[6:

0]HEX0,//ge_data

output[6:

0]HEX1//shi_data

);

wire[7:

0]max_vaule=SW[0]?

8'd64:

8'd16;

reg[23:

0]cnt;

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

cnt<=0;

else

cnt<=(cnt==24'd12500000)?

24'd0:

cnt+1'b1;

end

wiredelay02_flag=(cnt==24'd12500000)?

1'b1:

1'b0;

//----------------------------

reg[7:

0]counter;//8位最大计数127

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

counter<=0;

elseif(delay02_flag)//计数0.25s

counter<=(counter>=max_vaule)?

8'd0:

counter+1'b1;

end

//-------------------------------

//hex2decimalconvert

wire[3:

0]shi_data=(counter<10)?

4'd0:

(counter<20)?

4'd1:

(counter<30)?

4'd2:

(counter<40)?

4'd3:

(counter<50)?

4'd4:

(counter<60)?

4'd5:

(counter<70)?

4'd6:

(counter<80)?

4'd7:

(counter<90)?

4'd8:

4'd9;

wire[3:

0]ge_data=(counter<10)?

counter-8'd0:

(counter<20)?

counter-8'd10:

(counter<30)?

counter-8'd20:

(counter<40)?

counter-8'd30:

(counter<50)?

counter-8'd40:

(counter<60)?

counter-8'd50:

(counter<70)?

counter-8'd60:

(counter<80)?

counter-8'd70:

(counter<90)?

counter-8'd80:

counter-8'd90;

//shi_datadisplay

Seg7_lutu_Seg7_lut1

.iDIG(shi_data),

.oSEG(HEX1)

);

//ge_datadisplay

Seg7_lutu_Seg7_lut2

.iDIG(ge_data),

.oSEG(HEX0)

);

Endmodule

2)Seg7_lut.v数码管显示模块与Lab1中的相同

4.3结果

SW[0]=0时,计数器的最大值为16

SW[0]=1时,计数器的最大值为64

 

5、Lab5:

流水灯和简易电子时钟的设计

在文件time_counter里面的工程文件Labtest.v为顶层文件,该顶层文件包含了三个子模块,分别为数码管显示模块,流水灯模块和计数器模块,实现数码管显示分、秒、毫秒计时的简易电子钟和流水灯显示。

5.1流水灯设计

5.1.1摘要

通过verilogHDL硬件描述语言,实现8个LED每隔1s点亮一个的功能。

5.1.2内容

1)1S延时实现

D2-115开发板的时钟频率为50Mhz,通过计数器计数50000000次,到点即输出使能标志,即可实现延时。

2)挨个点亮LED

本设计通过移位操作来实现8个LED的挨个点亮功能,

led_data<={led_data[6:

0],1'b1};//每一秒左移一位

最后通过引脚配置,全局编译,下载到DE2-115中,观察现象,验证正确,如下图所示:

5.1.3程序

Time_Counter文件夹下的led_display.v文件

moduleled_display

inputclk,

inputrst_n,

outputreg[7:

0]led_data

);

//----------------------------

reg[27:

0]cnt;

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

cnt<=0;

else

cnt<=(cnt==28'd50_000000)?

28'd0:

cnt+1'b1;//1s

end

wiredelay01_flag=(cnt==28'd50_000000)?

1'b1:

1'b0;

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

led_data<=0;

else

if(delay01_flag)//计时1S

led_data<={led_data[6:

0],1'b1};//每一秒左移一位

end

endmodule

 

5.2简易电子时钟的设计

5.2.1摘要

在DE2-115开发板上,通过VerilogHDL硬件描述语言,实现分、秒、毫秒计时的简易电子时钟,并且通过数码管显示出来。

5.2.2内容和结果

本实验主要内容是计数,其次,描述出分秒毫秒之间的计时关系,即可实现功能。

1)分秒毫秒计时

根据晶振时钟的输入,通过计数实现1ms的delay,然后通过此标志位,进行“毫秒”(0~999)计数,当“毫秒”到达999的时候,自动清零并且给秒进位,当“秒”到达59的时候,自动清零并且给分进位,当“分”到达59的时候,自动清零,重新计数,本实验通过一位拨码开关SW7控制复位,当SW7=0时,所有计数清零。

2)数码管显示

根据要显示的数据,通过不同的段的点亮,来实现0-9的显示。

本实验分秒毫秒需要7位数码管,通过例化7个数码管显示电路,通过参数的传递,实现“分”高位、“分”低位、“秒”高位、“秒”低位、“毫秒”高位、“毫秒”中位、“毫秒”低位的实时显示。

最后通过引脚配置,全局编译,下载到DE2-115中,观察现象,验证正确,如下图所示,下面实验现象显示07分43秒388毫秒,7位7段数码管,时刻很准确。

5.2.3程序

Time_Counter文件夹下的time_counter.v文件为分秒计时器模块。

Time_Counter文件夹下的seg7_lut.v文件为数码管显示模块。

Time_Counter文件夹下的Labtest.v文件为顶层模块,通过调用分秒计时器模块和数码管显示模块实现该分秒计时器的显示。

 

6、Lab6:

简易计算器的设计

文件Calculator_Design里面的工程文件Calculator_Design.v为顶层文件,该顶层文件包含了四个子模块,分别为按键消抖扫描模块,四位二进制乘法器模块,四位二进制加法器模块,数码管显示模块,实现计算乘法和加法的简易计算器的设计。

6.1摘要

通过VerilogHDL硬件描述语言,设计一个简易计数器,实现0~9的加法算法,以及乘法算法。

6.2内容和结果

1)加法、乘法电路

在前面的实验中已经设计过加减法器电路和乘法电路

2)按键扫描程序

通常用户按键,在按下去之后,会有20ms左右的抖动,同时,在按键放开之后会有20ms左右的抖动。

在这时候若采集信号,势必导致误操作,甚至系统崩溃。

因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。

对此一般产用消抖动的原理。

一般可分为以下几种:

(1)延时

(2)N次低电平计数

(3)低通滤波

在数字电路中,可以掩饰,当然更方便的是直接N次采样,来判断是否改变,以及改变的时间。

因此做以下处理,进行N次计数,有效去噪声,抖动,以及干扰。

按键扫描模块将输出key_flag按键按下反馈信号,以及即时输出的数据:

3)数值输入与计算

数值采用拨码开关输入,同时为了确保数值在用户拨动拨码开关后输入,更容易改变x或者y,由于硬件的局限,只能通过轻触按键的触发来实现数值的输入。

每个拨码开关代表一个值(0-9),同时,第一个轻触按键表示x的输入触发,第二个轻触按键表示y的输入触发,第三个表示输出x+y的结果,第四个表示输出x*y的结果。

4)数码管显示

数码管译码电路跟之前的实验一样,通过点亮不同的段,来实现0-F的显示,简易计算x,y的值,以及结果刚好通过4位数码管显示出来,如下图所示,9+9=18,9*9=81

6.3程序

Calculator_Design文件夹下的Calculator_Design.v为该设计的顶层模块

Time_Counter文件夹下的seg7_lut.v文件为数码管显示模块。

Time_Counter文件夹下的key_scan.v文件为按键消抖扫描程序。

Time_Counter文件夹下的mult_4bits.v文件为四位二进制乘法器模块。

Time_Counter文件夹下的adder_4bits.v文件为四位二进制加法器模块。

7、Lab7:

LCD1602字符显示设计

7.1摘要

本设计基于AlteraDE2-115开发平台,针对板载LCD字符显示器,通过Verilog硬件描述语言,采样状态机描述整个时序,实现LCD1602的字符、数字的ASCII码显示。

7.2内容

驱动原理:

1)我们要明白LCD1602是慢速器件,如果直接用FPGA 外接的50Mhz时钟直接驱动肯定是不行的,所以要对FPGA时钟进行分频驱动,或者计数延时使能驱动。

这里采用的计数延时使能驱动,代码中通过计数器定时得出lcd_en信号线驱动,得到1Khz的频率,初始化LCD1602,如下图所示,LCD_EN的最小周期为500ns,则最大频率为2Mhz(不同的LCD1602的参数不相同)下面为LCD1602写操作的时序图和对时钟要求,来源于DE2-115开发板的LCD1602数据手册。

图1写数据时序图

图2时序时间参数表

2)通过三段式状态机,来初始化以及给数据。

第一个状态机是时序进程,在时钟驱动下负责状态转换的过程,第二个状态机是组合进程,产生下一个状态的组合逻辑,描述状态转移规律,第三个状态机是同步时序进程,描述次状态寄存器的输出。

在状态机中,状态编码采用Gray编码,格雷码的相邻码元值间只有一位是不同的,LCD1602的驱动模块可分为以下几个状态:

3)通过循环读取某一“数组”,循环给LCD1602数据,以接口形式方便改变。

parameter[127:

0]line_rom1="wearestudent";

parameter[127:

0]line_rom2="HelloWorld*^_^*";

实验现象如下图所示:

7.3程序

见文件夹lcd1602_driver里面的工程文件lcd1602_driver.v

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2