本科生实训报告
实训课程 通信工程专业实训
学院名称 信息科学与技术学院
专业名称 通信工程
学生姓名 王城、张清静、谭政
学生学号 201313070202、03、05
指导教师 高嵩老师、刘同老师等
实训地点 6C601
实训成绩
二〇一六年十二月 二〇一六年十二月
填写说明
1、 适用于本科生所有的实训报告(印制实训报告册除外);
2、 专业填写为专业全称,有专业方向的用小括号标明;
3、 格式要求:
1 用A4纸双面打印(封面双面打印)或在A4大小纸上用蓝黑色水笔书写。
2 打印排版:正文用宋体小四号,1.5倍行距,页边距采取默认形式(上下2.54cm,左右2.54cm,页眉1.5cm,页脚1.75cm)。字符间距为默认值(缩放100%,间距:标准);页码用小五号字底端居中。
3 具体要求:
题目(二号黑体居中);
摘要(“摘要”二字用小二号黑体居中,隔行书写摘要的文字部分,小4号宋体);
关键词(隔行顶格书写“关键词”三字,提炼3-5个关键词,用分号隔开,小4号黑体);
正文部分采用三级标题;
第1章 ××(小二号黑体居中,段前0.5行)
1.1 ×××××小三号黑体×××××(段前、段后0.5行)
1.1.1小四号黑体(段前、段后0.5行)
参考文献(黑体小二号居中,段前0.5行),参考文献用五号宋体,参照《参考文献著录规则(GB/T 7714-2005)》。
按键控制LED灯的流动方向
摘要
FPGA(Field-Programmable Gate ),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
关键词:FPGA;LED灯;流动方向控制
试验芯片:
仿真工具:ISE Design Suite 14.7, Modelsim SE 10.1c
点亮LED灯,控制LED灯的流动,是用按键控制LED灯流动的方向。经过问题分析使用不同模块实现不同的功能。分模块实现的有点:每个的模块的功能尽量的单一化,使模块的复用性提高,方便其他模块的复用。
时钟分频模块:FPGA时钟分频即对FPGA的系统时钟根据自己所 需进行频率处理,使之达到原来的1/N倍频率,使流水灯的流动速度达到肉眼可见。
按键消抖模块:在机械按键的按下和松开时,都会产生抖动,为了保证系统能正确识别按键的按下和松开,就必须对按键的抖动进行处理。
LED 灯流水作业模块:具体控制 LED 灯的流动方向。
顶层模块:包含 时钟分频模块、按键消抖模块、LED灯流水作业模块、引脚绑定。
module freq(
input clk,
input rest_n,
output reg clk_slow
);
reg [31:0]counter;
always@ (posedge clk or negedge rest_n)
begin
if (!rest_n)
begin
counter <= 0;
clk_slow <= 0;
end
else
begin
if(counter < 5000000) // 0.1s翻转一次,周期0.2m 50M * 8 / 1000 = 5M
counter <= counter + 1;
else
begin
counter<=0;
clk_slow <= ~clk_slow;
end
end
end
module KEY_button(
input clk,
input rest_n,
input key_in,
output reg key_out
);
reg [1:0]state;
reg [31:0]cnt;
reg [31:0]temp;
always@(posedge clk or negedge rest_n)
begin
if(!rest_n)
cnt<=0;
else
cnt<=cnt+1;
end
always@(posedge clk or negedge rest_n )
begin
if(!rest_n)begin
key_out<=1;
state<=0;
temp<=0;
end
else begin
case(state)
0:begin
if(key_in==0) begin//刚刚按下
temp<=cnt;//按下时记录cnt值
state<=1;
end
end
1:begin
if(cnt-temp>400000)//按下有效,当cnt和当时按下的temp的差为 400000=(50Mhz* 1/8 8ms )
begin
if(key_in==0)begin
key_out<=0;
state<=2;
end
else begin
state<=0;
end
end
end
2:begin
if(key_in==1) begin//刚刚抬起
state<=3;
temp<=cnt;
end
end
3:begin
if(cnt-temp>400000) begin//抬起有效
if(key_in==1) begin
key_out<=1;
state<=0;
end
else begin
state<=2;
end
end
end
endcase
end
end
endmodule
module led(
input clk_slow,
input rest_n,
input key_direct,
output reg [3:0] gpio_led
);
reg flag;
always@(posedge key_direct or negedge rest_n)
begin
if (!rest_n)
flag<=0;
else
flag<=~flag;
end
reg [1:0]state;
always@ (posedge clk_slow or negedge rest_n)
begin
if (!rest_n)
begin
gpio_led <= 4'b0000;
state <= 0;
end
else if(!flag) begin
case(state)
0:begin
gpio_led <= 4'b1000;
state <= 1;
end
1:begin
gpio_led <= 4'b0100;
state <= 2;
end
2:begin
gpio_led <= 4'b0010;
state <= 3;
end
3:begin
gpio_led <= 4'b0001;
state <= 0;
end
default: begin
state <= 0;
end
endcase
end
else begin
case(state)
0:begin
gpio_led <= 4'b1000;
state <= 3;
end
1:begin
gpio_led <= 4'b0100;
state <= 0;
end
2:begin
gpio_led <= 4'b0010;
state <= 1;
end
3:begin
gpio_led <= 4'b0001;
state <= 2;
end
default: begin
state <= 0;
end
endcase
end
end
endmodule
module TOP_LED(
input clk,
input key_direct,
input rest_n,
output wire [3:0]gpio_led
);
wire key_out;
//---------------------
//时钟分频器:产生一秒的时钟
//---------------------
freq freq_inst (
.clk(clk),
.rest_n(rest_n),
.clk_slow(clk_slow)
);
//---------------------------------------------------------------------------------------
//按键消抖:控制流水灯方向的 按键进行消抖处理
//在机械按键的按下和松开时,都会产生抖动,为了保证系统能正确识别按键的按下和松开,就必须对按键的抖动进行处理。
//---------------------------------------------------------------------------------------
KEY_button key_button (
.clk(clk),
.rest_n(rest_n),
.key_in(key_direct),
.key_out(key_out)
);
//-------------------------
//流水灯模块
//-------------------------
led led_inst (
.clk_slow(clk_slow),
.rest_n(rest_n),
.key_direct(key_out),
.gpio_led(gpio_led)
);
Endmodule
NET "clk" LOC = P24;
NET "rest_n" LOC = P94;
NET "key_direct" LOC = P97;
NET "gpio_led[0]" LOC = P92;
NET "gpio_led[1]" LOC = P87;
NET "gpio_led[2]" LOC = P55;
NET "gpio_led[3]" LOC = P59;
学生实训 心得 | 在学习FPGA时,遇到的问题有许多,譬如,写代码时的警告,特别是一些不能忽视的警告,每次遇到时,总是还要检查一会儿才能改过来,或者有的警告已经出现了几次,但是就是解决不掉。每次在学一个模块时,只要是看懂了,它的一些重点就没有及时的记录在本子上,只有个别的想起来时,才会做笔记。每做完一个模块,没有及时记录下自己从这个模块中学到了什么。上面的不足,都是在写模块的过程中,自己逐渐暴露出来的。我很庆幸自己的一些问题能及时的被发现,避免类似的事情再次发生。像遇到警告时,都要记录下来,通过改正后,要注释,写下警告的原因,定期看一下。每次写模块的时候,都要记下重点知识,即使是自己懂得的,好记性都是比不过烂笔头的。关于以上的总结,我相信在以后的学习中一定会对自己有莫大的帮助,它会时刻警醒自己,在以前的学习中,自己有哪些不足,以后千万不能再去犯同样的错误,不断地纠正,不断地进步,相信自己一定会学好FPGA的。 学 生(签 名): 年 月 日 |
指导 教师 评语 | 成 绩 评 定: 指 导 教 师(签 名): 年 月 日 |
本文来源:https://www.2haoxitong.net/k/doc/8c63be611611cc7931b765ce05087632311274dc.html
文档为doc格式