EDA实验-----4*4矩阵键盘与数码管显示测试(Quartus ‖)

目录

一、实验目的

二、实验仪器设备

三、实验原理

四、实验要求

五、实验步骤

六、实验报告

七、实验过程

1.矩阵键盘按键原理

2.数码管原理

3.分频器代码

 4.电路图连接

 5.文件烧录


 

一、实验目的

  1. 了解数码管的工作原理;
  2. 掌握4*4矩阵键盘和数码管显示的编程方法。
  3. 学会用于Verilog语言进行程序设计。

二、实验仪器设备

  1. PC机一台。
  2. FPGA实验开发系统一套。

三、实验原理

本实验通过扫描4*4矩阵键盘的值,在数码管上显示对应按钮的编号数据。矩阵键盘及数码管电路如下所示。

b5731399c96e4300b93feb6b8d6b7ab0.png

a2e0cec5e6b84f93b222318559042156.png 

四、实验要求

  1. 预习教材中的相关内容。
  2. 阅读并熟悉本次实验的内容。
  3. 完成实验内容。

五、实验步骤

  1. 启动 Quartus II 建立一个空白工程,选择的器件为 Altera 公司的 Cyclone 系列的 EP2C8Q240C8芯片,命名为 keyarray.qpf;
  2. 新建一个 Schematic File 文件,命名为 keyarray.bdf分别新建 3 个 Verilog HDL File 文件,分别命名为 seg_show.v、 divclk.v、 keyarraycontrol.v。输入程序代码并保存(对应源程序 8),然后进行综合编译。若在编译过程中发现错误,则找出错误并更正错误,直至编译成功为止。
  3. 从设计文件创建模块(FileàCreat UpdateàCreat Symbol Files for Current File) ,seg_show.v 生成名为 seg_show.bsf; divclk.v 生成名为 divclk.bsf; keyarraycontrol.v 生成名为keyarraycontrol.bsf;
  4. 在 keyarray.bdf 文件中,在空白处双击鼠标左键,在 Symbol 对话框左上角的 libraries 中,分别将 Project 下的 seg_show, divclk, keyarraycontrol 模块放在图形文件 keyarray.bdf 中,加入输入、输出引脚,双击每个引脚,进行引脚命名,并锁定管脚,将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片);

    12a080d545ca442a932eceeeca2128fa.png

  5. 将 keyarray.bdf 设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中出现错误,则找出错误并更正,直至编译通过为止;
  6. 将 USB-Blaster 下载电缆的两端分别连接到 PC 机的 USB 接口和 EDA 实验箱上的 JTAG 下载口上,打开电源,执行下载命令,把程序下载到 FPGA 器件中,此时,即可在 EDA 实验箱上通过按下相应的按键使蜂鸣器发出对应的音符声响。

完整的顶层模块原理图如图所示:308baaf78f574596add4486f5ddd43bb.png

六、实验报告

  1. 总结Verilog设计多路选择器使用的最基本与核心的语法知识。
  2. 对仿真的结果进行分析。
  3. 讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。

七、实验过程

创建项目、创建Verilog文件、写代码、进行波形仿真、画出电路图、设置管脚和三态、烧录文件

1.矩阵键盘按键原理

在讲实验过程之前,先讲讲相关的原理,不知道原理的话就很难去写代码。

2fa17b571f7e4ce0857c707e4f0c422e.png

d20180ba4d504e73abdfeb3195f8812d.png

矩阵按键模块是先按行选取到某一行,然后再选列,跟矩阵选择某一个点的原理是一样的,如果按下这个按键的时候,此时两边的开关是接通的,这时候就会返回到一个矩阵按键回馈的信息,我们只需要去读取到这个信息,然后再根据行列的相关位置,把这个信息转换为相对于的数字返回即可。

Verilog代码(读取到矩阵按键按下的位置,输出相对于的数字):

module keyarraycontrol(clk,rst,row,col,keydata);
input				clk;
input 				rst;
input	[3:0]		row;
output	reg[3:0]	col;
output 	reg[3:0]	keydata;
reg  keyint;reg [19:0] cnt;      
//分频获得键盘扫描频率                  
always @ (posedge clk, negedge rst) if (!rst) cnt <= 0; else cnt <= cnt + 1'b1; 
//将计数的最高位赋给key_clk 
wire key_clk = cnt[19];                // (2^20/50M = 21)ms  
//设定扫描状态判断参数
parameter NO_KEY_PRESSED = 6'b000_001;  // 如果没有按键按下的时候
parameter SCAN_COL0      = 6'b000_010;  // 按下第一行按键
parameter SCAN_COL1      = 6'b000_100;  // 按下第二行按键
parameter SCAN_COL2      = 6'b001_000;  // 按下第三行按键
parameter SCAN_COL3      = 6'b010_000;  // 按下第四行按键
parameter KEY_PRESSED    = 6'b100_000;  // 有按键按下状态reg [5:0] current_state, next_state;    // 当前状态,,,下一个状态always @ (posedge key_clk, negedge rst) if (!rst) current_state <= NO_KEY_PRESSED; else current_state <= next_state; // 
always @ * case (current_state) NO_KEY_PRESSED :  //if (row != 4'hF) next_state = SCAN_COL0; else next_state = NO_KEY_PRESSED; SCAN_COL0 :                         // if (row != 4'hF) next_state = KEY_PRESSED; else next_state = SCAN_COL1; SCAN_COL1 :                         // if (row != 4'hF) next_state = KEY_PRESSED; else next_state = SCAN_COL2;     SCAN_COL2 :                         // if (row != 4'hF) next_state = KEY_PRESSED; else next_state = SCAN_COL3; SCAN_COL3 :                         //if (row != 4'hF) next_state = KEY_PRESSED; else next_state = NO_KEY_PRESSED; KEY_PRESSED :                       // if (row != 4'hF) next_state = KEY_PRESSED; else next_state = NO_KEY_PRESSED;                 endcase 
reg [3:0] col_val, row_val;             // always @ (posedge key_clk, negedge rst) if (!rst) begin col<= 4'h0; keyint<=0; end else case (next_state) NO_KEY_PRESSED :                  // begin col <= 4'h0; keyint <= 0;       // end SCAN_COL0 :                       // col <= 4'b1110; SCAN_COL1 :                       col <= 4'b1101; SCAN_COL2 :                       // col <= 4'b1011; SCAN_COL3 :                       // col <= 4'b0111; KEY_PRESSED :                     // begin col_val<= col;        // 得到列的值row_val<= row;        // 得到行的值keyint <= 1;          // end endcase always @ (posedge key_clk, negedge rst) if (!rst) keydata <= 16'h0000; else if (keyint) case ({col_val, row_val}) 8'b1110_1110 : keydata <= 8'd0; 8'b1110_1101 : keydata <= 8'd4; 8'b1110_1011 : keydata <= 8'd8;  8'b1110_0111 : keydata <= 8'd12;  8'b1101_1110 : keydata <= 8'd1;8'b1101_1101 : keydata <= 8'd5;8'b1101_1011 : keydata <= 8'd9; 8'b1101_0111 : keydata <= 8'd13;8'b1011_1110 : keydata <= 8'd2; 8'b1011_1101 : keydata <= 8'd6;  8'b1011_1011 : keydata <= 8'd10; 8'b1011_0111 : keydata <= 8'd14; 8'b0111_1110 : keydata <= 8'd3;8'b0111_1101 : keydata <= 8'd7;8'b0111_1011 : keydata <= 8'd11;8'b0111_0111 : keydata <= 8'd15; default:  keydata <= keydata;        endcase elsekeydata <= keydata; 
endmodule

2.数码管原理

a9fa396583f94ec78dd1558ef394d994.png

数码管分为共阴和共阳两种,通过选择器的高低电平去判断选取到的位数,所以数码管的读取是先选择位,然后再去显示亮的灯。下图所示,下面的74HC573芯片是用于选位处理的(这个芯片必须接地或者接上低电平才可以正常工作),由于上面的U1也是同一个芯片,所以这里先进行选位的时候要先把上面的那个芯片锁住,然后下面的芯片工作,这里我们不难看出这是一个共阴的数码管,每一个数码管的选位都是连接到阴极处的(接地),所以选位的时候只需要去进行连接到地,那就可以实现通电。选完位之后,就开始选段,所以这时候要锁住下面的芯片,让上面的工作,这个数码管的选段是根据某一个段通入高电平才会亮,其每一段对应的电平位置是 hgfedcba,比如通入8个电平: 0000 0110,那么就会显示数字1,因为只有b和c段亮了。

b5731399c96e4300b93feb6b8d6b7ab0.png

数码管生成器模拟软件:数码管 代码 生成器 (treee.com.cn)

Verilog代码(获取到相对于的数字,然后在数码管静态显示出来): 


module seg(clk, data, sel_lock, seg_lock, gpio);	
input clk;			
input[3:0] data;
output reg sel_lock;
output reg seg_lock;
output [7:0] gpio;		reg [7:0] gpio;	
reg [3:0] disp_dat;		
reg  cnt;			
reg [12:0] cnt2;always@(posedge clk)		//cnt2 = cnt2 + 1;//if (cnt <1000)begincnt = cnt + 1;	cnt2 = cnt2 + 1;if (cnt)beginsel_lock = 1'b1;seg_lock = 1'b0;		gpio = 8'h00;#20 sel_lock = 1'b0;seg_lock = 1'b1;	endelsebeginsel_lock = 1'b0;seg_lock = 1'b1;		disp_dat = data;		case(disp_dat)		4'h0:gpio=8'h3f;	//0 0011 11114'h1:gpio=8'h06;	//1 0000 01104'h2:gpio=8'h5b;	//24'h3:gpio=8'h4f;	//34'h4:gpio=8'h66;	//44'h5:gpio=8'h6d;	//54'h6:gpio=8'h7d;	//64'h7:gpio=8'h07;	//74'h8:gpio=8'h7f;	//84'h9:gpio=8'h6f;	//94'ha:gpio=8'h77;	//a4'hb:gpio=8'h7c;	//b4'hc:gpio=8'h39;	//c4'hd:gpio=8'h5e;	//d4'he:gpio=8'h79;	//e4'hf:gpio=8'h71;	//fendcase#20 sel_lock = 1'b1;seg_lock = 1'b0;end
end
endmodule	

3.分频器代码

module divclk(inclk,outclk);input inclk;output outclk;reg outclk;reg [16:0] cnt;initialbegincnt=0;outclk=0;endalways @(posedge inclk)begincnt=cnt+1;if (cnt==0)outclk = outclk+1;end
endmodule 

 4.电路图连接

写好了Verilog代码,就进行分析错误,分析无误后,我们就对这些代码生成子模块文件。然后就创建block文件开始连接电路图,电路图以及管脚配置如下:7965bcb8120242cbbafe06f67ddef94b.png

 5.文件烧录

弄好了之后就是最后一步操作了,把没用到的管脚设置三态,然后烧录文件。

点击Assignment, Device

72fc4c7b723a4590974b9fe2e43a9c73.png

然后点击这里,设置管脚。 

ab08cd8cd2a5450983f6f094f87f0865.png 选择第一个就行了,就是把多余的管脚设置三态。a779aee811ee4689a875b6f7b7ec78af.png

 然后就是编译运行文件,运行无误。8fda9f81c00f49318748cc490cbd77b8.png

点击此处,烧录文件。 

ea76d796dcb248c3b5125fdc9a9d0662.png 

这里我们会看到,下面有一个芯片,这个也就是我们写好了的sof文件,然后就是通过你的电脑接口去连接到开发板,如果你看到上面有一个No Hardware的时候,你点击旁边的按钮进行接口设置,设置为USB接口即可(USB线连接了你的开发板就会自动显示出来的)。最后点击start就可以进行烧录了。 

以上就是本期的全部内容了,我们下一次见!

分享一张壁纸:9537723833a24b41bace354bce482686.png

 

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

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

相关文章

纵行科技亮相2023汽车物流行业年会,与菜鸟共推ZETag资产管理方案

近日&#xff0c;由中物联汽车物流分会主办的“汽车物流行业年会”在十堰召开。纵行科技受邀亮相&#xff0c;并与菜鸟共推ZETag资产管理方案&#xff0c;助力汽车物流数字化发展。 当前&#xff0c;我国物流业处于恢复性增长和结构性调整的关键期&#xff0c;国务院印发的《…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

中间件安全:Apache 目录穿透.(CVE-2021-41773)

中间件安全&#xff1a;Apache 目录穿透.&#xff08;CVE-2021-41773&#xff09; Apache 的 2.4.49、2.4.50 版本 对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c…

K-Means聚类

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 K-means聚类算法实现 技术细节 选取的数据集是sklearn.datasets里面的鸢尾花数据集&#xff0c;方便最后的算法评价。 根据手肘法&#xff08;即根据SSE代价函数&#xff09;得出最合适的k值。 此处思路是先根据E …

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE &#xff08;含2.0以上版本&#xff09;默认库文件位置的方法。 原创文章&#xff0c;转载请注明出处&#xff1a; 【实用技巧】更改ArduinoIDE默认库文件位置&#xff0c;解放C盘&#xff0c;将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…

Kubernetes Dashboard部署ImagePullBackOff问题处理

通常&#xff0c;出现ImagePullBackOff问题是由于Kubernetes集群无法拉取所需的镜像导致的。解决这个问题的方法通常包括以下步骤&#xff1a; 1. 检查Pod的描述信息&#xff1a; kubectl describe pod/[pod名称] --namespacekubernetes-dashboard 查看Events部分是否有关于…

Windows安装Java环境(OracleJDK)

在下载之前&#xff0c;我们先了解一下java的前世今生 1991年&#xff1a;Java 的前身 Oak 由 James Gosling 和他的团队在 Sun Microsystems 公司开发。1995年&#xff1a;Oak 更名为 Java&#xff0c;并在同年发布。Java 1.0 版本正式推出。1996年&#xff1a;Sun Microsyst…

Threejs_06 多材质的实现

Threejs 同一个几何体如何实现多材质呢&#xff1f; 多材质的实现 1.使用索引绘制一个几何体 //创建几何体(三角形) const geometry new THREE.BufferGeometry();//使用索引绘制 (两个共用的) const vertices new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1…

谈谈系统性能调优中都需要考虑哪些因素

一、 什么是性能调优&#xff1f; 这个系统好慢、网站又打不开了&#xff0c;太卡了&#xff0c;又没响应了&#xff0c;相信大家都遇到过用户的这种抱怨&#xff0c;此时&#xff0c;说明我们的应用系统出现了性能问题&#xff0c;那么怎么办呢&#xff0c;首先想到的应该是优…

HP惠普暗影精灵9笔记本电脑OMEN by HP Transcend 16英寸游戏本16-u0000原厂Windows11系统

惠普暗影9恢复出厂开箱状态&#xff0c;原装出厂Win11-22H2系统ISO镜像 下载链接&#xff1a;https://pan.baidu.com/s/17ftbBHEMFSEOw22tnYvPog?pwd91p1 提取码&#xff1a;91p1 适用型号&#xff1a;16-u0006TX、16-u0007TX、16-u0008TX、16-u0009TX、16-u0017TX 原厂系…

数据结构与算法编程题2

逆置线性表&#xff0c;使空间复杂度为 O(1) #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;void Init_SqList(SqList& …

YOLOV8部署Android Studio安卓平台NCNN

下载Android Studio&#xff0c;配置安卓开发环境&#xff0c;这个过程比较漫长。 安装cmake&#xff0c;注意安装的是cmake3.10版本。 根据手机安卓版本选择相应的安卓版本&#xff0c;我的是红米K30Pro&#xff0c;安卓12。 使用腾讯开源的ncnn&#xff0c;这是一个为手机端极…

驶入产业发展快车道,汉鑫科技人工智能研发中心正式启用!

11月18日&#xff0c;汉鑫科技人工智能研发中心正式启用。中心立足烟台&#xff0c;服务全国&#xff0c;聚焦工业智能、智能网联、智慧城市三大业务板块&#xff0c;以人工智能技术赋能政企实现“数智化”转型升级。该中心的启用标志着汉鑫科技在人工智能研发应用领域迈上了新…

移动端表格分页uni-app

使用uni-app提供的uni-table表格 网址&#xff1a;https://uniapp.dcloud.net.cn/component/uniui/uni-table.html#%E4%BB%8B%E7%BB%8D <uni-table ref"table" :loading"loading" border stripe type"selection" emptyText"暂无更多数据…

【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Nacos 一、nacos实现配置管理1.1 统一配置管…

Taro安装及使用

安装及使用 安装​ Taro 项目基于 node&#xff0c;请确保已具备较新的 node 环境&#xff08;>12.0.0&#xff09;&#xff0c;推荐使用 node 版本管理工具 nvm 来管理 node&#xff0c;这样不仅可以很方便地切换 node 版本&#xff0c;而且全局安装时候也不用加 sudo 了…

不必购买Mac,这款国产设计工具能轻松替代Sketch!

介绍 即时设计是新一代可以直接在浏览器中使用的设计工具&#xff0c;具有Sketch和实时协作功能。与本地Sketch相比&#xff0c;增加了实时协作功能&#xff0c;即时设计可以看作是在线Sketch&#xff0c;两个工具可以简单粗暴地总结为一个公式&#xff1a; 即时设计Sketch云…

Nginx - 本机读取服务器图像、视频

目录 一.引言 二.安装 Nginx 1.安装 By apt 2.安装 By 官网 三.配置 Nginx 1.Linux 机器配置 2.重启 Nginx 服务 3.本机查看机器文件 四.总结 一.引言 前面介绍了 GFP-GAN、PNG2GIF、GIF2PNG 等操作&#xff0c;我们生成的 video、gif、png 等形式的文件都存储在 lin…

【wp】2023第七届HECTF信息安全挑战赛 Web

伪装者 考点&#xff1a;http协议flask的session伪造ssrf读取文件 首先根据题目要求就行伪造HTTP 这里不多说&#xff0c;比较基础 然后下面得到是个登入 页面&#xff0c;我们输入zxk1ing 得到 说什么要白马王子 &#xff0c;一眼session伪造 看到ey开头感觉是jwt 输入看看 得…

通达信的ebk文件

我们在通达信软件中 调出 “自定义板块设置” 这个菜单&#xff0c;点击“导出”&#xff0c;会提示你存储 “自选股.EBK”&#xff0c;其实就是对自定义板块里的目录进行备份的一种方式&#xff0c; 当我们打开 这个文件&#xff0c;你会发现其实就是存储了 股票代码&#xff…