1、1,那么输出col输出信号将发生变化,Out1变为0,则col0col3输出分别为“1110”。可通过行扫描码和列输出码来获得分时扫描的键盘按压信号。只要扫描时间适当,就可得到按键的按压情况。3、键盘输入一个完整的键盘控制程序应解决以下任务:(1)检测有无按键按下(2)有键按下,在无硬件去抖得情况下,应有软件延时除去抖动影响(3)键扫描程序(4)将键编码转换成相应键值整个设计程序包括三个模块:时钟分频、键盘扫描和键译码转换。为了显示,还必须在顶层添加显示部分。 由于使用的外部时钟频率为50MHz,这个频率对扫描来说太高,所以这里需要一个分频器来分得适合键盘扫描使用的频率。三、程序框图(流程图)
2、四、源程序&仿真波形 该系统主要由以下几个模块组成:1.时钟分频模块由于主芯片提供的频率赫兹与实际应用的频率不一样,所以必须将实验箱提供的时钟信号分频达到利用目的。代码如下:entity clk_devider is Port ( clkin : in STD_LOGIC; clkout : out STD_LOGIC);end clk_devider;architecture Behavioral of clk_devider is signal Counter: Integer RANGE 1 TO 5000; SIGNAL Clk:std_logic;beginPROCESS(clkin
3、) BEGIN IF (clkinevent AND clkin =1) THEN IF Counter= 5000 THEN Counter = 1; Clk=NOT Clk; ELSE Counter=Counter +1; END IF; END IF;END PROCESS; clkout =Clk;end Behavioral;仿真波形:由于分频频率过低,仿真波形不太明显,所以将修改counter=5000改为counter=5.2.键盘扫描模块 由于需要键盘输入数值,所以需要扫描键盘数值。键盘模型如图:键盘扫描原理:如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的
4、交点处有按键按下。同时定义两个key_value存储键盘先后输入的两个数值,并且相加输出。键盘扫描代码:entity key_scan is Port ( clk : t_out:out STD_LOGIC_VECTOR (1 downto 0); key_in : in STD_LOGIC_VECTOR (5 downto 0); key_out : out STD_LOGIC_VECTOR (3 downto 0); key_value_tmp : out STD_LOGIC_VECTOR (4 downto 0); key_value : out STD_LOGIC_VECTOR (4
5、downto 0);end key_scan;architecture Behavioral of key_scan is signal scan ,scan_tp:STD_LOGIC_VECTOR(3 downto 0); signal flag:integer range 1 to 4; signal en_tp,en_old,en:STD_LOGIC; signal key_value_lock,key_value_lock1,key_value_lock_tp,key_value_lock_tp1:STD_LOGIC_VECTOR (9 downto 0); signal light_
6、out,light_out1 : signal cnt_low:STD_LOGIC_VECTOR (9 downto 0):=0000000000; signal cnt_high: key_out=scan; key_value=0&light_out;-key_in&scan; key_value_tmplight_out1; t_out(0)=en; t_out(1) process(clk) begin if (clkevent and clk=)then if(flag=1)then scan1110 flag=2; elsif(flag=2)then scan1101=3; els
7、if(flag=3)then1011=4; elsif(flag=4)then0111=1; end if; end if; end process; if(key_in(0) and key_in(1) and key_in(2) and key_in(3) and key_in(4) and key_in(5)= )then scan_tp en_tp -key_value_lock1=key_value_lock; key_value_lock_tp=key_in& if(key_in(0) and key_in(1) and key_in(2) and key_in(3) and ke
8、y_in(4) and key_in(5)= and scan_tp=scan )then if(en_tp= if(cnt_low100)then cnt_low=cnt_low+1; cnt_high); else if(cnt_high cnt_high=cnt_high+1; cnt_low end if; en_old 50 )then en 50 )then process(clk) if(en_old= and en= key_value_lock_tp1=key_value_lock_tp; if(en_old= )then key_value_lock1 key_value_
9、locklight_outZZZZZZZZ when others =NULL; end case; case(key_value_lock1) islight_out1键盘扫描仿真波形:仿真图表示键盘输入数字1.3.加法模块键盘输入两个值后,将之转换成8421码制,并且相加,同时需要判断是否进位点亮十位的数码管。加法模块代码:entity add is anum : in STD_LOGIC_VECTOR (4 downto 0); bnum : sum : cout :end add;architecture Behavioral of add is signal result_tmp:
10、std_logic_vector(4 downto 0); signal result_tmpa: sum=result_tmp(3 downto 0); if (clk result_tmpa01010 result_tmp=result_tmpa- cout else result_tmp=result_tmpa; end if;加法模块仿真波形:图中表示先后输入1和6,并且最后求和赋给了result=7.LED显示模块:键盘输入的数字需要在八段数码管显示,并且最后需要显示相加的和。显示代码如下: entity led is Port ( key_in : in STD_LOGIC_VEC
11、TOR (3 downto 0); light_out : out STD_LOGIC_VECTOR (7 downto 0); clk : in STD_LOGIC);end led;architecture Behavioral of led isprocess(clk) case(key_in) is00111111000001100101101101001111011001100110110101111101000001110111111101101111 end case;七、实验中遇到的问题和解决方法VHDL语言与我们所了解的C、C+很不一样,他的所有进程都是并行的,当然还有其他很
12、多不一样的地方,所有可能接受起来有些吃力,导致我们做了好几次都没有弄出来,在老师给了重点地方的代码之后还是没弄出来,直到老师给了完整的程序之后才算是可以运行。仿真的时候由于不会设置I/O口的状态,而用相对简单的Quartus实现的。这次试验不尽如人意。在实验中也遇到了很多问题,感觉自己解决问题的能力很弱,就像找不着对应的I/O口,其实可以通过自己的能力解决的,但是因为有老师在,就觉得有指望,所以造成了自己的这种惰性,以后一定要努力克服自己的这种性格。据我了解到,VHDL是现在很有用的一门语言,很多专业都在学习,但是以我个人观点来看,这门课应该至少设置六学分,且设置为必修课。结束了这门课以后我们也应当在课下多多实践。尽量掌握好这样一种很有用的工具。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1