福永医院网站建设2017做哪些网站致富

当前位置: 首页 > news >正文

福永医院网站建设,2017做哪些网站致富,美发网站模板,网站如何做国外推广一、概述 按键控制数码管是一种常见的电子显示技术#xff0c;它结合了按键输入与数码管显示的功能。在这一设计中#xff0c;用户通过按下不同的按键来发送指令#xff0c;这些指令随后被处理并转换为数码管上显示的数字或字符。按键通常作为输入设备#xff0c;通过电路…一、概述 按键控制数码管是一种常见的电子显示技术它结合了按键输入与数码管显示的功能。在这一设计中用户通过按下不同的按键来发送指令这些指令随后被处理并转换为数码管上显示的数字或字符。按键通常作为输入设备通过电路连接到微控制器如FPGA、单片机等的输入引脚而数码管则作为输出设备其显示内容由微控制器控制。 按键控制数码管的设计可以包括以下几个步骤 按键输入处理微控制器不断扫描按键的状态当检测到按键被按下时根据按键的编号或功能执行相应的操作。 指令转换将按键的输入转换为数码管能够理解的显示指令。这通常涉及将按键编号或功能映射到特定的数字或字符编码。 数码管显示控制微控制器根据转换后的显示指令通过控制数码管的驱动电路来点亮或熄灭数码管中的不同段从而显示出所需的数字或字符。 循环扫描与更新为了保持数码管显示内容的实时性微控制器需要不断重复上述步骤形成一个循环扫描和更新的过程。
二、工程实现 1、基本思路构建 在本篇文章中我们以按键控制单个数码管为例讲解通过按键改变数码管显示的值的设计基本思路如下 在默认情况下数码管正常显示当按下按键1时数码管从正常显示的状态跳转到设置的状态接着通过按键二队数码管显示的值进行一个改变最后在按下按键1使得数码管从设置状态有重新回到正常显示状态如此往复设计。 2、设计文件的编写 新建一个seg0.v文件 module seg0(input clk,input rst_n,input [1:0] key_in,input seg_sel,//位选output reg [7:0] seg_dual//段选 ); localparam ZERO 8b1100_0000, //共阳极段码ONE 8b1111_1001,TWO 8b1010_0100,THREE 8b1011_0000,FOUR 8b1001_1001,FIVE 8b1001_0010,SIX 8b1000_0010,SEVEN 8b1111_1000,EIGHT 8b1000_0000,NINE 8b1001_0000,A 8b1000_1000,b 8b1000_0011,c 8b1100_0110,d 8b1010_0001,E 8b1000_0110,f 8b1000_1110; reg [26:0] cnt; wire add_cnt; wire end_cnt; reg [4:0] flag; wire add_flag; wire end_flag;reg seg_flag;//数码管状态切换标志位 always (posedge clk or negedge rst_n)beginif(!rst_n)cnt0;else if(add_cnt)beginif(end_cnt)cnt0;elsecntcnt1b1;end end assign add_cnt1b1; assign end_cntadd_cnt (cnt50_000_000-1);always (posedge clk or negedge rst_n)beginif(!rst_n)flag0;else if(seg_flag1 key_in[1])flagflag1b1;else if(add_flag)beginif(end_flag)flag0;elseflagflag1b1;end end assign add_flagend_cnt; assign end_flagadd_flag (flag16-1);always (posedge clk or negedge rst_n)beginif(!rst_n)seg_flag0;else if(key_in[0])seg_flag~seg_flag;else seg_flagseg_flag; endalways (posedge clk or negedge rst_n)beginif(!rst_n)seg_dual8b1111_1111;else if(seg_flag0)begincase (flag)4d0:seg_dual ZERO ;4d1:seg_dual ONE ;4d2:seg_dual TWO ;4d3:seg_dual THREE; 4d4:seg_dual FOUR ;4d5:seg_dual FIVE ;4d6:seg_dual SIX ;4d7:seg_dual SEVEN;4d8:seg_dual EIGHT;4d9:seg_dual NINE ;4d10:seg_dualA ;4d11:seg_dualb ;4d12:seg_dualc ;4d13:seg_duald ;4d14:seg_dualE ;4d15:seg_dualf ;default: ;endcaseend end endmodule
新建一个key.v文件 //状态机实现 module key (input clk ,input rst_n ,input [1:0] key_in , //输入原始的按键信号output reg [1:0] key_out //输出处理之后的按键信号 ); //参数定义localparam IDLE 4b0001,//空闲JITTLE0 4b0010,//滤除第一次抖动DOWN 4b0100,//稳定JITTLE1 4b1000;//滤除第二次抖动parameter TIME_20MS 1_000_000;//需要计数的值20ms//内部信号reg [3:0] state_c;//现态reg [3:0] state_n;//次态reg [19:0] cnt_20ms;//计数20mswire add_cnt_20ms;wire end_cnt_20ms;wire [1:0] nedge ;//下降沿信号wire [1:0] pedge ;//上升沿信号reg [1:0] key_in_r1 ;//打两拍 同步打拍reg [1:0] key_in_r2 ;//状态转移 同步时序逻辑描述状态转移always (posedge clk or negedge rst_n) beginif(!rst_n)state_c IDLE;elsestate_c state_n;end//状态转移条件 组合逻辑always (*) begincase (state_c)//一定是case 现态IDLE:beginif(nedge)state_n JITTLE0;elsestate_n state_c;endJITTLE0:beginif(end_cnt_20ms)state_n DOWN;elsestate_n state_c; endDOWN:beginif(pedge)state_n JITTLE1;elsestate_n state_c;endJITTLE1 :beginif(end_cnt_20ms)state_n IDLE;elsestate_n state_c; end default: state_n IDLE;endcaseend//20ms计数器 always (posedge clk or negedge rst_n) beginif(!rst_n)cnt_20ms 0;else if(add_cnt_20ms)beginif(end_cnt_20ms)cnt_20ms 0;elsecnt_20ms cnt_20ms 1;end endassign add_cnt_20ms (state_c JITTLE0) || (state_c JITTLE1); assign end_cnt_20ms add_cnt_20ms cnt_20ms TIME_20MS - 1;//下降沿 上升沿 //同步 打拍 always (posedge clk or negedge rst_n)begin if(!rst_n)beginkey_in_r1 2b11;key_in_r2 2b11;end else begin key_in_r1 key_in; //同步按键输入信号key_in_r2 key_in_r1; //打拍end end//r1当前状态r2上一个状态 assign nedge ~key_in_r1 key_in_r2; assign pedge key_in_r1 ~key_in_r2;//key_outalways (posedge clk or negedge rst_n) beginif(!rst_n)key_out 0;else if(end_cnt_20ms (state_c JITTLE1))key_out ~key_in_r2;//有效脉冲 20nselse key_out 0;endendmodule 3、新建一个顶层文件top.v用于将数码管和按键连接起来。 module top(input clk,input rst_n,input [1:0] key_in,output seg_sel,output [7:0] seg_dual); wire [1:0] key_flag; key key_inst(/*input */ .clk (clk ),/*input */ .rst_n (rst_n ),/*input */ .key_in (key_in ), //输入原始的按键信号/*output */ .key_out (key_flag ) //输出处理之后的按键信号 );seg0 seg_inst(/*input */ .clk (clk ),/*input */ .rst_n (rst_n ),.key_in (key_flag), ///*input */ .seg_sel (seg_sel ),//位选/output/ .seg_dual (seg_dual )//段选 );endmodule 4、测试文件的编写 其实这里我不推荐进行波形图仿真的因为仿真需要编写的条件非常多相比之下使用在线调试工具进行实时调试更好。这里我也给一个测试文件需要的小伙伴可以加以完善。 //定义时间尺度 timescale 1ns/1ns module top_tb ;//输入信号定义 reg clk; reg rst_n; reg [1:0] key_in; wire [7:0] seg_dual; wire seg_sel; defparam top_inst.cnt_inst.TIME_1s500; //模块例化 top top_inst(/*input */.clk (clk ),/*input */.rst_n (rst_n ),/*input */.key_in (key_in ),/output/.seg_sel (seg_sel ),/output/.seg_dual (seg_dual)); //激励信号产生 parameter CLK_CLY 20; //时钟 initial clk1; always #(CLK_CLY/2)clk~clk;//复位 initial beginrst_n 1b0;#(CLK_CLY*3);#5;//复位结束避开时钟上升沿rst_n 1b1; end//激励 //激励 integer i; initial repeat(5)beginkey_in[1] 1;//模拟按键未按下i {\(random}%6;//给i赋值0-5#(CLK_CLY*500);//等待复位时间结束#3;key_in[1] 0;//前按键抖动开始#(CLK_CLY*1);//一个5-10ms的抖动时间repeat ((i5)*50)beginkey_in[1] \)random;#(CLK_CLY*1);end key_in[1] 0;//按键稳定#(CLK_CLY*100*500);//后抖动开始key_in[1] 1;#(CLK_CLY*1);repeat ((i5)*50)beginkey_in[1] \(random;#(CLK_CLY*1);end key_in[1] 1;//按键稳定#(CLK_CLY*10*5000);key_in[2] 1;//模拟按键未按下i {\)random}%6;//给i赋值0-5#(CLK_CLY*500);//等待复位时间结束#3;key_in[2] 0;//前按键抖动开始#(CLK_CLY*1);//一个5-10ms的抖动时间repeat ((i5)*50)beginkey_in[2] \(random;#(CLK_CLY*1);end key_in[2] 0;//按键稳定#(CLK_CLY*100*500);//后抖动开始key_in[2] 1;#(CLK_CLY*1);repeat ((i5)*50)beginkey_in[2] \)random;#(CLK_CLY*1);end key_in[2] 1;//按键稳定#(CLK_CLY*10*5000);key_in[0] 1;//模拟按键未按下i {\(random}%6;//给i赋值0-5#(CLK_CLY*500);//等待复位时间结束#3;key_in[0] 0;//前按键抖动开始#(CLK_CLY*1);//一个5-10ms的抖动时间repeat ((i5)*50)beginkey_in[0] \)random;#(CLK_CLY*1);end key_in[0] 0;//按键稳定#(CLK_CLY*100*500);//后抖动开始key_in[0] 1;#(CLK_CLY*1);repeat ((i5)*50)beginkey_in[0] \(random;#(CLK_CLY*1);end key_in[0] 1;//按键稳定#(CLK_CLY*10*5000);key_in[0] 1;//模拟按键未按下i {\)random}%6;//给i赋值0-5#(CLK_CLY*500);//等待复位时间结束#3;key_in[0] 0;//前按键抖动开始#(CLK_CLY*1);//一个5-10ms的抖动时间repeat ((i5)*50)beginkey_in[0] \(random;#(CLK_CLY*1);end key_in[0] 0;//按键稳定#(CLK_CLY*100*500);//后抖动开始key_in[0] 1;#(CLK_CLY*1);repeat ((i5)*50)beginkey_in[0] \)random;#(CLK_CLY*1);end key_in[0] 1;//按键稳定#(CLK_CLY*10*5000);key_in[1] 1;//模拟按键未按下i {\(random}%6;//给i赋值0-5#(CLK_CLY*500);//等待复位时间结束#3;key_in[1] 0;//前按键抖动开始#(CLK_CLY*1);//一个5-10ms的抖动时间repeat ((i5)*50)beginkey_in[1] \)random;#(CLK_CLY*1);end key_in[1] 0;//按键稳定#(CLK_CLY*100*500);//后抖动开始key_in[1] 1;#(CLK_CLY*1);repeat ((i5)*50)beginkey_in[1] \(random;#(CLK_CLY*1);end key_in[1] 1;//按键稳定#(CLK_CLY*10*5000);//模拟意外抖动repeat (3)begin repeat ((i5)*50)beginkey_in \)random;#(CLK_CLY*1);end key_in 1;//按键稳定#(CLK_CLY*5000);end $stop; end endmodule 5、下板验证 在进行下板验证之后最终实现的效果和我们所改造的预期结果一致这里格式限制上传不了视频就不展示了。在下板验证时设计的引脚配置等由用户自己根据需求去设置。 三、不足之处 经过最后的检查之后发现在开发板上进行验证时在使用按键进行数码管显示数值的改变的这个过程当中我们看不到因为是在标志位位1时计数里面进行改变而我们的输出是在标志位为0时进行显示的所以看不到这里我们对seg0设计进行一个最简单粗暴的方法进行修改。这里修改的方法很low了在后面的数字时钟的文章中我会加以完善不足之处多多包涵。 修改之后的seg0文件 //分频器 module seg0(input clk,input rst_n,input [1:0] key_in,input seg_sel,//位选output reg [7:0] seg_dual//段选 ); localparam ZERO 8b1100_0000, //共阳极段码ONE 8b1111_1001,TWO 8b1010_0100,THREE 8b1011_0000,FOUR 8b1001_1001,FIVE 8b1001_0010,SIX 8b1000_0010,SEVEN 8b1111_1000,EIGHT 8b1000_0000,NINE 8b1001_0000,A 8b1000_1000,b 8b1000_0011,c 8b1100_0110,d 8b1010_0001,E 8b1000_0110,f 8b1000_1110; reg [26:0] cnt; wire add_cnt; wire end_cnt; reg [4:0] flag; wire add_flag; wire end_flag;reg seg_flag;//数码管状态切换标志位 always (posedge clk or negedge rst_n)beginif(!rst_n)cnt0;else if(add_cnt)beginif(end_cnt)cnt0;elsecntcnt1b1;end end assign add_cnt1b1; assign end_cntadd_cnt (cnt50_000_000-1);always (posedge clk or negedge rst_n)beginif(!rst_n)flag0;else if(add_flag)beginif(end_flag)flag0;elseflagflag1b1;end end assign add_flagend_cnt; assign end_flagadd_flag (flag16-1);always (posedge clk or negedge rst_n)beginif(!rst_n)seg_flag0;else if(key_in[0])seg_flag~seg_flag;else seg_flagseg_flag; endalways (posedge clk or negedge rst_n)beginif(!rst_n)seg_dual8b1111_1111;else if(seg_flag0)begincase (flag)4d0:seg_dual ZERO ;4d1:seg_dual ONE ;4d2:seg_dual TWO ;4d3:seg_dual THREE; 4d4:seg_dual FOUR ;4d5:seg_dual FIVE ;4d6:seg_dual SIX ;4d7:seg_dual SEVEN;4d8:seg_dual EIGHT;4d9:seg_dual NINE ;4d10:seg_dualA ;4d11:seg_dualb ;4d12:seg_dualc ;4d13:seg_duald ;4d14:seg_dualE ;4d15:seg_dualf ;default: ;endcaseend else if(seg_flag1)beginif(key_in[1])begincase (flag)4d0:seg_dual ZERO ;4d1:seg_dual ONE ;4d2:seg_dual TWO ;4d3:seg_dual THREE; 4d4:seg_dual FOUR ;4d5:seg_dual FIVE ;4d6:seg_dual SIX ;4d7:seg_dual SEVEN;4d8:seg_dual EIGHT;4d9:seg_dual NINE ;4d10:seg_dualA ;4d11:seg_dualb ;4d12:seg_dualc ;4d13:seg_duald ;4d14:seg_dualE ;4d15:seg_dualf ;default: ;endcaseendend end endmodule
经过本次修改之后就可以观察得到数码管显示数值的一个修改过程到这里本次设计也就结束了。