南昌航空大学学士学位论文
4.3 LED点阵显示模块
4.3.1 LED点阵显示驱动
LED点阵显示模块完成对行扫描和列选择。将16位的行数据移位进入74HC164的寄存器中,将32位的列数据移位进入74HC595中。当完成一行的扫描输出一个脉冲信号isdone。由于人眼暂留时间,只有当画面刷新频率大于50Hz时才不会出现闪烁现象。更新行数据最大周期Tmax=1/50/16=1.25ms。程序中利用计数器cnt作为行移位标志,当计数器计数到19999时移位一次,T=(19999+1)/20000000=1ms,(系统使用20MHz晶振),所以本设计刷新周期为1ms。
以下代码为LED显示模块的端口例化程序: module displ_led(
input clk, input rst,
input [15:0] row_data,
input [31:0] data, output rclk, output sclk, output ser, output AB, output s_clk, output isdone );
AB,s_clk用于驱动74HC164;ser,sclk,rclk用于驱动74HC595。当输入 data=32'h55_55_F0_0A、row_data=16'b1111_1111_1111_1110时功能仿真波形如图4-3所示,相隔8个时钟周期ser更新一次数据,并且sclk产生一脉冲将列数据移位一次。移完所有32位数据时,rclk产生一脉冲信号将列数据锁存。同时isdone产生一脉冲用于与其他模块进行交互。
图4-3 点阵显示驱动仿真波形
16
南昌航空大学学士学位论文
4.3.2 行数据控制模块
行数据控制模块主要实现控制显示的上下移位功能。以下程序为此模块的例化程序:
module row_control(
input clk, input rst, input key_up,
input key_down,
);
input key_stop, output [15:0] row_data
其中,key_up表示上键标志信号,key_down表示下键标志信号,key_stop为停止移位标志信号,row_data为行数据输出。静态显示时,只要进行逐行扫描,第i位出现‘0’时,则选通第i行。所以当按下停止键时,则直接输出16'b1111_1111_1111_1110。当有其他键按下时则触发移位。移位时,首先启动计数器,当每计满9,999,999(即0.5s)时,行数据移位一次。如图4-4所示,仿真key_up键按下时,row_data每0.5s循环右移一次。
4.3.3 列数据控制模块
列数据控制模块主要实现左右移动、开帘、合拢四种显示方式的控制。 以下为模块的例化程序: module column_control(
input clk, input rst,
图4-4 行数据控制仿真波形
17
南昌航空大学学士学位论文
input key_left, input key_right, input key_stop, input [31:0] rdata, output [31:0] data );
其中,key_left表示左键标志信号,key_right表示右键标志信号,key_stop为停止移位标志信号,在没有读取到按键时显示方式为循环开帘和合拢。rdata为原列数据,data为移动后的列数据。移位速度为1/20s,如图4-5所示,当key_left键按下时,rdata=32'h05_05_A0_A0,每0.05s循环移位一次。
图4-5 列数据左移仿真波形
4.4 按键模块
一位按键模块debounce如图4-6所示,模块包括电平检查模块和延迟模块。
设计思路:
(1)一旦检测到有按键按下(高电平到低电平变化),电平检查模块就会拉高 H2L_Sig电平,然后拉低。
(2)10ms延迟模块检测到H2L_Sig为高电平时,就会利用10ms过滤H2L_Sig,拉高 输出。
(3)当按键被释放时,电平检测模块会拉高L2H_Sig,然后拉低。
图4-6 一位按键模块
18
南昌航空大学学士学位论文
(4)10ms延迟模块检查到L2H_Sig为高电平时,就会利用10ms过滤H2L_Sig,然后拉低输出。
组合按键则是组合五个独立按键模块,如图4-7所示。
以下为五位组合按键模块的实例化程序: module key_interface (
input CLK,
input RSTn,
图4-7 组合按键模块
input [4:0]Key_In, );
其中,五位Key_In输入连接至I/O端口,五位Key_Out主要传输给行列控制模块。
output [4:0]Key_Out
19
南昌航空大学学士学位论文
4.5 串口通信模块
4.5.1 串口接收模块
如图4-8所示,串口接收模块由电平检测模块、波特率定时模块和接收控制模块组成。
图4-8 串口接收模块
其中,detect_module模块的输入是连接至引脚rx,它主要检测一帧数据的第0位,也就是起始位,然后产生一个高脉冲经 H2L_Sig 给 rx_control_module模块 ,以表示一帧数据接收工作已经开始。
rx_bps_module模块是产生波特率定时的功能模块。它是配置波特率的模块。 当rx_control_module模块拉高Count_Sig, bps_module模块经BPS_CLK对rx_control_module模块产生定时。本设计使用9600bps传输速率。传输一位数据的周期是 0.000104166666666667s 。以20Mhz时钟频率要得到上述的定时需要设置的计数次数N:
N = 0.000104166666666667 / ( 1 / 20Mhz ) = 2083
如果从零开始算起 2083 - 1 亦即 2082 个计数。然而,采集数据要求“在周期的中间”,那么结果是 2082 / 2 ,结果等于 1041。基本上 rx_bps_module模块只有在 Count_Sig拉高的时候,模块才会开始计数。
rx_control_module模块是核心控制模块。针对串口的配置主要是1帧11位的数据,重视八位数据位,无视起始位、校验位和结束位。当RX_En_Sig拉高,这个模块就开始工作,它将采集来自RX_Pin_In的数据,当完成一帧数据接收的时候,就会产生一个高脉冲给 RX_Done_Sig。
20