欢迎光临散文网 会员登陆 & 注册

FPGA学习笔记-点灯

2023-06-29 16:48 作者:snow_404  | 我要投稿

点亮一个灯:

        直接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

FPGA学习笔记-点灯的评论 (共 条)

分享到微博请遵守国家法律