美文网首页嵌入式各个大方向
二.EP2C8Q208 FPGA(循环点亮LED灯)

二.EP2C8Q208 FPGA(循环点亮LED灯)

作者: wit_yuan | 来源:发表于2017-12-06 13:45 被阅读0次

1 介绍

1.1 实现说明

使用FPGA循环点亮led灯,有2种方式,有计数,计时等。

1.2 硬件接口

按照上一节,我们需要添加晶振电路,作为整个系统的时钟来源。


时钟电路

2 软件实现

2.1 计时循环点亮1个LED灯

不做过多介绍,只需要了解基本的verilog语法即可。我贴出源代码led_module.v:

module led_module(
    clock,led0
);
input  clock;
output led0;

reg rValue = 0;
wire led0 = rValue;
reg [32:0] cnt = 32'd0;

always @(posedge clock)
begin
    if(cnt<32'd20000000) begin
        cnt <= cnt + 1'd1;
    end
    else
    begin
        cnt <= 1'd0;
        rValue <= rValue + 1'd1;
        if(rValue == 2) begin
            rValue <= 0;
        end
    end   
end
endmodule

引脚分配如下图所示:


引脚分配

其他如时钟灯和前面的章节描述相同。

该试验能验证的内容是led灯会亮一秒,灭一秒,一直循环下去。

2.2 计时循环点亮4个LED灯

这节使用顶层与底层设计思路,建立一个程序。
首先是引脚分配:


引脚分配

顶层程序led_module.v:

module led_module(
    clock,led 
);

input  clock;
output [3:0] led;

wire led0;
led0_module_bottom u0(
    .clock(clock),
    .led(led0)
); 


wire led1;
led1_module_bottom u1(
    .clock(clock),
    .led(led1)
); 

wire led2;
led2_module_bottom u2(
    .clock(clock),
    .led(led2)
); 

wire led3;
led3_module_bottom u3(
    .clock(clock),
    .led(led3)
); 
assign led = {led3,led2,led1,led0};
endmodule

其余是底层程序:
led0_bottom.v:

module led0_module_bottom(
    clock,led
);
input  clock;
output led;

reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;

always @(posedge clock)
begin
    if(cnt<32'd2000000) begin
        cnt <= cnt + 1'd1;
    end
    else
    begin
        cnt <= 1'd0;
        rValue <= rValue + 1'd1;
        if(rValue == 2) begin
            rValue <= 0;
        end
    end   
end

endmodule

led1_bottom.v:

module led1_module_bottom(
    clock,led
);
input  clock;
output led;

reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;

always @(posedge clock)
begin
    if(cnt<32'd20000000) begin
        cnt <= cnt + 1'd1;
    end
    else
    begin
        cnt <= 1'd0;
        rValue <= rValue + 1'd1;
        if(rValue == 2) begin
            rValue <= 0;
        end
    end   
end

endmodule

led2_bottom.v:

module led2_module_bottom(
    clock,led
);
input  clock;
output led;

reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;

always @(posedge clock)
begin
    if(cnt<32'd1000000) begin
        cnt <= cnt + 1'd1;
    end
    else
    begin
        cnt <= 1'd0;
        rValue <= rValue + 1'd1;
        if(rValue == 2) begin
            rValue <= 0;
        end
    end   
end

endmodule

led3_bottom.v:

module led3_module_bottom(
    clock,led
);
input  clock;
output led;

reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;

always @(posedge clock)
begin
    if(cnt<32'd5000000) begin
        cnt <= cnt + 1'd1;
    end
    else
    begin
        cnt <= 1'd0;
        rValue <= rValue + 1'd1;
        if(rValue == 2) begin
            rValue <= 0;
        end
    end   
end

endmodule

这个程序实现的是每一个led灯的闪烁都是按照各自设计的时间来的,从中,我们可以体会出fpga的并行设计的思想。

相关文章

网友评论

    本文标题:二.EP2C8Q208 FPGA(循环点亮LED灯)

    本文链接:https://www.haomeiwen.com/subject/htukixtx.html