【FPGA学习笔记01】点灯之流水灯

具体见正点原子《达芬奇pro之FPGA开发指南V2.1》

1.硬件介绍:LED灯

又称发光二极管。工作电流小、抗冲击和抗震性能好,可靠性高,寿命长。有单向导电性,正向导通电压不同可导致发出颜色不同。
电流限制在3-20mA。
(1)常见用途:指示灯、液晶屏背光
(2)常见LED灯:
①直插型发光二极管(长的一端为阳极)
在这里插入图片描述
②贴片发光二极管(有标记的为阴极)
在这里插入图片描述
(3)原理图
在这里插入图片描述
①三极管起放大作用,其基极与FPGA的IO扣相连(电压只有1.5V)。
②电阻起限流作用。
③输出高电平,三极管导通,LED灯亮;输出低电平,三极管截止,LED灯灭。
再结合另一部分原理图可知:
在这里插入图片描述
LED0对应V9,LED1对应Y8, LED2对应Y7, LED3对应W7
则其约束文件的管脚部分为:

#IO 管脚约束
set_property PACKAGE_PIN R4 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS15 [get_ports sys_clk]
set_property PACKAGE_PIN U7 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS15 [get_ports sys_rst_n]
set_property PACKAGE_PIN V9 [get_ports {led[0]}]
set_property PACKAGE_PIN Y8 [get_ports {led[1]}]
set_property PACKAGE_PIN Y7 [get_ports {led[2]}]
set_property PACKAGE_PIN W7 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[3]}]

2.软件部分:主要代码

module flow_led(
	//input sign
	input 			sys_clk, //系统时钟信号
	input 			sys_rst_n,//系统复位时钟信号
	
	//output sign
	output reg[3:0] led		//LED输出
);

//reg define
reg [24:0] cnt;            //计数器

//***************************************
//**	main code
//***************************************


//0.5s计时
always @ (posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		cnt <= 25'd0;
	else if(cnt  < (25'd2500_0000 - 25'd1))
//	else if(cnt  < (25'd25 - 25'd1))
		cnt <= cnt + 25'd1;
	else
		cnt <= 25'd0;
end


//LED输出,4位,位移控制
always @ (posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		led <= 4'b0001;
	else if(cnt == 25'd2500_0000 - 25'd1)
//	else if(cnt == 25'd25 - 25'd1)
		led <= {led[2:0],led[3]};
	else
		led <= led;
end

endmodule

①初始化写在 if(!sys_rst_n) 部分。
②为了仿真要求,可以适当缩小cnt的值。
③对硬件的控制基本是位控制。

3.检测部分:仿真

仿真代码

`timescale 1ns/1ns

module tb_flow_led();

//parameter define
parameter CLK_PERIOD = 20; //时钟周期 20ns

//reg define
reg sys_clk;
reg sys_rst_n;

//wire define
wire [3:0] led;

//信号初始化
initial begin
	sys_clk <= 1'b0;
	sys_rst_n <= 1'b0;
	#200
	sys_rst_n <= 1'b1;
end

//产生时钟
always #(CLK_PERIOD/2) sys_clk = ~sys_clk; //每10ns一次翻转

//例化待测设计
flow_led u_flow_led(
	.sys_clk	(sys_clk),
	.sys_rst_n	(sys_rst_n),
	.led		(led)
);

endmodule

仿真结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值