【FPGA】译码器、计数器及数码管显示

news2024/11/25 21:35:07

写在前面
万万没想到最后去了FPGA岗位,但是FPGA只在研一学过,确实忘得差不多了,因此从头把东西过亿边
这是某本书上的第一章节,感觉写的还是挺不错的,大概看了一下让我回想起很多知识,个人感觉比较适合学习了Verilog语法和数电之后上板的同学

1. 原理介绍

1.1 数码管

数码管按段分可分为七段数码管八段数码管,区别就是八段数码管多了个小数点
在这里插入图片描述
常见的数码管有两种:共阴数码管共阳数码管
共阴数码管就是高电平亮,低电平灭;共阳数码管就是低电平亮,高电平灭。

1.2 译码器

七段数码管译码器的结构图如下,4个输入变量能够组合成十六进制数字0-F,那么相应的输出就可以通过七个输出变量,表示成数字,从而达到译码的效果。
在这里插入图片描述
这里译码器有两种写法,一种比较复杂,就是通过对应的真值表或者卡诺图写出h的逻辑表达式,写起来比较繁琐,就直接放代码,通过逻辑门(assign赋值语句)实现译码器

assign h[6] = (~b[3] & ~b[2] & ~b[1]) | (~b[3] & b[2] & b[1] & b[0]) | (b[3] & b[2] & ~b[1] & ~b[0]);
assign h[5] = (~b[3] & ~b[2] & ~b[0]) | (~b[3] & ~b[2] & b[1]) | (~b[3] & b[1] & ~b[0]) |(b[3] & b[2] & ~b[1] & b[0]);
assign h[4] = (~b[3] & b[0]) | (~b[3] & b[2] & ~b[1]) | (b[3] & ~b[2] & ~b[1] & b[0]);
assign h[3] = (~b[2] & ~b[1] & b[0]) | (~b[3] & b[2] & ~b[1] & ~b[0]) | (b[2] & b[1] & b[0] ) | (b[3] & ~b[2] &b[1] & ~b[0]);
assign h[2] = (~b[3] & ~b[2] & b[1] & ~b[0]) | (b[3] & b[2] & ~b[1] & ~b[0]) | (b[3] & b[2] & b[1]);
assign h[1] = (~b[3] & b[2] & ~b[1] & b[0]) | (& b[2] & b[1] & ~b[0]) | (b[3] & b[2] & ~b[0]) | (b[3] & b[1] & b[0]);
assign h[0] = (~b[3] & ~b[2] & ~b[1] & b[0]) | (~b[3] & b[2] & ~b[1] & ~b[0]) | (b[3] & b[2] & ~b[1] & b[0] | b[3] & ~b[2] & b[1] & b[0]);

当然,这样不仅要推导,写起来就很麻烦
所以还可以用case条件语句实现

case (b)
    4`b0000: h = 7`b1000000;
    4`b0001: h = 7`b1111001;
    4`b0010: h = 7`b0100100;
    4`b0011: h = 7`b0110000;
    4`b0100: h = 7`b0011001;
    4`b0101: h = 7`b0010010;
    4`b0110: h = 7`b0000010;
    4`b0111: h = 7`b1111000;
    4`b1000: h = 7`b0000000;
    4`b1001: h = 7`b0011000;
    4`b1010: h = 7`b0001000;
    4`b1011: h = 7`b0000011;
    4`b1100: h = 7`b1000110;
    4`b1101: h = 7`b0100001;
    4`b1110: h = 7`b1000110;
    4`b1111: h = 7`b1001110;
endcase

1.3 D触发器

D触发器的特性方程Qn+1 = D,Qn+1为次态,D为输入信号,都是数电上的东西,Verliog HDL代码为:

module dff(
    input clk,
    intpu d,
    output reg q
);

always @(posedge clk)
    q <= d;
endmudle;

而通常会用到复位信号来设定电路的起始值或者做清楚动作,因此D触发器根据复位的不同分为两种:异步复位D触发器和同步复位D触发器

异步复位D触发器:
“异步”指的是和工作时钟不同步的意思,即寄存器的复位不关心时钟的有效沿来不来,只要检测到复位信号有效,就立即执行复位操作。

module DFF_async_rst(
    input clk,
    input rst_n,
    intpu d,
    output reg q
);

always @(posedge clk,negedge rst_n)
    if(~rst_n)            //复位信号rst_n的优先级比时钟信号clk高
        q <= 1'b0;
    else
        q <= d;
endmudle;

同步复位D触发器
“同步”是和工作时钟同步的意思,即复位信号只有在时钟的有效沿到来时,才能有效,否则无法完成复位任务。

module DFF_async_rst(
    input clk,
    input rst_n,
    intpu d,
    output reg q
);

always @(posedge clk)     //always语句只有一个触发条件
    if(~rst_n)            //复位信号rst_n需要在clk的上升沿触发下才能起作用
                          //当rst_n=0,并且clk上升沿到来时,Q才会被清零
        q <= 1'b0;
    else
        q <= d;
endmudle;

1.4 寄存器

寄存器是数字系统中用来存储二进制数据的逻辑部件。1个触发器可以存储一位二进制数据,存储n位二进制数据的寄存器需要用n个触发器组成。

当然,上述说法是表现在硬件上,在代码方便只是定义了输入输出的位宽:

module reg4bits(
    input clk,
    input rst_n,
    input en;
    intpu [3:0] d,
    output reg [3:0] q
);

always @(posedge clk,negedge rst_n)
    if(~rst_n)         
        q <= 4'b0000;
    else if(en)             //增加了使能端
        q <= d;
    else                    
        q <= q;
endmudle;

1.5 计数器

计数器不仅可以用于对脉冲进行计数,还可用于分频、定时、产生节拍脉冲以及其他时序信号。

同步二进制加(减)计数器

module counter_up(
    input        clk,
    input        rst_n,
    input        en,
    output  reg [3:0] q
);

always @(posedge clk or negedge rst_n)
begin
    if(~rst_n)
        q <= 4'b0000;             //复位,计数清零
    else if(en)                   //计数器使能,开始计数
        q <= q + 1'b1;            //加计数
      //q <= q - 1'b1;            //减计数,原理都是一样的
    else                          //计数器未使能,计数器保持不变
        q <= q;
end
endmodule

模m计数器
计数器运行时总是从某个起始状态开始,以此经过所有不重复的状态后完成一次循环。把一次循环所包含的状态数称为计数器的模,用M表示。

module counter_m #(
    parameter n = 4
    parameter m = 16
)(
    input             clk,
    input             rst_n;
    input             en;
    output reg [3:0]  cnt;           //计数器计数值
    output            carry_out;     //计数器进位输出
);

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)              //复位,计数值清零
        cnt <= 4'b0000;
    else if(en)             //计数器使能端,开始计数
    begin             
        if (cnt == m-1)     //计数值达到m-1,计数值清零
            cnt <= 4'b0000;
        else
            cnt <= cnt + 1'b1;
    end
    else 
        cnt <= cnt;
end
assign carry_out = (cnt == m-1);   //计数值达到m-1,计数器进位输出1
endmodule

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

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

相关文章

《effective java》中关于解决构造函数/方法签名包含大量参数的解决方法

针对构造方法 重叠构造器模式 重叠构造器模式是一种编程中的反模式&#xff0c;指的是一个类有多个构造函数&#xff0c;每个构造函数都有不同数量的参数&#xff0c;从而可以根据不同的情况创建对象。这种方式会导致代码可读性和可维护性降低&#xff0c;因为构造函数过多&…

echarts柱状图数据太多设置滚动条

当你的项目中因数据量太大&#xff0c;导致柱状图数据全部叠在一起不便于看的时候&#xff0c;你们是怎么处理的&#xff1f; 大部分同学可能第一想法就是裁剪一部分数据&#xff0c;仅展示页面最大限度能够展示的数据&#xff0c;这确实是一个好办法&#xff0c;简单快速。但…

【分布式】分布式存储架构

文章目录 一、集中存储结构二、分布式存储2.1 、分布式存储的兴起2.2 、分布式存储的重要性2.3 、分布式存储的种类和比较 三、分布式理论浅析3.1 、一致性和可用性3.2 、数据分布哈希分布&#xff08; Swift &#xff09;顺序分布&#xff08; Bigtable &#xff09;CRUSH 分布…

模版方法模式在 JDK 及 spring 源码中的引用

模版方法模式 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 更多有关于模版方法模式的介绍详见&#xff1a;https://refactoringguru.cn/design-patterns/template-method 模版…

【4】tf实现神经网络模型

1 M-P神经元与神经网络前向传输 1.1 训练单个神经元 一个含有两个输入的神经元&#xff0c;指定一个输入x1x21,期望y能输出0.3。要求不断的输入x1x21,然后不断的训练权重w与偏置b值&#xff0c;训练一万次后&#xff0c;再次输入x1与x2输出y的值是否为0.3 # 导入TensorFlow库…

Linux 进程的睡眠和唤醒详解

概要 在Linux中&#xff0c;仅等待CPU时间的进程称为就绪进程&#xff0c;它们被放置在一个运行队列中&#xff0c;一个就绪进程的状 态标志位为 TASK_RUNNING。一旦一个运行中的进程时间片用完&#xff0c; Linux 内核的调度器会剥夺这个进程对CPU的控制权&#xff0c;并且从…

QGIS实现tiff影像栅格数据切片教程

实现栅格切片的方式有很多种,geoserver可以,qgis可以。自己写代码也可以,方式非常多。这篇文章介绍一下如何使用QGIS实现栅格切片。 首先我们要去下载一个qgis软件。下载地址如下: Welcome to the QGIS project! 随后我们打开软件,然后把要切片的栅格数据(tiff文件或者…

【Python 随练】逆序打印数字

题目&#xff1a; 给一个不多于 5 位的正整数&#xff0c;要求&#xff1a; 一、求它是几位数&#xff0c; 二、逆序打印出各位数字。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个关于正整数的问题。根据题目要求&#xff0c;我们需要判断给定的正整数是几位数…

你的仓库VS别人家的仓库,有什么不同?

导读&#xff1a; 近年来&#xff0c;随着新技术的蓬勃发展&#xff0c;企业的仓储管理水平大大提高&#xff0c;PDA、RFID、AGV、立体仓库、智能分拣线等各项新技术的应用层出不穷。然而&#xff0c;着眼于制造型企业&#xff0c;却发现仍有许多仓库处在比较原始、传统、粗放…

[译] DeepSpeed:所有人都能用的超大规模模型训练工具

我们于今年 2 月份发布了 DeepSpeed。这是一个开源深度学习训练优化库&#xff0c;其中包含的一个新的显存优化技术—— ZeRO&#xff08;零冗余优化器&#xff09;&#xff0c;通过扩大规模&#xff0c;提升速度&#xff0c;控制成本&#xff0c;提升可用性&#xff0c;极大地…

如何绘制甘特图?这个软件来帮你

最好用的甘特图软件是什么&#xff1f;先看效果&#xff0c;再放教程&#xff1a; 这是大家用的比较多的excel做出的甘特图&#xff1a; 这是我做的动态甘特图&#xff1a; 两种方法&#xff0c;分享给大家&#xff0c;按需选择即可。 第一种&#xff1a;用Excel制作甘特图 用…

nx安装cuda与cudnn

本文参考 Jetson xavier nx 安装CUDA10.2&#xff0c;和cudnn8.0_jetson安装cuda_三羊木木的博客-CSDN博客 NX安装cuda和cudnn_nx cuda_viatea的博客-CSDN博客 进入nx系统后&#xff0c;输入 sudo apt-get update 更新源 目录 1 cuda 2 cudnn 1 cuda sudo apt-get ins…

如何注册GitHub账号

一、注册GitHub账号 1、浏览器URL中输入地址: https://github.com/ 2、跳转至GitHub官网 3、点击右上角sign up按钮 4、填写注册信息 这个大意是产品更新时消息会通过邮箱发给你&#xff0c;根据需求选择y or n 5、验证账户 有的小伙伴会出现错误信息 Unable to verify you…

考研算法28天:优化版插入排序(折半插入排序)【二分,插入排序】

算法介绍 算法介绍就是说我们原先写的插入排序的这段代码 for(int i1;i<n;i){//开始向前遍历&#xff0c;如果发现前面的元素比//x大的话&#xff0c;就将前面的元素放到x的后面int x q[i],ji;while( j && q[j-1]>x ){q[j] q[j-1];j--;}q[j] x;}我们里面那层…

Redis_6.2.12下载及安装(CentOS7)

文章目录 Redis安装-CentOS71、下载地址2、下载安装流程2.1 安装依赖2.2 官网下载tar包2.3 进入解压目录并编译2.4 启动Redis服务2.5 全局使用redis-cli、redis-server2.6 防火墙开启6379端口查看防火墙状态以及启动、关闭配置firewalld-cmd开启防火墙端口 3、设置开机自动启动…

SpringBoot集成百度人脸识别

SpringBoot集成百度人脸识别 1、概述2、账号申请账号登录注册创建应用 3、抽取模板工具AipFacePropertiesAipFaceTemplateapplication.yml 4、测试 ​ 人脸识别&#xff08;Face Recognition&#xff09;基于图像或视频中的人脸检测、分析和比对技术&#xff0c;提供对您已获授…

如何使用 SpringBoot 创建 RESTful API

如何使用 SpringBoot 创建 RESTful API SpringBoot是一个流行的Java框架&#xff0c;它可以帮助我们快速构建应用程序。其中&#xff0c;创建RESTful API是SpringBoot的常见用例之一。在本文中&#xff0c;我们将介绍如何使用SpringBoot创建RESTful API。 什么是RESTful API …

不同业务场景、不同数据类型,对应亚马逊云科技不同数据库服务

小小的改变&#xff0c;标志一个新时代的全面开启&#xff0c;一个数据库的云原生时代。前不久&#xff0c;Gartner公布了一组数据&#xff0c;引起了不小的讨论度。在2022年全球数据库管理系统的市场份额排名中&#xff0c;作为纯云厂商的亚马逊云科技&#xff0c;超越了老牌传…

电脑如何录屏?3个方法教您win10电脑怎么录屏!

案例&#xff1a;有时手机录屏满足不了我的录制需求&#xff0c;我需要在电脑上录屏&#xff0c;但我对电脑不是特别熟悉&#xff0c;不知道如何在电脑上录屏。 很多小伙伴想在电脑上录制视频&#xff0c;但又不知道如何操作。win10电脑录屏怎么录&#xff1f;有没有简单且详细…

趋势分享 | 多云时代数据安全面临的挑战

IT 和数据管理研究和咨询公司 EMA&#xff08;Enterprise Management Associates&#xff09;早前发布的一份《多云环境下的数据安全》&#xff08;Data Security in a Multi-Cloud World&#xff09;研究报告&#xff0c;调查了来自十个以上不同行业垂直领域、公司规模在 500 …