FPGA.verilog基础 实现跑马灯

127 阅读1分钟

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