【FPGA】Verilog:组合电路 | 3—8译码器 | 编码器 | 74LS148

2023-05-16

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载

示例:编码/译码器的应用

 

  • 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 
  • 配置方式:USB-JTAG/SPI Flash
  • 高达100MHz 的内部时钟速度 
  • 存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A)
  • 通用IO:Switch :x8LED:x16Button:x5DIP:x8   通用扩展IO:32pin
  • 音视频/显示: 7段数码管:x8 VGA视频输出接口 Audio音频接口 
  • 通信接口:UART:USB转UART   Bluetooth:蓝牙模块 
  • 模拟接口: DAC:8-bit分辨率   XADC:2路12bit 1Msps ADC

目录

Ⅰ. 前置知识

0x00 3-8译码器74LS138的工作原理

0x01 优先编码器74148的工作原理

Ⅱ. Verilog实现

0x00 优先编码器74LS148

0x01 3—8译码器

0x02 结果数据


Ⅰ. 前置知识

0x00 3-8译码器74LS138的工作原理

利用Vivado提供的IP包(如下图所示)

也可直接(见下列代码)搭建74LS138功能验证电路。

(1)当选通端e1为高电平,另两个选通端e2和e3为低电平时,芯片使能。将地址端(a2、a1、a0)的二进制编码在y0至y7对应的输出端以低电平译出。比如:a2a1a0=110时,则y6输出低电平信号。

(2)利用 e1、e2和e3可方便的级联扩展成16线译码器、32线译码器。

        (3)若将选通端中的一个作为数据输入端时,74LS138还可用作数据分配器

 测试74LS138逻辑关系接线图

用verilog编程实现译码功能,参考代码如下。参考程序中使能信号需要自行补全。 

module converter(DB,SEG); 
    input[2:0]  DB; 
    output[7:0]  SEG; 
    reg[7:0]  SEG; 
    always  @(DB)     
    begin 
   	case(DB) 
   	4'b0000:  SEG<=8'b11111110; 
    	4'b0001:  SEG<=8’b11111101; 
   	4'b0010:  SEG<=8’b11111011; 
   	4'b0011:  SEG<=8’b11110111; 
   	4'b0100:  SEG<=8’b11101111; 
   	4'b0101:  SEG<=8’b11011111; 
   	4'b0110:  SEG<=8’b10111111; 
  	    4'b0111:  SEG<=8’b01111111; 
 	 default:  SEG<=8'b11111111; 
        endcase 
   end 
endmodule 

0x01 优先编码器74148的工作原理

在优先编码器电路中,允许同时输入两个以上编码信号。

不过在设计优先编码器时,已经将所有的输入信号按优先顺序排了队。在同时存在两个或两个以上输入信号时,优先编码器只按优先级高的输入信号编码,优先级低的信号则不起作用。

74148是一个8-3线优先级编码器。74148优先编码器为16脚的集成芯片,除电源脚 VCC(16)和GND(8)外,其余输入、输出脚的作用和脚号如图中所标。

其中 i0~i7为输入信号(i7优先权最高),qc、qb、qa为三位二进制编码输出信号,ei是使能输入端,eo使能输出端,gs为片优先编码输出端。

电路接线如下图所示:

 编码器接线

用verilog编程实现优先编码功能,参考代码如下:

module encoder_83 (din, EI, GS, EO, dout);
   input [7:0] din;  //编码输入端data_in,低电平有效
   input EI;  //使能输入端EI(选通输入端),EI为 0 时芯片工作,即允许编码
   output [2:0] dout;  //编码输出端data_out
   output GS;  //片优先编码输出端,优先编码器工作工作状态标志GS,低电平有效
   output EO;  //使能输出端EO(选通输出端)
   reg [2:0] dout;
   reg GS, EO;
   always @(din or EI)
     if(EI) begin dout <= 3'b111; GS <= 1; EO <= 1; end  //所有输出端被锁存在高电平
     else if (din[7] == 0) begin dout <= 3'b000; GS <= 0; EO <= 1; end
     else if (din[6] == 0) begin dout <= 3'b001; GS <= 0; EO <= 1; end
     else if (din[5] == 0) begin dout <= 3'b010; GS <= 0; EO <= 1; end
     else if (din[4] == 0) begin dout <= 3'b011; GS <= 0; EO <= 1; end
     else if (din[3] == 0) begin dout <= 3'b100; GS <= 0; EO <= 1; end
     else if (din[2] == 0) begin dout <= 3'b101; GS <= 0; EO <= 1; end
     else if (din[1] == 0) begin dout <= 3'b110; GS <= 0; EO <= 1; end
     else if (din[0] == 0) begin dout <= 3'b111; GS <= 0; EO <= 1; end
     else if (din == 8'b11111111) begin dout <= 3'b111; GS <= 1; EO <= 0; end //芯片工作,但无编码输入
     else begin dout <= 3'b111; GS <= 1; EO <= 1; end  //消除锁存器(latch)
endmodule
//EI = 0 表示允许编码,否则所有输出端被封锁在高电平(控制芯片工作)
//EO = 0 表示电路工作,但无编码输入(用于级联)
//GS = 0 表示电路工作,且有编码输入(判断输入端是否有输入)

Ⅱ. Verilog实现

0x00 优先编码器74LS148

设计代码:

 module encoder1(n_EI,n_I,n_Y,n_CS,n_E0);
input n_EI;
input [7:0] n_I;
output [2:0] n_Y;
output n_CS,n_E0;
reg [2:0] n_Y;
reg n_CS,n_E0;
always @(n_EI or n_I)
if(n_EI==0)
if(n_I[7]==0){n_CS,n_E0,n_Y}=5'b0_1_000;
else if(n_I[6]==0){n_CS,n_E0,n_Y}=5'b0_1_001;
else if(n_I[5]==0){n_CS,n_E0,n_Y}=5'b0_1_010;
else if(n_I[4]==0){n_CS,n_E0,n_Y}=5'b0_1_011;
else if(n_I[3]==0){n_CS,n_E0,n_Y}=5'b0_1_100;
else if(n_I[2]==0){n_CS,n_E0,n_Y}=5'b0_1_101;
else if(n_I[1]==0){n_CS,n_E0,n_Y}=5'b0_1_110;
else if(n_I[0]==0){n_CS,n_E0,n_Y}=5'b0_1_111;
else{n_CS,n_E0,n_Y}=5'b1_0_111;
else{n_CS,n_E0,n_Y}=5'b1_1_111;

endmodule


仿真测试代码:

module sim_encoder1();
reg n_EI;
reg [7:0] n_I;
wire [2:0] n_Y;
wire n_CS,n_E0;
encoder1 test(.n_EI(n_EI),.n_I(n_I),.n_Y(n_Y),.n_CS(n_CS),.n_E0(n_E0));
always begin
n_EI=1'b0;n_I=8'b01111111;#100;
n_EI=1'b0;n_I=8'b10111111;#100;
n_EI=1'b0;n_I=8'b11011111;#100;
n_EI=1'b0;n_I=8'b11101111;#100;
n_EI=1'b0;n_I=8'b11110111;#100;
n_EI=1'b0;n_I=8'b11111011;#100;
n_EI=1'b0;n_I=8'b11111101;#100;
n_EI=1'b0;n_I=8'b11111110;#100;
end
endmodule

波形图:

0x01 3—8译码器

设计代码:

module encoder(B,SEG,en); 
    input[2:0]   B; 
    input[2:0]   en;
    output[7:0]  SEG; 
    reg[7:0]     SEG; 
    always  @(B or en)   
    if(en[2]&(~en[1])&(~en[0]))  
   	    case(B) 
   	    3'b000:  SEG=8'b11111110; 
    	3'b001:  SEG=8'b11111101; 
    	3'b010:  SEG=8'b11111011; 
    	3'b011:  SEG=8'b11110111; 
   	    3'b100:  SEG=8'b11101111; 
    	3'b101:  SEG=8'b11011111; 
   	    3'b110:  SEG=8'b10111111; 
  	    3'b111:  SEG=8'b01111111; 
 	    default: SEG=8'b11111111; 
        endcase 
      else SEG=8'b11111111;
endmodule 

仿真测试代码:

module sim_encoder(); 
    reg  [2:0]B;
    reg  [2:0]en;
    wire [7:0]SEG;
    encoder test(.B(B),.SEG(SEG),.en(en));
    always begin
        en=3'b100;B=3'b000;#100;
        en=3'b100;B=3'b001;#100;
        en=3'b100;B=3'b010;#100;
        en=3'b100;B=3'b011;#100;
        en=3'b100;B=3'b100;#100;
        en=3'b100;B=3'b101;#100;
        en=3'b100;B=3'b110;#100;
        en=3'b100;B=3'b111;#100;
     end
        
    
endmodule

波形图: 

0x02 结果数据

74LS138功能表

输入

输出

使能

选择

e1(G1)

e2(G2B)

e3(G2A)

a2(C)

a1(B)

a0(A)

y7

y6

y5

y4

y3

y2

y1

y0

0

×

×

×

×

×

1

1

1

1

1

1

1

1

1

×

1

×

×

×

1

1

1

1

1

1

1

1

1

1

×

×

×

×

1

1

1

1

1

1

1

1

1

0

0

0

0

0

1

1

1

1

1

1

1

0

1

0

0

0

0

1

1

1

1

1

1

1

0

1

1

0

0

0

1

0

1

1

1

1

1

0

1

1

1

0

0

0

1

1

1

1

1

1

0

1

1

1

1

0

0

1

0

0

1

1

1

0

1

1

1

1

1

0

0

1

0

1

1

1

0

1

1

1

1

1

1

0

0

1

1

0

1

0

1

1

1

1

1

1

1

0

0

1

1

1

0

1

1

1

1

1

1

1

 优先编码器74LS148功能表

输入

输出

ei使能

i7

i6

i5

i4

i3

i2

i1

i0

qc

qb

qa

eo

选通

gs

扩展

1

×

×

×

×

×

×

×

×

1

1

1

1

1

0

1

1

1

1

1

1

1

1

1

1

1

1

1

0

0

×

×

×

×

×

×

×

0

0

0

1

0

0

1

0

×

×

×

×

×

×

0

0

1

1

0

0

1

1

0

×

×

×

×

×

0

1

0

1

0

0

1

1

1

0

×

×

×

×

0

1

1

1

0

0

1

1

1

1

0

×

×

×

1

0

0

1

0

0

1

1

1

1

1

0

×

×

1

0

1

1

0

0

1

1

1

1

1

1

0

×

1

1

0

1

0

0

1

1

1

1

1

1

1

0

1

1

1

1

0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FPGA】Verilog:组合电路 | 3—8译码器 | 编码器 | 74LS148 的相关文章

  • C++ 遇到reference to ‘ *** ‘ is ambiguous 错误

    reference to 39 stack 39 is ambiguous 翻译过来就是对stack的引用有歧义 通过查询百度发现 原来是我引用了iostream 等库 跟里面的属性或者方法重名了 把stack变量改个名字就行了
  • 造成这种语法错误的原因主要是操作符两侧的数据类型不统一,或者是不符合操作符的数据类型要求;

    造成这种语法错误的原因主要是操作符两侧的数据类型不统一 xff0c 或者是不符合操作符的数据类型要求 xff1b
  • 进制转换 输入一个数和转换的进制

    include lt bits stdc 43 43 h gt using namespace std define Max 1000 typedef struct node int data Node struct Stack int t
  • 线性表顺序存储结构——查找、插入、删除的平均比较/移动次数&时间复杂度计算

    假设线性表长度为n 查找 查找特定元素x xff0c 最好的情况是第一个位置就找到 xff0c 最坏的情况是最后一个位置找到 总的比较次数是 xff1a 1 43 2 43 43 n xff0c 即n n 43 1 2 frac n n 4
  • 关于java中子类调用父类构造函数super();一些问题

    来都来了 xff0c 浅浅的给个赞呗 xff01 xff01 xff01 目录 浅谈java super函数的相关概念 浅谈java构造函数相关问题 关于子父类构造函数相关知识点 xff1a 一 xff0c super调用构造器五个注意点
  • 2023-3-26基于51单片机的智能窗户

    此系统可根据开发板原理图搭配外载模块实现功能 xff0c 也可以根据原理图焊接或者PCB焊接 注意 xff1a 根据开发板搭载外部模块实现功能 xff0c 需根据开发板原理图修改代码 0 整理及编写了19个常用的51单片机Proteus仿真
  • 2. 软件工程概论——结构化分析

    软工导论 xff08 二 xff09 结构化分析 传统的软件工程方法学采用结构化分析技术完成系统分析 xff08 问题定义 可行性研究 需求分析 xff09 的任务 结构化分析方法实质上是面向数据流自顶向下逐步求精进行需求分析的方法 结构化
  • input子系统基础之按键-linux驱动开发第8部分-朱有鹏-专题视频课程

    input子系统基础之按键 linux驱动开发第8部分 4690人已学习 课程介绍 本课程是linux驱动开发的第8个课程 xff0c 主要内容是linux的input子系统 学习本课程的目标是对input子系统的框架结构有深入理解 xff
  • C语言入门,用什么编译器比较好?

    两部分 xff0c 编译器介绍与建议 IDE推荐 编译器建议 1 Tiny C Compiler TCC编译速度极其快 xff0c 非常适合入门 xff0c 不需要过多考虑性能影响 xff0c 稳定快速 xff0c 比较推荐 2 GNU C
  • Linux权限委派(生产环境必备)

    权限委派就是让普通用户能获得管理员权限的一种方式 演示 xff1a etc sudoers文件操作 xff0c 暂无pam模块高级设计 例如 xff0c 普通用户想要获得创建用户的权限 xff1a 1 在root账户下 vim etc su
  • Linux进程详解

    一 概述 进程就是系统运行中的程序 xff08 process xff09 是正在执行的一个程序或者命令 xff0c 每一个进程都是一个运行的实体 xff0c 都有自己的地址空间 xff0c 并占用一定的系统资源 例如windows安装程序
  • ifconfig命令和ip命令配置网络

    ifconfig命令时早期网络管理的指令 xff0c 目前Linux新的发行版本很多默认不带ifconfig命令 xff0c 但可以以通过安装软件包net tools方式进行使用 ip命令时新型的网络管理命令 xff0c 目前基本取代了if
  • SSH 基础用法

    1 查看网络环境是否通畅 修改主机名称 xff1a hostnamectl set hostname xxxx 查看网络信息 xff1a ifconfig 或者用 ip a show xxxx 网卡配置文件名称 测试网络连接 xff1a p
  • Linux系统ftp服务器搭建

    1 安装ftp yum y install vsftpd 2 启动ftp服务 xff1a systemctl restart vsftpd 查看网络端口使用 xff1a netstat tunlp 可以看到vsftp对应使用的21端口 3
  • UltraVNC 使用方法详细说明

    介绍 VNC Virtual Network Console 是虚拟网络控制台的缩写 UltraVNC 是客户端 服务器软件 xff0c 允许你经由 TCP IP 连线 xff08 也就是主机都在同一网络环境下 xff09 xff0c 控制
  • IE浏览器设置兼容性

    在访问一些老旧的网站时 xff0c 会出现图像等画面显示不全或不显示的现象 xff0c 可尝试设置一下浏览器的兼容性视图 打开IE浏览器 xff0c 点击 设置 钮 选择兼容性视图设置 2 在添加网站窗口 xff0c 填入对应网站网址 xf
  • windows10 更改系统默认程序

    更改系统默认打开程序 点击wind10系统左下角windows图标 2 点击 设置 3 在设置界面选择 应用 4 在侧边栏选择 默认应用 5 在默认应用中可修改系统应用的默认打开软件
  • 打印机维护

    打印机使用过程中大致会有两种问题 一 硬件问题 xff1a 等耗材更换 xff1a 墨水 xff0c 碳粉 xff0c 硒鼓 xff0c 墨盒 1 喷墨打印机 xff1a 主要就是字车 搓纸组件和横向移动就是x轴 xff1b 2 针式打印机
  • I2C总线和触摸屏驱动移植实战-linux驱动开发第9部分-朱有鹏-专题视频课程

    I2C总线和触摸屏驱动移植实战 linux驱动开发第9部分 9306人已学习 课程介绍 本课程是linux驱动开发的第9个课程 xff0c 主要内容是linux的I2C子系统以及电容触摸屏驱动的移植 学习本课程的核心点在于I2C子系统 xf
  • 【C语言和C++】实现线程池

    目录 一 线程池总体结构 二 线程数组 三 添加任务队列 四 管理者线程 五 销毁 六 其他子函数 七 测试代码 附录 xff08 C和C 43 43 代码 xff09 最后有全部代码 xff0c 急需可以跳过 线程池是一种概念 xff0c

随机推荐

  • 【C语言】算法学习·哈希算法全解

    目录 C中的哈希 它能做什么 xff1f 快吗 xff1f 是图书馆吗 xff1f C C 43 43 和平台 BSD 许可 下载 uthash 获得帮助 贡献 包括的额外内容 历史 可以直接从此处开始阅读 哈希结构 钥匙 哈希句柄 关于记
  • 小知识·PD充电协议

    目录 PD充电器硬件结构 pd充电协议是什么 pd协议快充什么意思 PD快充协议优势 USB PD快速充电通信原理 PD充电器硬件结构 典型的手机充电器的硬件结构 xff08 以基于Dialog方案的高通QC2 0快充协议为例 xff09
  • 小知识·typec耳机原理

    目录 数字耳机和模拟耳机 手机中模拟和数字耳机的差异 typec耳机介绍 数字耳机和模拟耳机 模拟耳机即我们的常见的3 5mm接口的耳机 xff0c 包括左右声道 xff0c 地或者mic xff0c 如左图 数字耳机 右图 包含一个usb
  • 小知识·adb安装和使用方法

    目录 一 adb是什么 xff1f 二 adb有什么作用 三 如何启用adb调试 四 如何判断设备连接正常 五 如何下载安装adb 1 adb下载地址 xff1a 2 按装步骤 六 adb命令大全 1 查看设备 2 Adb应用管理 3 安装
  • 【C++】搭建HTTP服务器

    目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI URL URN HTTP的协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CG
  • Linux命令·netstat

    netstat命令用于显示与IP TCP UDP和ICMP协议相关的统计数据 xff0c 一般用于检验本机各端口的网络连接情况 netstat是在内核中访问网络及相关信息的程序 xff0c 它能提供TCP连接 xff0c TCP和UDP监听
  • Linux命令·ss

    ss是Socket Statistics的缩写 顾名思义 xff0c ss命令可以用来获取socket统计信息 xff0c 它可以显示和netstat类似的内容 但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息 xff0c
  • LeetCode·每日一题·2437. 有效时间的数目·模拟

    作者 xff1a 小迅 链接 xff1a https leetcode cn problems number of valid clock times solutions 2262448 mo ni zhu shi chao ji xian
  • john破解用户密码和防破解

    目录 一 系统弱口令检测 二 防止暴力破解 一 系统弱口令检测 Joth the Ripper xff0c 简称JR 一款开源的密码分析工具 xff0c 支持字典式的暴力破解 通过对shadow文件的口令分析 xff0c 可以检测密码强度
  • 块设备驱动介绍-linux驱动开发第10部分-朱有鹏-专题视频课程

    块设备驱动介绍 linux驱动开发第10部分 3265人已学习 课程介绍 本课程是linux驱动开发的第10个课程 xff0c 主要内容是linux的块设备驱动的介绍 xff0c 首先详细讲了块设备驱动和字符设备驱动的核心差异 xff0c
  • Linux各个系统版本及区别(Ubuntu,CentOS..)

    一 概览 Linux的版本号分为两部分 xff1a 内核版本和发行版本 内核版本 xff1a 不包含外围程序GNU程序库和工具 xff0c 命令行shell xff0c 图形界面的X Window系统和相应的桌面环境等 发行版本 xff1a
  • keil5编译报错问题

    keil5一开始编译文件总是报错 error 3092 anonymous unions are only supported in gnu mode or when enabled with pragma anon unions 错误 x
  • MySQL中的函数

    1 单行函数和多行函数 xff08 聚合函数 分组函数 xff09 xff1a 只对一行进行变换 每行返回一个结果 xff1b 1 单行函数 xff1a a 数值函数 xff1a 基本函数 xff1a ABS x 绝对值 SIGN x 0
  • Centos防火墙配置

    一 防火墙的概念 防火墙技术是用于安全管理的软件和硬件设备 xff0c 在计算机内 外网之间构建一道相对隔绝的保护屏障 xff0c 以保护数据和信息安全性的一种技术 防火墙分为网络防火墙和主机防火墙 网络防火墙由软件和硬件组成 xff0c
  • linux 线程的调度策略

    目录 一 调度策略 1 实时线程 2 非实时线程 3 抢占式调度策略 运行特点 xff1a 4 轮询式调度策略 运行特点 xff1a 二 设置线程的调度策略步骤 1 定义线程句柄 2 定义线程属性结构体 3 初始化属性结构体 4 设置线程是
  • 16选1数据选择器和32选1数据选择器multisim

    大致思路 xff1a xff08 正经内容在下边 xff09 学校期中考试 xff0c 搜了半天发现连16 1都很难搜到 xff0c 一整天做出来 xff0c 趁着还有兴致记录一下过程 老师上课只教了4 1数据选择器 xff0c 于是先从8
  • 【软件工程】对软件工程课程的希望及个人目标

    自我简介 首先进行一下自我介绍 xff0c 我是一名桂林理工大学信息科学与工程学院的本科在读生 xff0c 现已经是本科二年级的学生了 xff0c 上个学期我们刚经历了专业分流 xff0c 很幸运 xff0c 我来到了我所希望来到的软件工程
  • 网络设备驱动介绍-linux驱动开发第11部分-朱有鹏-专题视频课程

    网络设备驱动介绍 linux驱动开发第11部分 3869人已学习 课程介绍 本课程是linux驱动开发的第11个课程 xff0c 主要内容是linux的网络驱动的介绍 xff0c 首先讲述了网络设备驱动接口和之前讲的2种的不同 xff0c
  • 六、如何使用VS调试代码、条件语句

    how to use Visual Studio to debug our code 查看程序断点 调试程序 1 设置断点 断点 xff0c 调试器将中断 xff0c break xff0c 程序调试是将会中断 xff0c continue
  • 【FPGA】Verilog:组合电路 | 3—8译码器 | 编码器 | 74LS148

    前言 xff1a 本章内容主要是演示Vivado下利用Verilog语言进行电路设计 仿真 综合和下载 示例 xff1a 编码 译码器的应用 功能特性 xff1a 采用 Xilinx Artix 7 XC7A35T芯片 配置方式 xff1a