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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值