一、 实验目的
1. 了解基于FPGA的数字电子时钟的实现原理及设计方法; 掌握Quartus_II环境下的模块化、层次化的设计与实现方法; 掌握数字应用系统的 Verilog HDL设计与实现技术。
2. 对数字时钟进行功能模块划分,对各模块进行详细的功能定义。
3. 对划分好的功能模块进行详细编程设计及仿真设计,包括定时计数、显示、时间调整、响铃等。
4. 分析仿真结果,并进行顶层模块设计及功能测试。
完整可执行工程文件见文末。
二、 实验过程步骤
1、设计模块1:LCD显示静态字符串lcd_mode
a.模块功能要求
(1)硬件工作原理
LCD模块内部示意图如下所示:
(2)DDRAM 数据显示用的RAM(Data Display RAM)
这块存储器是用来存放我们要LCM显示的资料,只要将标准的ASCII码放入DDRAM中,内部线路会自动以该ASCII码为地址,将相应的数据送到显示器上。
IR 寄存器负责存储MAX II要写给LCM的指令码。当芯片要下一个命令到IR寄存器时,必须要控制LCM的RS、R/W及E这三个引脚。当RS和R/W引脚信号均为0,E引脚信号由1变为0时,就会把在lcd_data[0]-[7]引脚上的数据存入IR寄存器。
本实验中所使用的字符与字符码对照表如下:
(3)控制器指令
程序流程图如下:
在LCD上显示静态字符串,进行静态字符的对齐设置在Set address这一步骤中进行,即设置LCM起始字符的显示位置。
b.实验步骤
(1)利用wizard新建项目,所选器件为MAX II 系列型号为EPM1270T144C5N的器件。
(2)新建Verilog文件,名称与模块名一致,保存为lcd1602.v。程序内容如下:
module lcd1602(clk,rst,rs,rw,lcd_en,lcd_data);
input clk,rst;
output rs,rw,lcd_en;
output [7:0]lcd_data;
wire en_20us,en_200us,en_1s;
reg [3:0]state_q,data_q;
reg [7:0]lcd_data;
reg lcd_en;
assign rw=1'b0;
assign rs=state_q[3] | state_q[2] & state_q[1] & ~state_q[0];
assign state_end=en_200us & ~lcd_en & (~rs | data_q[3] & data_q[2] & data_q[1] & data_q[0]);
div_mode U1(clk,rst,1'b1,en_20us,en_200us,en_1s);
always@(posedge clk or negedge rst)
if(~rst)
state_q<=4'b0000;
else if(state_end)
begin
if(state_q[3]) //when q[3]=1xxx(8), give 5
state_q<=4'b0101;
else
state_q<=state_q +1'b1; //state_q's period = 5-8
end
always@(posedge clk or negedge rst)
if(~rst)
data_q<=4'b0000;
else if(state_end)
data_q<=