可编程数字ASIC设计实验指导书.docx
《可编程数字ASIC设计实验指导书.docx》由会员分享,可在线阅读,更多相关《可编程数字ASIC设计实验指导书.docx(12页珍藏版)》请在冰豆网上搜索。
可编程数字ASIC设计实验指导书
长春建筑学院
《可编程数字ASIC设计》课程
实验指导书
电气信息学院
FPGA系列实验一——点亮LED
1.实验任务
点亮发光二极管。
通过这个实验,熟悉并掌握CPLD/FPGA开发软件QuartusII的使用方法和开发流程以及VerilogHDL的编程方法。
2.实验环境
硬件实验环境为FPGA实验开发系统。
软件实验环境为QuartusII13.0开发软件。
3.实验原理
FPGA器件同单片机一样,为用户提供了许多灵活的独立的输入/输出I/O口(单元)。
FPGA每个I/O口可以配置为输入、输出、双向、集电极开路和三态门等各种组态。
作为输出口时,FPGA的I/O口可以吸收最大为24mA的电流,可以直接驱动发光二极管LED等器件。
通过原理图可知如果要点亮这八个LED,所以只要正确分配并锁定引脚后,在相应的引脚上输出相应高电平“1”,就可实现点亮该发光二极管的功能。
开发板均采用输出“1”点亮LED的模式,以后就不再另作说明。
4.实验程序
(1)利用连续赋值assign语句来实现(文件名led.v)
moduleled1(led);//模块名led
output[7:
0]led;//定义输出端口
assignled=8'b10101010;
endmodule
(2)利用过程赋值语句来实现(文件名led1.v)
moduleled1(led);//模块名led1
output[7:
0]led;//定义输出端口
reg[7:
0]led;
always
begin
led=8'b10101010;
end
endmodule
5.实验步骤
(1)建立新工程项目:
打开QuartusII软件,进入集成开发环境,点击File→Newproject
wizard建立一个工程项目led。
(2)建立文本编辑文件:
点击File→New...,在该项目下新建VerilogHDL源程序文件led.v,输入试验程序中的源程序代码保存后选择工具栏中的
按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
(3)选择器件型号及引脚的其他设置:
选择所用的FPGA器件,以及进行一些配置。
选择配置器件EPCS4,设置不需要使用的IO功能为Asinputs,tri-stated。
点击两次ok,回到主界面。
(4)配置FPGA引脚:
在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上
按钮,配置led[0]---led[7]以及clk的引脚。
(5)编译工程项目:
在QuartusII主页面下,选择Processing→StartCompilation或点击工具栏上的
按钮启动编译,直到出现“FullCompilationReport”对话框,点击OK即可。
(6)波形仿真:
由于本次试验比较简单,波形仿真将在后面实验详细讲解。
(7)下载设计程序到目标FPGA。
6.实验现象
第一个实验终于完成了,看到实验板上的8个LED灯间隔点亮,是不是特有成就感!
只要动手,一切都这么简单!
让我们进行下面的实验吧!
以后的实验将会更精彩!
FPGA系列实验二——LED闪烁灯
1.实验任务
让实验板上的8个LED周期性的闪烁。
通过这个实验,熟悉并掌握采用计数与判断的方式来实现分频的VerilogHDL的编程方法以及QuartusII软件的使用方法和开发流程。
2.实验环境
硬件实验环境为FPGA实验开发系统。
软件实验环境为QuartusII13.0开发软件。
3.实验原理
开发套件板载50MHz的时钟源,假如我们直接把它输入到发光二极管LED,由于人眼的延迟性,我们将无法看到LED闪烁,认为它一直亮着。
如果我们期望看到闪烁灯,就需要将时钟源的频率降低后再输出。
本实验采用计数与判段的方式来实现降低时钟源的频率。
计数电路可用计数器实现,每来一个时钟脉冲CLK,计数器就加1,而每当判断出计数器达到某个数值时,把输出状态求反,就使得8个LED的亮灭反转一次,即:
周期性的输出高电平“1”和低电平“0”。
这样设计相当于把50MHz的时钟源分频后输出。
如果最终要使得LED1S闪烁一次,即输出1Hz的时钟脉冲,让计数器计到25000000便可以让LED亮0.5秒、灭0.5秒。
4.实验程序
moduleled1(clk,led);//模块名及端口参数
inputclk;//输入端口定义
output[7:
0]led;//输出端口定义
reg[7:
0]led;//输出端口定义为寄存器型
reg[25:
0]buffer;//中间变量buffer定义为寄存器型
always@(posedgeclk)
begin//顺序语句,到end止
buffer<=buffer+1;//计数器buffer按位加1
if(buffer==26'd25000000)//判别buffer中的数值为25000000时,
//做输出处理
begin
led<=~led;//led[0]-led[7]反转一次。
buffer<=0;
end
end
endmodule
5.实验步骤
(1)建立新工程项目:
打开QuartusII软件,进入集成开发环境,点击File→Newproject
wizard建立一个工程项目led1。
(2)建立文本编辑文件:
点击File→New...,在该项目下新建VerilogHDL源程序文件led1.v,输入试验程序中的源程序代码保存后选择工具栏中的
按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
(3)选择器件型号及引脚的其他设置:
选择所用的FPGA器件,以及进行一些配置。
选择配置器件EPCS4,设置不需要使用的IO功能为Asinputs,tri-stated。
点击两次ok,回到主界面。
(4)配置FPGA引脚:
在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上
按钮,配置led[0]---led[7]以及clk的引脚。
(5)编译工程项目:
在QuartusII主页面下,选择Processing→StartCompilation或点击工具栏上的
按钮启动编译,直到出现“FullCompilationReport”对话框,点击OK即可。
(6)波形仿真:
由于本次试验比较简单,波形仿真将在后面实验详细讲解。
(7)下载设计程序到目标FPGA。
6.实验现象
第二个实验完成了,看到实验板上8个LED灯周期性的闪烁,是不是觉
得这个实验比上个实验有意思呢?
回想一下我们通过这个实验学会了什么?
采用计数与判断的方式来实现分频的VerilogHDL的编程方法,你学会了没?
应该有那么一点点收获吧!
FPGA系列实验三——LED流水灯
1.实验任务
让实验板上的8个LED实现流水灯的功能。
通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VerilogHDL的编程方法以及移位运算符的使用。
2.实验环境
硬件实验环境为FPGA实验开发系统。
软件实验环境为QuartusII13.0开发软件。
3.实验原理
流水灯,顾名思义就是让LED象水一样的点亮。
如果把流水做慢动作播放,可以想象到其实就是移动,即:
把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。
同样,如果使得最左边的灯先亮;然后,通过移位,在其右侧的灯,由左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。
初始状态时,8个灯都不亮。
每来一个时钟脉冲CLK,计数器就加1。
每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。
FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。
而当8个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态,即:
灯都不亮。
然后,再一次流水即可。
如果是右移位,就出现向右流水的现象;反之,向左流水。
4.实验程序
moduleledwater(clk,led);//模块名及端口参数
output[7:
0]led;//输出端口定义
inputclk;//输入端口定义,50M时钟
reg[8:
0]led_out;//变量led_out定义为寄存器型
reg[8:
0]led_out1;//变量led_out1定义为寄存器型
reg[25:
0]buffer;//中间变量buffer定义为寄存器型
always@(posedgeclk)
begin
buffer=buffer+1;
if(buffer==26'd25000000)//判别buffer数值为25000000时,做输出处理
begin
led_out=led_out<<1;//led向左移位,空闲位自动添0补位
if(led_out==9'b000000000)
led_out=9'b111111111;
led_out1=~led_out;//取反输出
end
end
assignled=led_out1[7:
0];
endmodule
5.实验步骤
(1)建立新工程项目:
打开QuartusII软件,进入集成开发环境,点击File→Newprojectwizard建立一个工程项目ledwater。
(2)建立文本编辑文件:
点击File→New在该项目下新建VerilogHDL源程序文件ledwater.v,输入试验程序中的源程序代码保存后选择工具栏中的
按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
(3)选择器件型号及引脚的其他设置:
选择所用的FPGA器件,以及进行一些配置。
设置不需要使用的IO功能为Asinputs,tri-stated。
点击两次ok,回到主界面。
(4)配置FPGA引脚:
在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上
按钮,配置led[0]---led[7]以及clk的引脚。
(5)编译工程项目:
在QuartusII主页面下,选择Processing—StartCompilation或点击工具栏上的
按钮启动编译,直到出现“FullCompilationReport”对话框,点击OK即可。
(6)波形仿真:
由于本次试验比较简单,波形仿真将在后面实验详细讲解。
(7)下载设计程序到目标FPGA
6.实验现象
经过前两个实验的训练,第三个实验应该很轻松地就做完了吧!
看到实验板上LED实验了流水灯的功能,你是否掌握了移位运算符的使用,你可以试着自己编写其他花样的流水灯,比如左流水或其他花样的流水灯,这就要看你的想象力了。
FPGA系列实验四——LED跑马灯
1.实验任务
让实验板上的8个LED实现跑马灯的功能。
通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VerilogHDL的编程方法以及移位运算符的使用。
2.实验环境
硬件实验环境为FPGA实验开发系统。
软件实验环境为QuartusII13.0开发软件。
3.实验原理
从LED[0]到LED[7]依次点亮,第二个灯点亮时第一个熄灭,每个灯交换的时间为0.5S;看上去的效果就象一个亮点从LED[0]跑向LED[7],然后重复此循环,故命名跑马灯。
初始状态时,LED[0]亮,其余熄灭。
每来一个时钟脉冲CLK,计数器就加1。
每当判断出计数器中的数值达到25000000时,就会点亮LED[1],同时LED[0]熄灭,并进行移位。
这样,依次点亮所有的灯,就形成了跑马灯。
而当LED[7]点亮时,需要一个操作使得恢复为初始状态,即:
LED[0]亮,其余熄灭。
然后,再进行一次跑马灯,重复此循环。
如果是右移位,就出现向右跑马的现象;反之,向左跑马。
4.实验程序
moduleledwalk(led,clk);
inputclk;
output[7:
0]led;
reg[7:
0]led_out;
reg[25:
0]buffer;
always@(posedgeclk)
begin
buffer<=buffer+1'b1;
if(buffer==26'd25000000)
begin
led_out=led_out<<1;
if(led_out==8'b00000000)
led_out=8'b00000001;
end
end
assignled=led_out;
endmodule
5.实验步骤
(1)建立新工程项目:
打开QuartusII软件,进入集成开发环境,点击File→Newprojectwizard建立一个工程项目ledwalk。
(2)建立文本编辑文件:
点击File→New..在该项目下新建VerilogHDL源程序文件ledwalk.v,输入试验程序中的源程序代码保存后选择工具栏中的
按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
(3)选择器件型号及引脚的其他设置:
选择所用的FPGA器件,以及进行一些配置。
选择配置器件EPCS4,设置不需要使用的IO功能为Asinputs,tri-stated。
点击两次ok,回到主界面。
(4)配置FPGA引脚:
在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上
按钮,配置LED[0]---LED[7]以及clk的引脚。
(5)编译工程项目:
在QuartusII主页面下,选择Processing→StartCompilation或点击工具栏上的
按钮启动编译,直到出现“FullCompilationReport”对话框,点击OK即可。
(6)波形仿真:
由于本次试验比较简单,波形仿真将在后面实验详细讲解。
(7)下载设计程序到目标FPGA
6.实验现象
实验应该很轻松就成功了吧!
看到LED[0]到LED[7]依次点亮,移位运算符的使用应当非常熟练了吧!
你有没有想过用其他方式实现跑马灯的功能,比如用case语句。
下面给出一个用case语句实现的跑马灯程序供大家学习。
大家可以比较一下两钟方式实现跑马灯的资源占用情况。
FPGA系列实验五——LED花样彩灯
1.实验任务
让实验板上的8个LED实现花样彩灯的功能。
通过这个实验,进一步掌握采用计数器实现分频的VerilogHDL的编程方法以及case语句的使用。
2.实验环境
硬件实验环境为FPGA实验开发系统。
软件实验环境为QuartusII13.0开发软件。
3.实验原理
本次试验是对前几个实验的总结,让LED逐步实现闪烁—流水灯—闪烁—跑马灯—闪烁—对灯流水—闪烁,重复此循环即可实现彩灯显示功能。
本次实验程序采用case语句编写,程序比较通俗易懂,具体实现原理在前面实验都已详细讲述,本次试验将不再重复。
4.实验程序
moduleled_run(sys_clk,led);
inputsys_clk;
output[7:
0]led;
reg[7:
0]led;
reg[24:
0]count;
reg[4:
0]state;
wireclk;
always@(posedgesys_clk)
count<=count+1'b1;
assignclk=count[23];
always@(posedgeclk)
begin
case(state)
5'b00000:
led=8'b11111111;
5'b00001:
led=8'b00000000;
5'b00010:
led=8'b10000000;
5'b00011:
led=8'b11000000;
5'b00100:
led=8'b11100000;
5'b00101:
led=8'b11110000;
5'b00110:
led=8'b11111000;
5'b00111:
led=8'b11111100;
5'b01000:
led=8'b11111110;
5'b01001:
led=8'b11111111;
5'b01010:
led=8'b00000000;
5'b01011:
led=8'b11111111;
5'b01100:
led=8'b00000001;
5'b01101:
led=8'b00000010;
5'b01110:
led=8'b00000100;
5'b01111:
led=8'b00001000;
5'b10000:
led=8'b00010000;
5'b10001:
led=8'b00100000;
5'b10010:
led=8'b01000000;
5'b10011:
led=8'b10000000;
5'b10100:
led=8'b11111111;
5'b10101:
led=8'b00000000;
5'b10110:
led=8'b11111111;
5'b10111:
led=8'b10000001;
5'b11000:
led=8'b11000011;
5'b11001:
led=8'b11100111;
5'b11010:
led=8'b11111111;
5'b11011:
led=8'b00011000;
5'b11100:
led=8'b00111100;
5'b11101:
led=8'b01111110;
5'b11110:
led=8'b11111111;
5'b11111:
led=8'b00000000;
endcase
state=state+1;
end
endmodule
5.实验步骤
(1)建立新工程项目:
打开QuartusII软件,进入集成开发环境,点击File→Newprojectwizard建立一个工程项目led_run。
(2)建立文本编辑文件:
点击File→New..在该项目下新建VerilogHDL源程序文件led_run.v,输入试验程序中的源程序代码保存后选择工具栏中的
按钮启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
(3)选择器件型号及引脚的其他设置:
选择所用的FPGA器件,以及进行一些配置。
选择配置器件EPCS4,设置不需要使用的IO功能为Asinputs,tri-stated。
点击两次ok,回到主界面。
(4)配置FPGA引脚:
在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上
按钮,配置LED[0]---LED[7]以及clk的引脚。
(5)编译工程项目:
在QuartusII主页面下,选择Processing→StartCompilation或点击工具栏上的
按钮启动编译,直到出现“FullCompilationReport”对话框,点击OK即可。
(6)波形仿真:
由于本次试验比较简单,波形仿真将在后面实验详细讲解。
(7)下载设计程序.sof文件到目标FPGA,下载采用JTAG方式(由于配置芯片擦写次数有限,实验均采用JTAG下载方式)。
6.实验现象
实验是对前面几个实验的总结,应该很轻松就能完成。
实验成功将会看到LED逐步实现闪烁—流水灯—闪烁—跑马灯—闪烁—对灯流水—闪烁的循环显示,大家可以试着按照自己的想象编写程序实现其他花样彩灯。