差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | |||
book_excise_keyscan_7seg [2021/08/18 17:20] zili |
book_excise_keyscan_7seg [2021/08/18 17:22] (当前版本) zili |
||
---|---|---|---|
行 77: | 行 77: | ||
</code> | </code> | ||
- | 键盘扫锚时钟scan_clk周期为4ms,脉宽为一个时钟周期(图 10 5)。 | + | 键盘扫锚时钟scan_clk周期为4ms,脉宽为一个时钟周期(图10-5)。 |
{{ :图10-5.png |图10-5 扫描时钟波形}} | {{ :图10-5.png |图10-5 扫描时钟波形}} | ||
<WRAP centeralign> | <WRAP centeralign> | ||
行 98: | 行 98: | ||
</code> | </code> | ||
- | kr、kc和scan_clk用于实现对键盘按键的扫描;add_r和add_c输出按键的行值和列值;keyout_en是按键输出使能,当keyout_en为高时,表示add_r和add_c有效,keyout_en宽度为一个时钟周期,如图10 6所示。 | + | kr、kc和scan_clk用于实现对键盘按键的扫描;add_r和add_c输出按键的行值和列值;keyout_en是按键输出使能,当keyout_en为高时,表示add_r和add_c有效,keyout_en宽度为一个时钟周期,如图10-6所示。 |
{{ :图10-6.png |图10-6 Scan模块行列值输出接口时序}} | {{ :图10-6.png |图10-6 Scan模块行列值输出接口时序}} | ||
<WRAP centeralign> | <WRAP centeralign> | ||
行 194: | 行 194: | ||
#### 3.5 data_2_disp模块(data_2_disp.v) | #### 3.5 data_2_disp模块(data_2_disp.v) | ||
- | 由于scan模块输出的按键行值和列值都是4比特二进制数。但八段数码管的输入为八位,其中七位输入用于显示一位阿拉伯数字,每一位控制数码管的一段,另一位用于显示小数点。因此需要将输入的4bits数据译码为8bits二进制数据,控制八段数码管各段的显示。图10 8为八段数码管显示示意图。 | + | 由于scan模块输出的按键行值和列值都是4比特二进制数。但八段数码管的输入为八位,其中七位输入用于显示一位阿拉伯数字,每一位控制数码管的一段,另一位用于显示小数点。因此需要将输入的4bits数据译码为8bits二进制数据,控制八段数码管各段的显示。图10-8为八段数码管显示示意图。 |
{{ :图10-8.png |图10-8 八段数码管示意图}} | {{ :图10-8.png |图10-8 八段数码管示意图}} | ||
<WRAP centeralign> | <WRAP centeralign> | ||
行 269: | 行 269: | ||
本实验的 Testbench为test_key.v,主要用于对scan模块进行仿真。test_key.v的时钟与系统时钟一样为50MHz,由延时语句输入一系列kr的值,调用scan.v扫描程序观察相应的kc输出时各变量的状态。 | 本实验的 Testbench为test_key.v,主要用于对scan模块进行仿真。test_key.v的时钟与系统时钟一样为50MHz,由延时语句输入一系列kr的值,调用scan.v扫描程序观察相应的kc输出时各变量的状态。 | ||
- | 图10 9是键盘扫描的仿真波形,整个扫描过程由状态机来控制,系统复位的状态是wating=4’h1,在waiting状态下输出为4’b1111。如果检测到输入不全为低电平则转到去抖动状态anti_jitter=4’h2。此时继续检测输入端口,如果连续8次(delay的值)检测输入值都相同,则说明有键按下,进入下一个状态scaning=4’h4, 否则认为是毛刺。在scaning状态下kc依次输出4’b1000、4’b0100、4’b0010、4’b0001,然后根据输入kr的值来确定具体是哪一个键按下。在图中可以看到当add_r=4’h4 ,add_c=4’h2时,此时kr=4’h8,kc=4’h1确定第4行第1列的键——S18按下。扫描结束后进入ending=4’h8状态,经过4ms*8=32ms之后,又进入下一轮扫描过程。 | + | 图10-9是键盘扫描的仿真波形,整个扫描过程由状态机来控制,系统复位的状态是wating=4’h1,在waiting状态下输出为4’b1111。如果检测到输入不全为低电平则转到去抖动状态anti_jitter=4’h2。此时继续检测输入端口,如果连续8次(delay的值)检测输入值都相同,则说明有键按下,进入下一个状态scaning=4’h4, 否则认为是毛刺。在scaning状态下kc依次输出4’b1000、4’b0100、4’b0010、4’b0001,然后根据输入kr的值来确定具体是哪一个键按下。在图中可以看到当add_r=4’h4 ,add_c=4’h2时,此时kr=4’h8,kc=4’h1确定第4行第1列的键——S18按下。扫描结束后进入ending=4’h8状态,经过4ms*8=32ms之后,又进入下一轮扫描过程。 |
在anti_jitter状态下修改参数delay的变化情况可以控制去抖动的时间;在ending状态下修改delay的变化范围可以改变连续两次扫描之间的时间间隔,这些值可以根据实际情况进行调整。 | 在anti_jitter状态下修改参数delay的变化情况可以控制去抖动的时间;在ending状态下修改delay的变化范围可以改变连续两次扫描之间的时间间隔,这些值可以根据实际情况进行调整。 | ||
行 277: | 行 277: | ||
### 5. 运行结果 | ### 5. 运行结果 | ||
- | 在signaltap里选择要观察的信号,如图10 10。其中将Keyout_en设置为上边沿触发,这样当键盘扫描减速,keyout_en拉高后,signaltap会暂停。在设定好观察的信号后,对程序进行编译。将程序下载到开发系统上,选择signaltap的Autorun Analysis。然后按下任意一个按键,如按下行地址为2,列地址为4的键。则会看到如下结果,add_c和add_r分别键盘显示列地址和行地址,在数码管上可以看到行值和列值的显示。 | + | 在signaltap里选择要观察的信号,如图10-10。其中将Keyout_en设置为上边沿触发,这样当键盘扫描减速,keyout_en拉高后,signaltap会暂停。在设定好观察的信号后,对程序进行编译。将程序下载到开发系统上,选择signaltap的Autorun Analysis。然后按下任意一个按键,如按下行地址为2,列地址为4的键。则会看到如下结果,add_c和add_r分别键盘显示列地址和行地址,在数码管上可以看到行值和列值的显示。 |
{{ :图10-10.png |图10-10 程序运行结果}} | {{ :图10-10.png |图10-10 程序运行结果}} | ||
<WRAP centeralign> | <WRAP centeralign> |