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

news2024/11/17 11:49:23

目录

一、实验目的

二、实验仪器设备

三、实验原理

四、实验要求

五、实验步骤

六、实验报告

七、实验过程

1.矩阵键盘按键原理

2.数码管原理

3.分频器代码

 4.电路图连接

 5.文件烧录


一、实验目的

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

二、实验仪器设备

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

三、实验原理

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

 

四、实验要求

  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 中,加入输入、输出引脚,双击每个引脚,进行引脚命名,并锁定管脚,将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)

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

完整的顶层模块原理图如图所示:

六、实验报告

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

七、实验过程

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

1.矩阵键盘按键原理

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

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

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 
     else
		keydata <= keydata; 
endmodule

2.数码管原理

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

数码管生成器模拟软件:数码管 代码 生成器 (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)
	begin
		cnt = cnt + 1;	
		cnt2 = cnt2 + 1;
		if (cnt)
		begin
			sel_lock = 1'b1;
			seg_lock = 1'b0;		
			gpio = 8'h00;
			#20 sel_lock = 1'b0;
			seg_lock = 1'b1;	
		end
		else
		begin
			sel_lock = 1'b0;
			seg_lock = 1'b1;		
			
			disp_dat = data;		
			case(disp_dat)		
				
					4'h0:gpio=8'h3f;	//0 0011 1111
					4'h1:gpio=8'h06;	//1 0000 0110
					4'h2:gpio=8'h5b;	//2
					4'h3:gpio=8'h4f;	//3
					4'h4:gpio=8'h66;	//4
					4'h5:gpio=8'h6d;	//5
					4'h6:gpio=8'h7d;	//6
					4'h7:gpio=8'h07;	//7
					4'h8:gpio=8'h7f;	//8
					4'h9:gpio=8'h6f;	//9
					4'ha:gpio=8'h77;	//a
					4'hb:gpio=8'h7c;	//b
					4'hc:gpio=8'h39;	//c
					4'hd:gpio=8'h5e;	//d
					4'he:gpio=8'h79;	//e
					4'hf:gpio=8'h71;	//f
			
					
			endcase
			
			#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;
	initial
		begin
			cnt=0;
			outclk=0;
		end
	
	always @(posedge inclk)
		begin
			cnt=cnt+1;
			if (cnt==0)
				outclk = outclk+1;
		end
endmodule 

 4.电路图连接

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

 5.文件烧录

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

点击Assignment, Device

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

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

 然后就是编译运行文件,运行无误。

点击此处,烧录文件。 

 

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

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

分享一张壁纸:

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

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

相关文章

如何解决msvcr100.dll丢失问题?5个实用的解决方法分享

在日常计算机操作过程中&#xff0c;相信不少小伙伴都经历过这样一种困扰&#xff0c;那便是某款应用程序或者游戏无法正常启动并弹出“找不到msvcr100.dll”的提示信息。这类问题让人头疼不已&#xff0c;严重影响到了我们的工作效率和休闲娱乐。接下来&#xff0c;就让小编带…

Node.js环境配置级安装vue-cli脚手架

一、下载安装Node.js (略) 二、验证node.js并配置 1、下载安装后&#xff0c;cmd面板输入node -v查询版本、npm -v ,查看npm是否安装成功&#xff08;有版本号就行了&#xff09; 2、选择npm镜像&#xff08;npm config set registry https://registry.npm.taobao.org&…

大数据HCIE成神之路之数学(3)——概率论

概率论 1.1 概率论内容介绍1.1.1 概率论介绍1.1.2 实验介绍 1.2 概率论内容实现1.2.1 均值实现1.2.2 方差实现1.2.3 标准差实现1.2.4 协方差实现1.2.5 相关系数1.2.6 二项分布实现1.2.7 泊松分布实现1.2.8 正态分布1.2.9 指数分布1.2.10 中心极限定理的验证 1.1 概率论内容介绍…

视频合并:掌握视频嵌套合并技巧,剪辑高手的必备秘籍

在视频剪辑的过程中&#xff0c;掌握视频合并的技巧是每个剪辑高手必备的技能之一。通过合理的合并视频&#xff0c;可以增强视频的视觉效果&#xff0c;提高观看体验。 一、视频合并的准备工作 收集素材&#xff1a;在进行视频合并之前&#xff0c;首先需要收集足够的素材&a…

IIC 通信协议之stm32 驱动OLED

前言 使用stm32 驱动4 Pin 的OLED&#xff0c; 现在网上开源的资料多的是&#xff0c;但是为了锻炼自己使用第一手资料的能力&#xff0c;今天我还是从数据手册开始&#xff0c;从头造一波轮子&#xff0c;同时也是为了加深自己对 IIC 协议的理解 &#xff0c;本系列内容我会从…

数据库课后习题加真题

文章目录 第二章第三章第四到六章某年真题 第二章 第三章 3.8 对于教学数据库的三个基本表&#xff1a; s( 学号 ‾ \underline{学号} 学号​&#xff0c;姓名&#xff0c;年龄, 性别) sc( 学号 , 课程号 ‾ \underline{学号, 课程号} 学号,课程号​, 成绩) c( 课程号 ‾ \un…

详解ssh远程登录服务

华子目录 简介概念功能 分类文字接口图形接口 文字接口ssh连接服务器浅浅介绍一下加密技术凯撒加密加密分类对称加密非对称加密非对称加密方法&#xff08;也叫公钥加密&#xff09; ssh两大类认证方式&#xff1a;连接加密技术简介密钥解析 ssh工作过程版本协商阶段密钥和算法…

Jmeter配置脚本录制进行抓包并快速分析、定位接口问题

对于测试人员、开发人员来说&#xff0c;善用抓包工具确实是快速分析和定位问题的一大必备神技&#xff0c;现将配置过程记录如下: 1、打开jmeter后&#xff0c;首先添加—个线程组: 2、线程组可以重新命名按项目名称分类: 如果你想学习自动化测试&#xff0c;我这边给你推荐一…

苹果iOS系统开发APP应用启动几种速度优化技巧与实践

在移动应用开发过程中&#xff0c;启动速度是影响用户体验的关键因素之一。一个应用如果启动迅速&#xff0c;会给用户留下良好的第一印象&#xff0c;相反&#xff0c;如果启动缓慢&#xff0c;用户的耐心和满意度可能会大打折扣。对于iOS开发者而言&#xff0c;优化启动速度不…

图像分类(五) 全面解读复现ResNet

解读 Abstract—摘要 翻译 更深的神经网络往往更难以训练&#xff0c;我们在此提出一个残差学习的框架&#xff0c;以减轻网络的训练负担&#xff0c;这是个比以往的网络要深的多的网络。我们明确地将层作为输入学习残差函数&#xff0c;而不是学习未知的函数。我们提供了非…

【算法】最小生成树——普利姆 (Prim) 算法

目录 1.概述2.代码实现2.1.邻接矩阵存储图2.2.邻接表存储图2.3.测试 3.应用 1.概述 &#xff08;1&#xff09;在一给定的无向图 G (V, E) 中&#xff0c;(u, v) 代表连接顶点 u 与顶点 v 的边&#xff0c;而 w(u, v) 代表此边的权重&#xff0c;若存在 T 为 E 的子集且为无循…

浅谈滑动窗口

滑动窗口是什么&#xff1f; 滑动窗口其实是一个想象出来的数据结构。有左边界L和有边界R。 举例来说&#xff1a;数组 arr {3,1,5,7,6,5,8}; 其窗口就是我们规定的一个运动轨迹。 最开始时&#xff0c;边界LR都在数组的最左侧&#xff0c;此时没有包住任何数。 此时规定&…

测试老鸟总结,Web/APP与接口测试测试流程总结,避背黑锅...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、web测试流程 …

数据结构——树状数组

文章目录 前言问题引入问题分析树状数组lowbit树状数组特性初始化一个树状数组更新操作前缀和计算区间查询 总结 前言 原题的连接 最近刷leetcode的每日一题的时候&#xff0c;遇到了一个区间查询的问题&#xff0c;使用了一种特殊的数据结构树状数组&#xff0c;学习完之后我…

智慧工地APP全套源码,智慧工地云平台

智慧工地平台 &#xff0c;智慧工地源码&#xff0c;智慧工地APP全套源码 智慧工地以施工现场风险预知和联动预控为目标&#xff0c;将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关…

SOME/IP 协议介绍(五)指南

指南&#xff08;信息性&#xff09; 选择传输协议 SOME/IP直接支持互联网上使用最广泛的两种传输协议&#xff1a;用户数据报协议&#xff08;UDP&#xff09;和传输控制协议&#xff08;TCP&#xff09;。UDP是一种非常简洁的传输协议&#xff0c;仅支持最重要的功能&#…

03. Python中的语句

1、前言 在《Python基础数据类型》一文中&#xff0c;我们了解了Python中的基础数据类型&#xff0c;今天我们继续了解下Python中的语句和函数。 2、语句 在Python中常用的语句可以大致分为两类&#xff1a;条件语句、循环语句。 2.1、条件语句 条件语句就是我们编码时常见…

C语言ASCII码排序(1086: ASCII码排序(多实例测试))

题目描述 输入三个字符后&#xff0c;按各字符的ASCII码从小到大的顺序输出这三个字符。 输入&#xff1a;输入数据有多组&#xff0c;每组占一行&#xff0c;由三个字符组成&#xff0c;之间无空格。chu 输出&#xff1a;对于每组输入数据&#xff0c;输出一行&#xff0c;字符…

Codeforces Round 909 (Div. 3)(A~G)(启发式合并 , DSU ON TREE)

1899A - Game with Integers 题意&#xff1a;给定一个数 , 两个人玩游戏&#xff0c;每人能够执行 操作&#xff0c;若操作完是3的倍数则获胜&#xff0c;问先手的人能否获胜&#xff08;若无限循环则先手的人输&#xff09;。 思路&#xff1a;假如一个数模3余1或者2&#…

【具身智能评估2】具身视觉语言规划(EVLP)数据集基准汇总

参考论文&#xff1a;Core Challenges in Embodied Vision-Language Planning 论文作者&#xff1a;Jonathan Francis, Nariaki Kitamura, Felix Labelle, Xiaopeng Lu, Ingrid Navarro, Jean Oh 论文原文&#xff1a;https://arxiv.org/abs/2106.13948 论文出处&#xff1a;Jo…