安装网站提示dir,WordPress与dz用户恭喜,百度开户做网站2400,网络营销的特点包含目录
一、实验目的
二、实验仪器设备
三、实验原理
四、实验要求
五、实验步骤
六、实验报告
七、实验过程
1.矩阵键盘按键原理
2.数码管原理
3.分频器代码 4.电路图连接 5.文件烧录 一、实验目的
了解数码管的工作原理#xff1b;掌握4*4矩阵键盘和数码管显示的编…目录
一、实验目的
二、实验仪器设备
三、实验原理
四、实验要求
五、实验步骤
六、实验报告
七、实验过程
1.矩阵键盘按键原理
2.数码管原理
3.分频器代码 4.电路图连接 5.文件烧录 一、实验目的
了解数码管的工作原理掌握4*4矩阵键盘和数码管显示的编程方法。学会用于Verilog语言进行程序设计。
二、实验仪器设备
PC机一台。FPGA实验开发系统一套。
三、实验原理
本实验通过扫描4*4矩阵键盘的值在数码管上显示对应按钮的编号数据。矩阵键盘及数码管电路如下所示。 四、实验要求
预习教材中的相关内容。阅读并熟悉本次实验的内容。完成实验内容。
五、实验步骤
启动 Quartus II 建立一个空白工程选择的器件为 Altera 公司的 Cyclone 系列的 EP2C8Q240C8芯片命名为 keyarray.qpf新建一个 Schematic File 文件命名为 keyarray.bdf分别新建 3 个 Verilog HDL File 文件分别命名为 seg_show.v、 divclk.v、 keyarraycontrol.v。输入程序代码并保存对应源程序 8然后进行综合编译。若在编译过程中发现错误则找出错误并更正错误直至编译成功为止。从设计文件创建模块FileàCreat UpdateàCreat Symbol Files for Current File ,seg_show.v 生成名为 seg_show.bsf divclk.v 生成名为 divclk.bsf keyarraycontrol.v 生成名为keyarraycontrol.bsf在 keyarray.bdf 文件中在空白处双击鼠标左键在 Symbol 对话框左上角的 libraries 中,分别将 Project 下的 seg_show divclk, keyarraycontrol 模块放在图形文件 keyarray.bdf 中加入输入、输出引脚双击每个引脚进行引脚命名并锁定管脚将未使用的引脚设置为三态输入一定要设置否则可能会损坏芯片 将 keyarray.bdf 设置为顶层实体。对该工程文件进行全程编译处理若在编译过程中出现错误则找出错误并更正直至编译通过为止将 USB-Blaster 下载电缆的两端分别连接到 PC 机的 USB 接口和 EDA 实验箱上的 JTAG 下载口上打开电源执行下载命令把程序下载到 FPGA 器件中此时即可在 EDA 实验箱上通过按下相应的按键使蜂鸣器发出对应的音符声响。
完整的顶层模块原理图如图所示
六、实验报告
总结Verilog设计多路选择器使用的最基本与核心的语法知识。对仿真的结果进行分析。讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
七、实验过程
创建项目、创建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 1b1;
//将计数的最高位赋给key_clk
wire key_clk cnt[19]; // (2^20/50M 21)ms
//设定扫描状态判断参数
parameter NO_KEY_PRESSED 6b000_001; // 如果没有按键按下的时候
parameter SCAN_COL0 6b000_010; // 按下第一行按键
parameter SCAN_COL1 6b000_100; // 按下第二行按键
parameter SCAN_COL2 6b001_000; // 按下第三行按键
parameter SCAN_COL3 6b010_000; // 按下第四行按键
parameter KEY_PRESSED 6b100_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 ! 4hF) next_state SCAN_COL0; else next_state NO_KEY_PRESSED; SCAN_COL0 : // if (row ! 4hF) next_state KEY_PRESSED; else next_state SCAN_COL1; SCAN_COL1 : // if (row ! 4hF) next_state KEY_PRESSED; else next_state SCAN_COL2; SCAN_COL2 : // if (row ! 4hF) next_state KEY_PRESSED; else next_state SCAN_COL3; SCAN_COL3 : //if (row ! 4hF) next_state KEY_PRESSED; else next_state NO_KEY_PRESSED; KEY_PRESSED : // if (row ! 4hF) 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 4h0; keyint0; end else case (next_state) NO_KEY_PRESSED : // begin col 4h0; keyint 0; // end SCAN_COL0 : // col 4b1110; SCAN_COL1 : col 4b1101; SCAN_COL2 : // col 4b1011; SCAN_COL3 : // col 4b0111; KEY_PRESSED : // begin col_val col; // 得到列的值row_val row; // 得到行的值keyint 1; // end endcase always (posedge key_clk, negedge rst) if (!rst) keydata 16h0000; else if (keyint) case ({col_val, row_val}) 8b1110_1110 : keydata 8d0; 8b1110_1101 : keydata 8d4; 8b1110_1011 : keydata 8d8; 8b1110_0111 : keydata 8d12; 8b1101_1110 : keydata 8d1;8b1101_1101 : keydata 8d5;8b1101_1011 : keydata 8d9; 8b1101_0111 : keydata 8d13;8b1011_1110 : keydata 8d2; 8b1011_1101 : keydata 8d6; 8b1011_1011 : keydata 8d10; 8b1011_0111 : keydata 8d14; 8b0111_1110 : keydata 8d3;8b0111_1101 : keydata 8d7;8b0111_1011 : keydata 8d11;8b0111_0111 : keydata 8d15; default: keydata keydata; endcase elsekeydata keydata;
endmodule2.数码管原理 数码管分为共阴和共阳两种通过选择器的高低电平去判断选取到的位数所以数码管的读取是先选择位然后再去显示亮的灯。下图所示下面的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)begincnt cnt 1; cnt2 cnt2 1;if (cnt)beginsel_lock 1b1;seg_lock 1b0; gpio 8h00;#20 sel_lock 1b0;seg_lock 1b1; endelsebeginsel_lock 1b0;seg_lock 1b1; disp_dat data; case(disp_dat) 4h0:gpio8h3f; //0 0011 11114h1:gpio8h06; //1 0000 01104h2:gpio8h5b; //24h3:gpio8h4f; //34h4:gpio8h66; //44h5:gpio8h6d; //54h6:gpio8h7d; //64h7:gpio8h07; //74h8:gpio8h7f; //84h9:gpio8h6f; //94ha:gpio8h77; //a4hb:gpio8h7c; //b4hc:gpio8h39; //c4hd:gpio8h5e; //d4he:gpio8h79; //e4hf:gpio8h71; //fendcase#20 sel_lock 1b1;seg_lock 1b0;end
end
endmodule
3.分频器代码
module divclk(inclk,outclk);input inclk;output outclk;reg outclk;reg [16:0] cnt;initialbegincnt0;outclk0;endalways (posedge inclk)begincntcnt1;if (cnt0)outclk outclk1;end
endmodule 4.电路图连接
写好了Verilog代码就进行分析错误分析无误后我们就对这些代码生成子模块文件。然后就创建block文件开始连接电路图电路图以及管脚配置如下 5.文件烧录
弄好了之后就是最后一步操作了把没用到的管脚设置三态然后烧录文件。
点击Assignment Device 然后点击这里设置管脚。 选择第一个就行了就是把多余的管脚设置三态。 然后就是编译运行文件运行无误。
点击此处烧录文件。 这里我们会看到下面有一个芯片这个也就是我们写好了的sof文件然后就是通过你的电脑接口去连接到开发板如果你看到上面有一个No Hardware的时候你点击旁边的按钮进行接口设置设置为USB接口即可USB线连接了你的开发板就会自动显示出来的。最后点击start就可以进行烧录了。
以上就是本期的全部内容了我们下一次见
分享一张壁纸