【verilog】1. 流水灯例程

news2024/9/21 12:31:05

文章目录

  • 前言
  • 一、定义概念 + 缩写
    • 1. verilog
  • 二、性质
  • 三、代码分解释
  • 四、完整代码
  • 参考文献


前言

数电课设


一、定义概念 + 缩写

1. verilog

  • Verilog 是一种以代码形式来描述数字系统和电路的硬件描述语言 (HDL)。它由 Gateway Design Automation 在 20 世纪 80年代中期开发,后来被Cadence Design Systems 收购。

二、性质

Verilog是一种硬件描述语言(HDL),用于描述和设计数字系统。它具有以下一些关键性质:

  1. 硬件并行性:Verilog能够描述并行硬件结构,这是它与许多传统的编程语言的主要区别。在Verilog中,多个操作可以同时发生,而不需要像在顺序执行的编程语言中那样等待前一个操作完成。

  2. 模块化:Verilog支持模块化设计,允许设计者将复杂的系统分解成较小的、可重用的模块。每个模块可以独立设计和测试,然后实例化到更大的系统中。

  3. 层次化:Verilog设计可以是层次化的,这意味着模块可以嵌套,即一个模块可以包含其他模块的实例。

  4. 并发和顺序建模:Verilog提供了并发(如always块和initial块)和顺序(如过程赋值语句和任务)建模的机制。

  5. 丰富的数据类型:Verilog提供了多种数据类型,包括线网类型(wire)、寄存器类型(reg)、参数(parameter)、整数(integer)、实数(real)、时间(time)等。

  6. 事件驱动和时钟驱动:Verilog的行为可以由事件(如信号的边沿)或时钟(通过always块)驱动。

  7. 时序控制:Verilog允许设计者精确地控制信号的时序,这对于设计同步数字电路至关重要。

  8. 可综合和仿真:Verilog代码可以用于两种主要的硬件设计流程:综合(将Verilog代码转换为门级网表)和仿真(在软件环境中测试Verilog代码的行为)。

  9. 可预测性:Verilog的设计和行为是可预测的,这使得设计者可以确信硬件在实际制造之前的行为。

  10. 广泛的工具支持:Verilog有着广泛的工具支持,包括综合工具、仿真工具、调试工具和验证工具。

  11. 标准化:Verilog是一种广泛接受的行业标准,由IEEE(电气和电子工程师协会)维护和更新。

  12. 可扩展性:Verilog允许设计者定义自己的数据类型和原语,以满足特定的设计需求。

这些性质使得Verilog成为设计复杂数字系统的强大工具,特别是在集成电路和FPGA设计领域。

三、代码分解释

  • 模块声明,端口,类似 C 的结构体
// 模块声明和端口
module lamp(  //文件名
    input clk,  //50MHz, 20ns周期
    input rst_n,  //复位按键,低电平
    output reg [7:0] led  //8个led,低电平亮
);  //端口声明最后一行没有逗号
  • 定义计数器
// 注释说明
// 程序功能说明
// 让8个led以每秒一次改变状态,循环32个不同的状态
// 需要产生一个周期1s,频率为1Hz的信号控制8个led的状态改变
// 由50MHz产生1Hz信号,需要设计计数器作为分频器,那么该计数器的模值是?
// 50000000Hz/1Hz=50000000,需要多少位二进制数来实现该模值计数器?

// 定义计数器和1Hz信号
reg [31:0] count;  //定义计数器位数为32位
reg clk_1hz;  //定义一个1Hz的输出信号
  • 分频器
// 分频器逻辑
// 编写分频代码,产生clk_1hz信号
always@(posedge clk or negedge rst_n)//clk上升沿,rst_n下降沿
begin
    if (!rst_n)  //当rst_n为低电平时复位
    begin
        count <= 32'd0;
        clk_1hz <= 1'b0;
    end
    else if (count < 32'd49999999)
    begin
        count <= count + 1'b1;
        clk_1hz <= 1'b0;
    end
    else  // count = 32'd49999999
    begin
        count <= 32'd0;  //返回到初始状态 0
        clk_1hz <= 1'b1;
    end
end
  • LED控制状态逻辑
// LED状态控制逻辑
// 前面产生了1hz的信号,下面用1hz的信号产生控制8个led的状态计数器
// 假设8个led有32种状态变化,需要设计一个模值为32的计数器
reg [4:0] cnt;  //定义一个5位的状态信号
always@(posedge clk_1hz or negedge rst_n)
begin
    if (!rst_n)
        cnt <= 5'd0;
    else
        cnt <= cnt + 1'b1;   //5位二进制加法计数器
        
    //用cnt状态控制8个led灯的显示状态
    case (cnt)  //cnt有32个状态,从0~31
        5'd0: led <= 8'b0111_1111; //实验板上led灯是低电平亮
        5'd1: led <= 8'b1011_1111; //
        5'd2: led <= 8'b1101_1111;
        5'd3: led <= 8'b1110_1111;
        5'd4: led <= 8'b1111_0111;
        5'd5: led <= 8'b1111_1011;
        5'd6: led <= 8'b1111_1101;
        5'd7: led <= 8'b1111_1110;
        5'd8: led <= 8'b1111_1110;
        5'd9: led <= 8'b1111_1101;
        5'd10:led <= 8'b1111_1011;
        5'd11:led <= 8'b1111_0111;
        5'd12:led <= 8'b1110_1111;
        5'd13:led <= 8'b1101_1111;
        5'd14:led <= 8'b1011_1111;
        5'd15:led <= 8'b0111_1111;
        5'd16:led <= 8'b0111_1110; //两边灯亮
        5'd17:led <= 8'b1011_1101;
        5'd18:led <= 8'b1101_1011;
        5'd19:led <= 8'b1110_0111;
        5'd20:led <= 8'b1101_1011;
        5'd21:led <= 8'b1011_1101;
        5'd22:led <= 8'b0111_1110;
        5'd23:led <= 8'b0011_1111; //从左向右依次点亮led
        5'd24:led <= 8'b0001_1111;
        5'd25:led <= 8'b0000_1111;
        5'd26:led <= 8'b0000_0111;
        5'd27:led <= 8'b0000_0011;
        5'd28:led <= 8'b0000_0001;
        5'd29:led <= 8'b0000_0000; //8个led灯全亮
        5'd30:led <= 8'b0101_0101; //间隔亮
        5'd31:led <= 8'b1111_1111; //8个led灯全灭 
    endcase
end
  • 结束模块
// 模块结束
endmodule

四、完整代码


// 模块声明和端口
module lamp(  //文件名
    input clk,  //50MHz, 20ns周期
    input rst_n,  //复位按键,低电平
    output reg [7:0] led  //8个led,低电平亮
);  //端口声明最后一行没有逗号

// 注释说明
// 程序功能说明
// 让8个led以每秒一次改变状态,循环32个不同的状态
// 需要产生一个周期1s,频率为1Hz的信号控制8个led的状态改变
// 由50MHz产生1Hz信号,需要设计计数器作为分频器,那么该计数器的模值是?
// 50000000Hz/1Hz=50000000,需要多少位二进制数来实现该模值计数器?

// 定义计数器和1Hz信号
reg [31:0] count;  //定义计数器位数为32位
reg clk_1hz;  //定义一个1Hz的输出信号


// 分频器逻辑
// 编写分频代码,产生clk_1hz信号
always@(posedge clk or negedge rst_n)//clk上升沿,rst_n下降沿
begin
    if (!rst_n)  //当rst_n为低电平时复位
    begin
        count <= 32'd0;
        clk_1hz <= 1'b0;
    end
    else if (count < 32'd49999999)
    begin
        count <= count + 1'b1;
        clk_1hz <= 1'b0;
    end
    else  // count = 32'd49999999
    begin
        count <= 32'd0;  //返回到初始状态 0
        clk_1hz <= 1'b1;
    end
end

// LED状态控制逻辑
// 前面产生了1hz的信号,下面用1hz的信号产生控制8个led的状态计数器
// 假设8个led有32种状态变化,需要设计一个模值为32的计数器
reg [4:0] cnt;  //定义一个5位的状态信号
always@(posedge clk_1hz or negedge rst_n)
begin
    if (!rst_n)
        cnt <= 5'd0;
    else
        cnt <= cnt + 1'b1;   //5位二进制加法计数器
        
    //用cnt状态控制8个led灯的显示状态
    case (cnt)  //cnt有32个状态,从0~31
        5'd0: led <= 8'b0111_1111; //实验板上led灯是低电平亮
        5'd1: led <= 8'b1011_1111; //
        5'd2: led <= 8'b1101_1111;
        5'd3: led <= 8'b1110_1111;
        5'd4: led <= 8'b1111_0111;
        5'd5: led <= 8'b1111_1011;
        5'd6: led <= 8'b1111_1101;
        5'd7: led <= 8'b1111_1110;
        5'd8: led <= 8'b1111_1110;
        5'd9: led <= 8'b1111_1101;
        5'd10:led <= 8'b1111_1011;
        5'd11:led <= 8'b1111_0111;
        5'd12:led <= 8'b1110_1111;
        5'd13:led <= 8'b1101_1111;
        5'd14:led <= 8'b1011_1111;
        5'd15:led <= 8'b0111_1111;
        5'd16:led <= 8'b0111_1110; //两边灯亮
        5'd17:led <= 8'b1011_1101;
        5'd18:led <= 8'b1101_1011;
        5'd19:led <= 8'b1110_0111;
        5'd20:led <= 8'b1101_1011;
        5'd21:led <= 8'b1011_1101;
        5'd22:led <= 8'b0111_1110;
        5'd23:led <= 8'b0011_1111; //从左向右依次点亮led
        5'd24:led <= 8'b0001_1111;
        5'd25:led <= 8'b0000_1111;
        5'd26:led <= 8'b0000_0111;
        5'd27:led <= 8'b0000_0011;
        5'd28:led <= 8'b0000_0001;
        5'd29:led <= 8'b0000_0000; //8个led灯全亮
        5'd30:led <= 8'b0101_0101; //间隔亮
        5'd31:led <= 8'b1111_1111; //8个led灯全灭 
    endcase
end

// 模块结束
endmodule
    
matlab代码块
c代码块

参考文献

[1]


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.06.

#include "mywidget.h"mywidget::mywidget(QWidget *parent): QMainWindow(parent) {/*---------------------窗口设置&#xff08;无边框&#xff09;----------------------*/this->setWindowFlag(Qt::FramelessWindowHint);//窗口大小this->resize(590,950)…

大数据之Flink(二)

4、部署模式 flink部署模式&#xff1a; 会话模式&#xff08;Session Mode&#xff09;单作业模式&#xff08;Per-Job Mode&#xff09;应用模式&#xff08;Application Mode&#xff09; 区别在于集群的生命周期以及资源的分配方式&#xff1b;以及应用的main方法到底在…

WireShark过滤器

文章目录 一、WireShark过滤器概念1. 捕获过滤器&#xff08;Capture Filters&#xff09;2. 显示过滤器&#xff08;Display Filters&#xff09;3. 捕获过滤器与显示过滤器的区别4. 过滤器语法结构实际应用场景 二、WireShark捕获数据包列表1. **No.&#xff08;序号&#xf…

vulhub ThinkPHP5 5.0.23远程代码执行漏洞

步骤一&#xff1a;.执行以下命令启动靶场环境并在浏览器访问 cd thinkphp/5.0.23-rcedocker-compose up -ddocker ps 步骤二&#xff1a;访问靶机环境 步骤三&#xff1a;/index.php?scaptcha 步骤四&#xff1a;利用HackBar _method__construct&filter[]system&me…

心理辅导新篇章:Spring Boot学生评估系统

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…

优化边缘设备上的大型语言模型(LLM)--tinychat

文章目录 一、项目启动1.背景&#xff1a;针对不同操作系统架构的4bit权重重排2.初始环境配置下载LLaMA2-7B-chat模型 3.项目启动项目结构说明评估不同优化技术可能遇到的bug以及措施1.macOS上部署 二、各种优化技术实现1.前置条件2.优化----循环展开3.优化----多线程4.优化---…

OpenCV结构分析与形状描述符(6)带统计的连通组件计算函数connectedComponentsWithStats()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 connectedComponentsWithStats 函数计算布尔图像的连通组件标记图像&#xff0c;并为每个标记产生统计信息。 该函数接受一个具有4或8连通性的二…

盘点4款可以免费帮你将语音转换成文字的工具

我们在寻找语音转文字的工具的时候&#xff0c;不能只考虑他是否免费&#xff0c;还需要关注这个工具的转换准确度&#xff0c;减少第二次修改的麻烦&#xff0c;以及它的转换速度&#xff0c;以便可以有效的提高我们工作效率。基于这些&#xff0c;我要给大家推荐几个既可以免…

2024Java基础总结+【Java数据结构】(2)

面向对象07&#xff1a;简单小结类与对象 面向对象08&#xff1a;封装详解 面向对象09&#xff1a;什么是继承 ctrlh看类的关系&#xff0c;所有的类都默认的或间接继承Object 面向对象10&#xff1a;Super详解 super注意点: super调用父类的构造方法&#xff0c;必须在构造方…

白小白为波司登新品创作歌曲《登峰之路》,穿越风雨守护前行者

随着天气渐凉&#xff0c;波司登品牌推出全新新品——轻薄羽绒叠变系列&#xff0c;作为波司登品牌的新品推荐官&#xff0c;歌手白小白为波司登创作并演唱《轻薄羽绒叠变》系列主题曲《登峰之路》。歌曲中&#xff0c;白小白以激昂澎湃&#xff0c;明快有力的旋律以及深情又充…

【Unity小技巧】物体遮挡轮廓描边效果

前言&#xff1a; 效果展示&#xff1a; 遮挡描边 Demo下载 所用插件 QuickOutline描边插件&#xff08;在Demo里&#xff09; 实现步骤 物体挂载Outline组件&#xff0c;做如下处理 Outline Mode&#xff08;描边模式&#xff09;&#xff1a;Outline Hidden(遮挡模式显示…

让中学生也能一下子认识5000年都无人能识的无穷大自然数

黄小宁 5000多年来数学一直未能证明存在>N一切数的标准无穷大自然数及其倒数&#xff0c;从而一直否定存在这类数&#xff0c;正如西医否定人体存在经络系统那样。 x轴各元点的坐标x变为的有序数对 ( x , y2 x)是平面点p的坐标&#xff0c;点p的全体是直线y2x。 x可变成一…

HOT100(八)动态规划

1、爬楼梯 ①动态规划 &#xff08;1&#xff09;时间复杂度 O(n) &#xff0c;空间复杂度 O(n)的做法 开辟一个长度为 n1 的状态数组f&#xff0c;f[i]表示走到第i个台阶的方案数。初始化f[0]1&#xff08;在台阶底部&#xff0c;不需要移动也视为一种方法&#xff09;,f[1…

HNU-2023电路与电子学-实验3

写在前面&#xff1a; 本次实验是完成cpu设计的剩余部分&#xff0c;整体难度比上一次要小&#xff0c;细心完成就能顺利通过全部测评 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能&#xff0c;设计 8 重 3-1 多路复用器。 3.分析模型机的功能…

Oracle再度发起开发人员调查,细节满满

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

GO学习笔记(4) strconv/time

目录 strconv包1、string与bool之间的转换2、string与int之间的转换 time包1、常用常量定义2、Now&#xff08;&#xff09;获取当前年月日时分秒3、Format&#xff08;&#xff09;时间格式化4、Parse&#xff08;&#xff09;/ ParseInLocation&#xff08;&#xff09;解析时…

anaconda启动jupyter notebook

1.在Windows搜索框搜索anaconda prompt点击打开 2.然后输入命令jupyter notebook 3.在这个页面编写你的程序

基于Java的宿舍报修管理系统的设计与实现(论文+源码)_kaic

基于Java的宿舍报修管理系统的设计与实现(论文源码)_kaic 摘  要 随着教育改革‎‏的不断‎‏深入&#xff0c;‎‏学校宿‎‏舍的管‎‏理体系‎‏也在不‎‏断地完‎‏善&#xff0c;校园后勤服务是学校管理的重要工作&#xff0c;学校提供优秀的后勤服务&#xff0c;能提…

【Jupyter Notebook】安装与使用

打开Anaconda Navigator点击"Install"(Launch安装前是Install)点击"Launch"点击"File"-"New"-"Notebook"​ 5.点击"Select"选择Python版本 6.输入测试代码并按"Enter+Shift"运行代码: 代码如下: …

C++万字解析类和对象(上)

1.类的定义 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 为了区分成员变量&…