基于FPGA的SOC外部组件控制器IP的设计
控制电路(Control Circuit)是lcd_fct 的核心。它控制数据输入寄存器(Data_in Register)、数据输出寄存器(Data_out Register)、状态寄存器(State Register)、控制寄存器(Control Register)和时间常数寄存器(Time Constant Register)。控制电路根据指令标志和时序来操作不同的寄存器,实现lcd_fct 的管理和运行。
数据输入寄存器接受来自MP 的数据并根据需要送数据到数据输出寄存器。数据输出寄存器把数据通过数据线lcd_db 送到LCD 模块的数据总线上。这个数据既可能是要显示的数据,也可能是指令。
控制寄存器产生操作LCD 的控制信号,如LCD 中选信号(lcd_e)、LCD 内部寄存器选择信号(lcd_rs)和LCD 读写信号(lcd_r_w)。
状态寄存器在LCD 处于工作下,会产生LCD 繁忙信号(lcd_busy)。这意味着,LCD 此时不会接受其它指令。与其它信号不同,lcd_busy 是发送给MP 的。
实际上lcd_fct 的运行操作主要是对各种控制、状态和数据信号进行管理。
4 FPGA 设计和仿真
在 lcd_fct 的FPGA 设计中,主要采用的VHDL 语言的程序设计[7]、MAX Plus-II 仿真以及SOC 和LCD 的实际连接调试。lcd_fct 的HVDL 设计框架如下:
Library
Entity lcd_fct is
Port( );
End lcd_fct;
Architecture struct of lcd_fct is
Signal
Constant
Begin
Res: process;
Clk :clk_div;
LCD: process;
Begin
If init then
Initialization;
Elsif clr then
Clear LCD;
Elsif addr then
Write address to LCD RAM;
Elsif data then
Write data to LCD RAM;
End if;
End process;
Us: ustimer;
Ms: mstimer;
End struct;
LCD 控制器IP 模块lcd_fct 的仿真结果如图3 所示。在图中左侧的信号就是lcd_fct 的输入/
输出信号。
图 3 lcd_fct 的功能仿真
当把write_e 设置成高电平时,指令写入lcd_fct。对于读写控制信号lcd_r_w 来说,低电平为写操作,高电平为读操作。由于该仿真都是lcd_fct 对LCD 进行写操作,lcd_r_w 始终为低电平。图中通过addrin 的变化来代表不同的指令。
在addrin 等于7FFF 时,lcd_db 被赋值01。这意味着LCD 被清屏。当addrin 等于7FFE,且data_in 送入31 时,lcd_db 被赋值31,LCD 就会显示“1”。 Addrin 被设置成7FFD,且data_in 等于8 时,被显示的字符将出现在显示屏的第8 个字符的位置,实现了定位显示功能。
当addrin 被赋值7FFC 时,LCD 被初始化。初始化包括功能设置、关闭显示、打开显示、清屏、显示移位和工作方式设置等操作。
由此可见,只要在SOC 的MP 中加入适当的指令,可以对addrin 进行控制,SOC 就可以完成对LCD 的管理。由于本设计中SOC 的MP 是可重配置MP,添加或修改指令是不存在问题的。仿真表明,lcd_fct 的设计达到了设计目标,操作结果是令人满意的。一般的LCD 程序控制完成一项操作(如初始化)需要执行多条软件指令。用FPGA 设计的lcd_fct 只要一条指令就能完成相应的操作,而且是硬件运行,效率提高了许多倍。
5 结论
组件控制器的设计是SOC 设计的重要组成部分。采用FPGA 是完成组件控制器设计的有效手段。通过LCD 控制器的设计和仿真,说明基于FPGA 的组件控制器可以用一条指令完成原来许多条指令才能完成的操作,可以大大提高系统的运行效率。因此,这是一项有意义的工作。
本文作者创新点在于把FPGA 设计和SOC 的组件控制器联系起来,并通过一个具体例子介绍了如何设计单指令驱动的组件控制器。
评论