FPGA XILINX SPARTAN6 ISE14.7 LED流水灯实验
文章目录
前言
实验室有块FPGA开发板:XILINX 黑金SPARTAN6 AX309
从4号开始看视频看书学习相关知识,也借了买了几本工具书。
今天正式编写第一个程序。
特此记录。
1 ISE安装调试遇到的问题
1.1 关于ISE的license无法导入的问题解决方法
https://www.cnblogs.com/btc1996/p/11010314.html
1.2 解决Xilinx_ISE 14.7在Win10下选择“open project”崩溃闪退的问题
https://blog.csdn.net/idevede/article/details/56024153
1.3 Syntax error near “£”
分号用的是中文的冒号而不是英文的冒号!
https://blog.csdn.net/xiao_du_/article/details/48178993
2 LED流水灯实验
2.1 理论简介
AX309开发板将IO经过一个电阻(限制电流)和LED串联接地,IO输出高电平点亮LED
对于50Mhz
的系统时钟,一个时钟周期是20ns
,那么表示一秒需要 50000000
个时钟周期,如果一个时钟周期计数器累加一次,那么计数器从0
到49999999
正好是50000000
个周期,就是1秒的时钟
而50000000d=10_1111_1010_1111_0000_1000_0000b
,所以只需要26位就能完整表示脉冲计数的范围
本实验每隔1秒,LED移位一次
2.2 Verilog程序设计
`timescale 1ns / 1ps
module LED_Test(
input sys_clk50M, // 系统时钟,50MHz
input rst_n, // 复位信号,低电平有效
output reg [3:0] led // 4位LED
);
// 流水灯间隔1s,总共需要50M,26b即可表示
parameter width = 26;
reg [width-1:0] cnt;
// 时钟信号上升沿或者复位信号下降沿触发
always @(posedge sys_clk50M or negedge rst_n)
begin
// 复位计数清零
if(!rst_n)
cnt <= 26'd0;
else
// 计数
if(cnt < 26'd50000000)
cnt <= cnt + 26'd1;
// 计数溢出清零
else
cnt <= 26'd0;
end
// 时钟信号上升沿或者复位信号下降沿触发
always @(posedge sys_clk50M or negedge rst_n)
begin
// 复位
if(!rst_n)
led <= 4'b0001;
else
// 每过1s移位一次
if(cnt == 26'd50000000)
led <= {led[2:0],led[3]};
else
led <= led;
end
endmodule
注释:
不同always
块是并行的,always
块内部是顺序执行的。
每次时钟信号上升沿或者复位信号下降沿来临,两个always
块都会同时触发。
一部分实现时钟信号上升沿计数,另一部分实现LED移位。
非阻塞赋值<=
,常用于时序逻辑。块结束后再完成赋值操作。
led <= {led[2:0],led[3]};
位拼接运算符{ }
,实现了LED状态的移位。
2.3 管脚信息分配
将用到的时钟、复位、LED与Verilog程序中的变量进行链接
NET "sys_clk50M" LOC = T8 | TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;
##
NET rst_n LOC = L3 | IOSTANDARD = "LVCMOS33"; ## reset pushbutton
##################################################################################
#LED Pin define
##################################################################################
NET led<0> LOC = P4 | IOSTANDARD = "LVCMOS33"; ## LED1
NET led<1> LOC = N5 | IOSTANDARD = "LVCMOS33"; ## LED2
NET led<2> LOC = P5 | IOSTANDARD = "LVCMOS33"; ## LED3
NET led<3> LOC = M6 | IOSTANDARD = "LVCMOS33"; ## LED4
最基本最简单的UCF文件编写方法:
NET “端口名称” LOC = 引脚编号 | IOSTANDARD = “电压” ;
举例说明见:
FPGA–ISE约束文件UCF语法举例说明
特别注意:
端口名称最好与Verilog程序中的变量名字完全一致,避免产生错误信息!!!
3 实验现象
无法上传视频,也没法向大家验证。
个人认为:确实是按1秒移位的~
总结
第44篇
从此篇开始,我将正式入坑FPGA。
也就只有学习才能让自己静下来了。
个人水平有限,有问题欢迎各位大神批评指正!