欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FPGA XILINX SPARTAN6 ISE14.7 LED流水灯实验

程序员文章站 2022-03-30 13:49:55
...


前言

实验室有块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个时钟周期,如果一个时钟周期计数器累加一次,那么计数器从049999999正好是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。
也就只有学习才能让自己静下来了。

个人水平有限,有问题欢迎各位大神批评指正!