FPGA流水灯

简介: FPGA流水灯
FPGA流水灯Demo
说明

8个led灯依次点亮,形成流水效果

分析
框图

状态机FSM

Verilog代码
`timescale 1ns / 1ps
//
// Create Date: 2022/11/20 20:41:08
// Design Name: wkk
// Module Name: water_led
// Description:  running 8 water leds 
// Revision 0.01 - File Created
// Additional Comments:
//
module water_led(
    input    sys_clk,                    // 50M
    input    sys_rst_n,
    output   reg [7:0] led_out
);
parameter  SYS_CLK          = 50_000_000;
parameter  TIME_MAX_COUNT   = 500_000;
localparam  S0               = 8'b0000_0001;
localparam  S1               = 8'b0000_0010;
localparam  S2               = 8'b0000_0100;
localparam  S3               = 8'b0000_1000;
localparam  S4               = 8'b0001_0000;
localparam  S5               = 8'b0010_0000;
localparam  S6               = 8'b0100_0000;
localparam  S7               = 8'b1000_0000;
wire   time_en;
reg    [19:0]   time_count;
reg [7:0] curr_state;
reg [7:0] next_state;
assign time_en = (time_count == TIME_MAX_COUNT -1) ? (1'b1) :(1'b0);
// clock division
// create time_en signal
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        time_count <= 20'b0;
    else if(time_count == TIME_MAX_COUNT-1)
        time_count <= 20'b0;
    else
        time_count <= time_count +1'b1;
end
// update current state from next state
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        curr_state <= 8'b0;
    else
        curr_state <= next_state;
end
// update fsm next state
always @(*) begin
    if(!sys_rst_n)
        next_state <= 8'b0;
    else if(time_en)
        case(curr_state) 
        S0:      next_state <= S1;
        S1:      next_state <= S2;
        S2:      next_state <= S3;
        S3:      next_state <= S4;
        S4:      next_state <= S5;
        S5:      next_state <= S6;
        S6:      next_state <= S7;
        S7:      next_state <= S0;
        default: next_state <= S0;
        endcase
    else ;
end
// create output signal
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        led_out <= 8'b0;
    else
        led_out <= curr_state;
end
    
endmodule
testbench
`timescale 1ns / 1ns
// Create Date: 2022/11/20 21:15:13
// Design Name: wkk
// Module Name: water_led_tb
// Description: water_led testbench
// Revision 0.01 - File Created
// Additional Comments:
//
module water_led_tb;
reg                sys_clk;
reg                sys_rst_n;
wire       [7:0]   led_out;
water_led  #(
    .TIME_MAX_COUNT (2)
)u_water_led(
    .sys_clk     (sys_clk),
    .sys_rst_n   (sys_rst_n),
    .led_out     (led_out)
);
initial begin
    sys_clk   = 0;
    sys_rst_n = 0;
    #20 sys_rst_n = 1;
end
always begin 
    #5 sys_clk = !sys_clk;
end
initial begin
    # 2000;
    $stop;
end
endmodule

仿真结果

通用代码

// author : wkk
module WaterLed#(
    parameter   INPUT_CLK    =     27_000_000       ,   // input clk frequency
    parameter   LED_NUM      =     6                ,   // led quantity
    parameter   COUNT_WIDTH  =     36               ,   // time counter bit quantity
    parameter   COUNT_MAX    =     27_000_000       ,   // max count value
    // LED MODE 1 ? 0 -> on       
    parameter   LED_MODE     =     0                    // led control mode: if 1 --> led on  or  0 --> led on                     
)(
    input                                       clk                     ,
    input                                       rst_n                   ,
    output      [LED_NUM-1:0]                   led                     
);
reg     [LED_NUM-1: 0]     curr_state                   ;
reg     [LED_NUM-1: 0]     next_state                   ;
reg     [LED_NUM-1:0]      led_out                      ;
reg                        time_en                      ;
reg     [COUNT_WIDTH-1:0]  time_count                   ;
always  @(posedge   clk or negedge rst_n) begin 
    if( !rst_n ) begin
        time_count <= {COUNT_WIDTH{1'b0}};
        time_en    <=  1'b0;
    end
    else begin
        if( time_count == COUNT_MAX-1) begin
            time_count <= {COUNT_WIDTH{1'b0}};
            time_en    <= 1'b1;
        end 
        else begin
            time_en    <= 1'b0;
            time_count <= time_count + 1'b1;
        end
    end
end
always @(posedge clk or negedge rst_n) begin
    if( !rst_n ) 
          curr_state <=  {{(LED_NUM-1){1'b0}},1'b1};
    else
          curr_state <= next_state;
end
always @(*) begin
    if(!rst_n )
        next_state = {{(LED_NUM-1){1'b0}},1'b1};
    else begin
        if( time_en )  
            next_state = {curr_state[LED_NUM-2:0],curr_state[LED_NUM-1]};
        else
            next_state = curr_state;
    end
end
always @(posedge clk or negedge rst_n) begin
    if(!rst_n ) 
        led_out <= {LED_NUM{1'b0}};
    else begin
        if( LED_MODE == 1) 
               led_out <= curr_state;
        else
               led_out <= ~curr_state;
    end
end
assign led = led_out;
endmodule
相关文章
|
4月前
|
异构计算
FPGA新起点V1开发板(九)——流水灯
FPGA新起点V1开发板(九)——流水灯
|
异构计算 内存技术
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
276 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
|
异构计算
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
272 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
|
异构计算
FPGA学习之流水灯的简单设计
流水灯的简单设计 设计要求:低位点亮一个led,下一个周期,点亮两个led,逐次增加led的个数,全部点亮后的下一个周期,又点亮一个led 该实验需要两个模块,计数器模块和led控制模块 计数器模块:就是一个分频器,频率为2hz,系统时钟为50mhz,50_000_000/2=25_000_000,需要25位计数器。 Led控制模块:控制移位,到达全0时,led
1720 0
|
C语言 异构计算
【黑金原创教程】【FPGA那些事儿-驱动篇I 】【实验一】流水灯模块
实验一:流水灯模块 对于发展商而言,动土仪式无疑是最重要的任务。为此,流水灯实验作为低级建模II的动土仪式再适合不过了。废话少说,我们还是开始实验吧。 图1.1 实验一建模图。 如图1.1 所示,实验一有名为 led_funcmod的功能模块。
1087 0
|
6天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
20 1
|
27天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
42 4
|
27天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
存储 算法 数据处理
基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本系统在原有的8PSK调制解调基础上,新增了高斯信道与误码率统计模块,验证了不同SNR条件下的8PSK性能。VIVADO2019.2仿真结果显示,在SNR分别为30dB、15dB和10dB时,系统表现出不同的误码率和星座图分布。8PSK作为一种高效的相位调制技术,广泛应用于无线通信中。FPGA凭借其高度灵活性和并行处理能力,成为实现此类复杂算法的理想平台。系统RTL结构展示了各模块间的连接与协同工作。
49 16
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现16QAM调制解调通信系统,使用Verilog语言编写,包括信道模块、误码率统计模块。通过设置不同SNR值(如8dB、12dB、16dB),仿真测试系统的误码性能。项目提供了完整的RTL结构图及操作视频,便于理解和操作。核心程序实现了信号的生成、调制、信道传输、解调及误码统计等功能。
40 3

热门文章

最新文章