FPGA学习笔记-点灯
点亮一个灯:
直接assign给输出信号赋值一个高电平然后与板子的led灯绑定管脚约束文件。
////////////////代码
`timescale 1ns / 1ps
module led_start(
output led
);
assign led=1;
endmodule
管脚约束文件

流水灯实现:
一个1s跳一次的流水灯,需要一个1s的计时器,然后利用多分支语句每隔一秒换一个灯。
////////////////case实现
`timescale 1ns / 1ps
module ledRE(
input sysclk,//时钟
input rst_n,//复位
output reg [3:0] led//4位宽输出的寄存器
);
parameter delay = 50_000_000;//50m板子晶振1S的时间
reg [31:0] cnt;//1S计时器
reg [1:0] data;//case当前状态
always@(posedge sysclk or negedge rst_n)begin //1s计时器
if (!rst_n)// 复位触发
cnt<=0;
else if (cnt == delay-1)//计时满1S
cnt<=0;
else
cnt<=cnt+1;
end
always@(posedge sysclk or negedge rst_n)begin//1s计数器
if(!rst_n)//复位同时赋初始值
data<=0;
else if(cnt == delay-1)//满1S的时候变量自增
data<=data+1;
else if(data == 3 && cnt == delay-1)
data<=0;
else
data<=data;
end
always@(*)begin//组合模块,*号代表所有用到的字符
case(data)
0:led=4'b1000;
1:led=4'b0100;
2:led=4'b0010;
3:led=4'b0001;
default:led=led;
endcase
end
endmodule
////////////////位拼接实现
`timescale 1ns / 1ps
module ledRE(
input sysclk,//时钟
input rst_n,//复位
output reg [3:0] led//4位宽输出的寄存器
);
parameter delay = 50_000_000;//50m板子晶振1S的时间
reg [31:0] cnt;//1S计时器
always@(posedge sysclk or negedge rst_n)begin //1s计时器
if (!rst_n)// 复位触发
cnt<=0;
else if (cnt == delay-1)//计时满1S
cnt<=0;
else
cnt<=cnt+1;
end
always@(posedge sysclk or negedge rst_n)begin//位拼接
if (!rst_n)
led<=4'b0001;
else if (cnt == delay-1)
led<={led[0],led[3:1]};//把低位提出来拼到高位
else
led<=led;
end
endmodule