自己继续edk的基础实验,因为lab3实验是在microblaze的系统中,在PLB46总线上挂一个LCD的控制器,控制板卡上的字符型 LCD。之前在8.2的edk基础实验中都是悬挂控制8个LED的控制器,所以那个时候没有做过这个LCD实验。也吃不准它会不会有什么问题。于是先拿 spartan3E的板卡尝试一下,之后再移植到XUPv5110T上。

第一部分 硬件搭键部分

一开始都很顺利,这个字符型LCD使用了7个管家,3个控制信号,4个数据信号,当然其实它可以有8个数据信号的模式,只是为了可以和各个 xilinx的各个板卡更好的兼容,使用了4个数据线的模式。例化一个基于PLB46总线的GPIO,设置位宽为7位,连接好对应的管腳,接下来就是软硬 件接口的问题了,以及所谓的软件“驱动”的问题。

第二部分 软件部分

使用了悬挂于PLB46总线的一个GPIO来实现LCD管腳和系统的硬件连接,并在系统中对这个外设给予一定的地址空间,以便软件可以针对这个地址 读写数据(当然我们这里只涉及到了写数据,因为我们无需从这个LCD读数据),我们按照它的驱动的时序要求,给予一定的信号刺激,完成LCD的初步配置之 后就可以对它进行写数据的操作了。

以下是它的初步启动配置(from Spartan3E User Guide):

Power-On Initialization
The initialization sequence first establishes that the FPGA application wishes to use the four-bit data interface to the LCD as follows:
• Wait 15 ms or longer, although the display is generally ready when the FPGA finishes configuration. The 15 ms interval is 750,000 clock cycles at 50 MHz.
• Write SF_D<11:8> = 0×3, pulse LCD_E High for 12 clock cycles.
• Wait 4.1 ms or longer, which is 205,000 clock cycles at 50 MHz.
• Write SF_D<11:8> = 0×3, pulse LCD_E High for 12 clock cycles.
• Wait 100 μs or longer, which is 5,000 clock cycles at 50 MHz.
• Write SF_D<11:8> = 0×3, pulse LCD_E High for 12 clock cycles.
• Wait 40 μs or longer, which is 2,000 clock cycles at 50 MHz.
• Write SF_D<11:8> = 0×2, pulse LCD_E High for 12 clock cycles.
• Wait 40 μs or longer, which is 2,000 clock cycles at 50 MHz.

Display Configuration
After the power-on initialization is completed, the four-bit interface is now established.
The next part of the sequence configures the display:
• Issue a Function Set command, 0×28, to configure the display for operation on the Spartan-3E Starter Kit board.
• Issue an Entry Mode Set command, 0×06, to set the display to automatically increment the address pointer.
• Issue a Display On/Off command, 0×0C, to turn the display on and disables the cursor and blinking.
• Finally, issue a Clear Display command. Allow at least 1.64 ms (82,000 clock cycles) after issuing this command.

Writing Data to the Display
To write data to the display, specify the start address, followed by one or more data values.

Before writing any data, issue a Set DD RAM Address command to specify the initial 7-bit address in the DD RAM. See Figure 5-3 for DD RAM locations.

Write data to the display using a Write Data to CG RAM or DD RAM command. The 8-bit data value represents the look-up address into the CG ROM or CG RAM, shown in Figure 5-4. The stored bitmap in the CG ROM or CG RAM drives the 5 x 8 dot matrix to represent the associated character.

If the address counter is configured to auto-increment, as described earlier, the application can sequentially write multiple character codes and each character is automatically stored and displayed in the next available location.

第三部分 软件部分,O2的优化选项让我debug了一天

把硬件和软件都编译好,下载下去,却无法得到我们需要的结果,那个LCD出现了一些奇怪的字符。而且每次都不是很一样。感觉硬件是应该没有问题的, 至少它可以点亮了。于是自己开始慢慢的debug,把3E的user guide拿出来,仔细的看LCD的部分,它的时序是否有问题,它的启动设置是否准确。但是这些程序都是没有问题的。和Kevin简单的汇报一下之后,他 很nice的和我讨论了一下,建议说,那么你先把这7个信号线连接到7个led灯上,这个lcd啥都看不见,不靠谱,还是led靠谱,马上就可以看到效 果。觉得非常有道理,于是把7个led做为上面的7个信号线引出端,看看效果。自己也把程序变成非常简单的,比如只是一次去写入一个数据给这7个led 灯,看看是否准确。发现每次都是对的。所以硬件是没有问题,都是通的。于是尝试的写入两个数据,中间有一定的延迟,看看灯是否会变化。但是发现每次灯都显 示的是后面的一个数据,觉得有点不太对劲,自己把延迟的单元设置的更大一些,让它延迟1s看看,但是发现还是无法显示前面的数据。于是觉得这个延迟单元有 问题。猛的想起lab2中有要求将gcc编译的选项O2去掉,变成不优化。只是在lab3中没有提及,不过文档中要求lab3是直接使用lab2工程的。发现了问题所在。

其实在启动的过程中,由于有很多延迟,比如上面说到要延迟4.1ms,那么这些延迟一般我们会如何做呢?插循环。比如下面这个程序,在50MHz的系统中,如果可以实现延迟delay*1us,如果delay=4100,那么就可以实现延迟4.1ms了。

void usleep(unsigned int delay){
unsigned int j, i;
for(i=0; i<delay; i++)
for(j=0; j<26; j++);
}

但是这样的程序就是在系统中空转,造成一定的延迟,不过呢,有一些编 译器非常多的智能,比如gcc,因为它发现其实你什么事情都不敢,于是在O2的优化选项下,这些它所认 为的无用的程序就全部真的被优化掉了。马上把优化的选项变成不优化,于是一切正常了。其实自己也有点傻的,因为在上午使用gdb debug的时候,单步单步前进时,它自动直接把延迟函数跳过了,我当时怎么没有在意呢。。呵呵

其实按照正常的顺序,应该是在lab2的基础上进行lab3的,但是自己前面的两个实验都是直接使用了v5的板卡工程,没有使用3e的板卡,所以直接从lab3的开始做了。不过现在这样做下来,收获还是蛮大的。呵呵

那么如何修改gcc的编译条件呢?

右击你的软件工程名字,选择compiler options,打开Compiler Options对话框,在Debug and Optimization标签中, 把optimization设置成No Optimization.如下图。

/myspace/album/image.php?uid=12129&aid=525&pic=ba937875&ext=JPG&screen=show


 

第四部分 个人认为lab3应该修改的地方

这样做下来,觉得lab3有一个地方需要做一些修改。因为如果使用不优化的gcc选项,编译出来的二进制代码大了一些(大概大了20%左右),正好无法放进实验中所谓的8k的 bram,那么就无法使用所谓的init to bram的选项。

可以解决的办法有
1)把一部分软件放到外面的ddr sdram中,带来的不便就是软件需要xmd的方式下载
2)或者在创建系统实验的时候选择大一点的bram。

 

-------------------------------------------

2009年 2月 10日

发现了真正的问题所在,所以lab3可以不用修改了,具体的请看我的下一篇日志。

https://www.openhw.org/myspace/blog/show.php?id=164812