博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Verilog设计流水灯(一)
阅读量:3914 次
发布时间:2019-05-23

本文共 2518 字,大约阅读时间需要 8 分钟。

今天刚忙完大挑的策划,又到了更新博客的时候了,为了方便各位发烧友对Verilog_FPGA应用的学习,今天我想写一篇关于流水灯设计的文章,虽然很简单,但是这也是FPGA设计基础的重中之重,模块化设计!

初始流水灯,很傻,很天真。 这是我学习Verilog数字系统设计时悟出的真理,看着流水灯很神秘,其实往深处学习,很简单,很简单。

话不多说,先上一个模块,FPGA Verilog设计的重中之重就是模块化设计了,理清输入输出端口,将其封装,可以省去很多麻烦。

通过设计,我们自然可以得到它的输入输出端口:

这里写图片描述

这里,我们需要给它一个输入时钟,还有一个复位键,以及计数用到的计时器,然后FPGA给我们返回一个四位的LED,这里我们默认选择有四个LED(六个,八个,同理),我们摸清了它的输入与输出端口,然后我们可以开始我们的Verilog数字系统设计了。

先附上Verilog代码:顶层模块

module water_led(     input clk,rst_n;     input[31:0] counters;  //这里的计数部分,我们可以选择其为寄存器,或者输入端口     output [3:0] led;     );endmodule

流水灯逻辑部分:

module run_led(     input clk,rst_n;     output [3:0] led;     );   reg [31:0] counters;   reg [3:0] state; always@(posedge clk or negedge rst_n) begin     if(!rst_n)  begin     counter<=0;     led<=4'b0000;     state<=4'b0000;     end     else  beign       case(state):           4'd0001:begin                        //第一个灯亮                led<=4'b0001;                if(counters<=24999_999)          //产生延时 通过改变counters的值,可以改变灯亮灭的速度                    counters<=counters+1;                else begin                    state<=4'b0010;                    counters<=0;                end           end           4'd0010:begin                       //第二个灯亮                led<=4'b0010;                if(counters<=24999_999)                    counters<=counters+1;                else begin                    state<=4'b0100;                    counters<=0;                end           end           4'd0100:begin                    //第三个灯亮                led<=4'b0100;                if(counters<=24999_999)                    counters<=counters+1;                else begin                    state<=4'b1000;                    counters<=0;                end           end           4'd1000:begin                    //第四个灯亮                led<=4'b10000;                if(counters<=24999_999)                    counters<=counters+1;                else begin                    state<=4'b0001;                    counters<=0;                end           end           defualt: state<=4'd0001;     end endendmodule

modelsim测试代码如下:

module run_led_tb();    reg clk,rst_n;    wire [3:0] led;    initial begin      clk=0;      forever #10 clk=~clk;     //产生一个50MHZ时钟    end    initial begin      rst_n=0;      #20  rst_n=1;          //  激励    end run_led u1(                //例化逻辑设计模块      .clk(clk),      .rst_n(rst_n),      .led(led));endmodule

通过改变我们要计数延时的counters,我们可以把流水灯设计成跑马灯,以及频率更慢的led指示灯。

其实,FPGA设计最难的部分还是在于输入输出端口的选择,逻辑设计很简单,FPGA处理数据很快。通过这篇文章的模块化设计思想,我们可以更清晰地设计出我们想要的数字电路。

你可能感兴趣的文章
结构型设计模式总结
查看>>
dotNET:怎样处理程序中的异常(实战篇)?
查看>>
What is 测试金字塔?
查看>>
api接口返回动态的json格式?我太难了,尝试一下 linq to json
查看>>
.Net Core HttpClient处理响应压缩
查看>>
十分钟搭建自己的私有NuGet服务器-BaGet
查看>>
efcore 新特性 SaveChanges Events
查看>>
龙芯3A5000初样顺利交付流片
查看>>
用了Dapper之后通篇还是SqlConnection,真的看不下去了
查看>>
ABP快速开发一个.NET Core电商平台
查看>>
[NewLife.Net]单机400万长连接压力测试
查看>>
使用Azure人脸API对图片进行人脸识别
查看>>
快醒醒,C# 9 中又来了一堆关键词 init,record,with
查看>>
【招聘(深圳)】轻岁 诚聘.NET Core开发
查看>>
await,async 我要把它翻个底朝天,这回你总该明白了吧
查看>>
.NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
查看>>
使用Jenkins来发布和代理.NetCore项目
查看>>
欢迎来到 C# 9.0(Welcome to C# 9.0)
查看>>
Dapr微服务应用开发系列1:环境配置
查看>>
使用 Visual Studio 2019 批量添加代码文件头
查看>>