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

news2025/6/5 18:28:17

前言:本章内容主要是演示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

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

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

相关文章

部门新来了个软件测试工程师,看着一副毛头小子的样儿,哪想到是新一代卷王...

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不…

【精彩点评】正确理解区块链能源消耗的内涵以及对绿色区块链的探索

发表时间&#xff1a;2022年4月13日 信息来源&#xff1a;bsvblockchain.org 为了理解区块链技术的工作原理并确定如何更好地对其加以利用&#xff0c;就区块链技术提出疑问是不可避免的。也许你正在被区块链的能源效率这个问题所困扰。 经常有人说&#xff0c;一些区块链网络…

Spring MVC 之获取参数(对象、JSON格式数据、URL地址参数、文件、Cookie)

文章目录1. 获取单个参数2. 获取多个参数3. 获取对象4. 后端参数重命名 RequestParam5. 接收 JSON 格式的数据 RequestBody6. 从 URL 地址中获取参数 PathVariable7. 上传文件 RequestPart8. 获取Cookie (CookieValue)/Session/header8.1 获取 Request 和 Response 对象8.2 获取…

【GD32F427开发板试用】SysTick定时器的ms中断,us计时

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;远小刘 1、系统滴答定时器 参考资料《Cortex M3与M4权威指南.pdf》中的9.5 The SysTick timer小节&#xff0c;里面详细讲解了 1、为什么要用…

一分钟教会使用ChatGPT,保姆级ChatGPT教程

最近ChatGPT大火&#xff01;微软退出首款ChatGPT搜索引擎&#xff0c;阿里等国内巨头也纷纷爆出自家产品&#xff0c;一夜之间&#xff0c;全球最大的科技公司仿佛都回到了自己年轻时的样子&#xff01; 然而&#xff0c;ChatGPT这么火&#xff0c;这么好玩的东西&#xff0c…

Knowledgeowl VS Baklib:你需要知道的一切!

KnowledgeOwl 和 Baklib都是知识库软件的示例。您可以使用每个平台为用户创建自己的知识库和托管文档。每个平台都允许您从同一帐户创建多个知识库&#xff0c;并且可以为用户提供内部和外部知识库。什么是知识库&#xff1f;知识库是一个集中的信息存储库&#xff0c;旨在为无…

Koa2-项目中的基本应用

文章目录安装配置koa2配置nodemon,热更新我们的项目中间件什么是中间件&#x1f47b;洋葱模型路由中间件连接数据库 - mysql后端允许跨域处理请求getpostputdelete后续会继续更新安装配置koa2 &#x1f47b;安装 koa2 npm i koa2 -s&#x1f47b;在package.json 配置,当然是在…

用LCR测试仪测试无线充电系统中的线圈

宽阻抗范围用来表征电感和质量因数– 高精度 DCR 测量– 制造环节快速测量– 大量夹具可供选择智能终端上不断增加新功能&#xff0c;电池寿命成为用户最头痛的问题之一。相比便携式电源和电缆供电而言&#xff0c;无线充电技术因其方便性和多功能性获得了很大的关注&#xff0…

MySQL —— 表的增删查改(一)

目录 表的增删查改&#xff08;一&#xff09; 一、create 1. 单行数据全列插入 2. 多行数据指定列插入 3. 插入否则更新 4. 替换 二、Retrieve 1. select列 1. 全列查询 2. 指定列查询 3. 查询字段为表达式 4. 为查询结果指定别名 5. 结果去重 2. where条件 1…

辞旧岁立新年 | 展望前端工程师的2023

「InfoQ 年度技术盘点与展望」是由InfoQ主办的年度技术盘点与展望项目&#xff0c;是 InfoQ 全年最重要的内容选题之一。 近日&#xff0c;字节跳动云原生 PaaS 资深前端工程师黄健受邀参与&#xff0c;分享主题为 《展望前端研发工程师的 2023》 。本文整理自黄健于直播中分享…

中国区注册OpenAI账号,试用ChatGPT指南

OpenAI最近推出ChatGPT&#xff0c;但国内&#xff08;包括香港&#xff09;并不支持OpenAI账号注册&#xff0c;多数会提示&#xff1a; OpenAI’s services are not available in your country. 前期准备 科学上网&#xff0c;最好是美国IP&#xff08;可以购买v屁n&…

(三)循环神经网络RNN之LSTM和GRU

LSTM介绍 LSTM(Long Short Term Memory)是 Hochreater 和 Schmidhuber 在 1997 年提出的一种网络结构&#xff0c;尽管该模型在序列建模上的特性非常突出&#xff0c;但由于当时正是神经网络的下坡期&#xff0c;没有能够引起学术界足够的重视。随着深度学习逐渐发展&#xff…

【数据结构-JAVA】排序

排序在现实生活中的应用可谓相当广泛&#xff0c;比如电商平台中&#xff0c;选购商品时&#xff0c;使用价格排序或是综合排序、高考填报志愿的时候&#xff0c;会参考全国大学排名的情况。下面介绍一些计算机中与排序相关的概念&#xff1a;排序&#xff1a;所谓排序&#xf…

超详细的JAVA高级进阶基础知识03

目录 3. 面向对象高级 - 常用的API 3.1 Object 类 3.1.1 Object 类介绍 3.1.2 Object类的常用方法&#xff1a; 3.1.3 Objects 概述 3.2 Math 类 3.3 System 类 3.3.1 System 类概述 3.3.2 常用方法 3.4 BigDecimal 类 3.4.1 BigDecimal 类概述 3.4.2 BigDecimal 类…

windows 编译 open3d 下

1.安装cmake 快速通道&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1gZYAlGRRj4UVGgaTBaZXjg?pwd1klo 提取码&#xff1a;1klo --来自百度网盘超级会员V4的分享警告不用管编译中成功就是61开始配置 cmake 那时候选的路径glew.libglfw3.libjsoncpp.libOpen3D.libpng.l…

jdk和Android sdk 和 ndk 和 apache-ant环境变量配置

ANDROID_HOMEG:\android-sdk-windowsCLASSPATH.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\dt.jar;%ANT_HOME%\libJAVA_HOMEC:\Program Files (x86)\Java\jdk1.8.0_361NDK_HOMEG:\android-ndk-r25cant下载https://www.likecs.com…

win环境安装部署Jenkins

win环境安装部署Jenkins&#xff0c;2022年11月&#xff1a;从2022年 6 月 28 日发布的 Jenkins 2.357 和2022年9 月发布的 LTS 版本开始&#xff0c;Jenkins 需要 Java 11 才能使用&#xff0c;放弃 Java 8&#xff0c;如果用JDK1.8&#xff0c;那么Jenkins版本需要是2.357版本…

ChatGPT逐鹿:谷歌“翻车”,微软抢跑,国内概念股狂飙

2023年开年才一个月&#xff0c;微软、谷歌两大巨头在AI战场就上演了“神仙打架”。 1月里两家公司围绕OpenAI和ChatGPT发布的密集消息余温尚在&#xff0c;2月7日&#xff0c;谷歌就官宣了自家的ChatGPT竞品Bard&#xff0c;并发布演示Demo。2月8日&#xff0c;微软直接上线了…

室内三维地图怎么做的?室内地图怎么做好看?

室内导航、定位中须采用基于建筑平面图生产的室内地图&#xff0c;现有的生产室内地图的方法都是依靠人工去根据建筑平面图使用矢量绘图工具去绘制矢量化的室内地图示意图&#xff0c;然后再去标明具体的区域名称功能或者标注位置点。因此制作室内地图往往都比较耗时&#xff0…

blender基础操作

shiftc&#xff1a;游标回到世界中心 shifta: 添加物体 gx或y或z&#xff1a;沿x轴或y轴或z轴移动 gx加数字&#xff1a;往x轴方向移动几格 rx加度数&#xff1a;绕x轴旋转多少度 分割界面&#xff1a;右键单击间隙&#xff0c;选择verticle tab: 来回切换编辑界面和物体界面&…