FPGA.verilog基础 实现跑马灯
// LED 模块
module LEDCtl(
input clk, // 时钟
input rst_n, // 复位参数
output [3:0] LED // 输出 参数 4位二进制,控制4个灯
);
////////////////////// 计数器 ////////////////////////////
// 声明变量:32位 ,用来计数!!!其实5千万 只需要26位就可以了!但多一点也无妨!
reg [31:0] cnt;
// always 代码块:时钟 上升沿 时执行
always@(posedge clk)
begin
// 如果 计数器变量 的值 等于 5000万
if(cnt == 32'd50_000_000)
cnt <= 32'd0; // 重置为0
else // 否则 ,在原来的数值基础上 +1
cnt <= cnt + 32'd1;
end
////////////////////// 控制灯 ////////////////////////////
// 创建临时变量 用来保存 4个 LED灯的 值
reg [3:0] LED_tmp = 4'b0001;
// 创建临时变量 保存 4个组合
reg [3:0] type_arr[3:0]; // [1100 , 0011 ,0000 ,1111 ]
// 3 2 1 0
// 创建变量 保存 当前显示组合的 下标
reg [1:0] ind = 2'd0;
// 初始化代码块:为 数组中的每个空间赋值
initial begin
type_arr[0] = 4'b0101;
type_arr[1] = 4'b0011;
type_arr[2] = 4'b1111;
type_arr[3] = 4'b0000;
end
// always 代码块:时钟 上升沿 时执行
always@(posedge clk)
begin
// 如果 计数器 等于 5000万,则 修改 灯的 明亮顺序
if(cnt == 32'd50_000_000) begin
// 如果 下标已经是3了,就重置0
if(ind==2'd3) begin
ind <= 0;
end
// 根据下标找出数组中 相应的 Led组合
LED_tmp <= type_arr[ind];
// 下标+1
ind <= ind + 2'd1;
end
end
// 将位移后的值 赋给 输出参数,影响 灯组的 明暗!!
assign LED = LED_tmp;
endmodule