在LINUX 下使用XILINX, ModelSim 以及如何设定PCMCIA转串口卡

这篇文档主要是基于gentoo-wiki中如何使用XILINX这部分的,我做了一点点修改,以便适用于amd64的架构,要求gentoo配置是multilib的,因为最新版本的ise 9.2i webpack只有32位的版本,没有提供64位的支持

1.如何让你的ISE运行起来

1.1关于tcl,由于我的机子上没有安装TCL,也就免去了设定TCL这一步。一般大型EDA程序中都集成了tcl外壳。

1.2GLIBC
在这一步分,没有去按照网站所描述的去做,在gentoo-wiki中提供了两种方法,第一中要重新编译很多东西,第二中按照所描述的没能成功运行ise。现在使用中还没有出现新窗口不能显示的情况,因而对于最新的ISE 9.2i,这一步可以安全的略去。

1.3处理链接库,主要是对于openmotif而言的(要求首先要将openmotif升至2.3.0)
cd /usr/lib/openmotif-2.3/
ln -s libXm.so.4 libXm.so.3
ln -s libXm.so.4.0.0 libXm.so.3.0.0
ln -s libXm.so.4 ../libXm.so.3
ln -s libXm.so.4.0.0 ../libXm.so.3.0.0

2.安装

这里我们按照教程中的描述来做
xhost + #as the regular user, to let root use the X display
su #must be root to install
export DISPLAY=:0 #install script needs this? 没错,对于ise来说,这一步很关键

然后进入目录中,运行安装文件就行了,有两点注意:
2.1建议安装到/opt目录下
2.2对于缺少windrv的错误可以忽略,因为后面有更好的解决办法

3.运行
wiki中建议的方法是
cp /opt/Xilinx92i/settings.sh /usr/local/bin/startise
echo "export DISPLAY=:0" >> /usr/local/bin/startise #note 1
echo "exec ise" >> /usr/local/bin/startise
chmod +x /usr/local/bin/startise

但是注意到在最新的ise中,没有对于amd64的支持,一定要在settings.sh中要将x86_64条件下的PLATFORM变量改为lin才行。而对于gentoo的配置,我们有更好的办法:

在/etc/env.d中创建83ise文件
PLAT="lin"
XILINX="/opt/Xilinx92i"
LMC_HOME="${XILINX}/smartmodel/${PLAT}/installed_${PLAT}:${LMC_HOME}"
PATH="/opt/Xilinx92i/bin/lin"
LD_LIBRARY_PATH="${XILINX}/bin/${PLAT}:${LD_LIBRARY_PATH}"
NPX_PLUGIN_PATH="${XILINX}/java/${PLAT}/jre/plugin/i386/ns4:${NPX_PLUGIN_PATH}"

注意到,这些变量都是对于settings.sh中提取出来的,但是由于ISE只有32位版本,因而通用性还不错。这个设置文件是通用的。

然后在/usr/local/bin中创建ise的启动文件startise
#!/bin/bash
export DISPLAY=:0
export LD_PRELOAD=/opt/usb-driver/libusb-driver.so
exec ise &

注意:如果你的烧录使用的是impact脚本方式
impact -batch impact.bat
的话,一定要在前面加上
export LD_PRELOAD=/opt/usb-driver/libusb-driver.so

这样ise就能顺利的运行,以及完成器件的配置了。

4.安装线缆支持
在wiki中提供了3中方法供选择,分别是:
内核模块
开源的烧录程序
用户级的线缆驱动程序

在amd64环境下,第3种办法是最好的。第一中方法,在原文中提到,xilinx可能考虑会提供驱动的代码,但是在那之前,每次更改都要求重新编译内核。同时在我的机子64环境上,对于驱动程序的编译总是不能顺利的完成,我尽可能在之后将这一部分搞定,那时再对本文进行更新。对于第二中方法,只能期待xup会做的更好,但在ise webpack的推出以及对于开放驱动代码的期待下,只能暂时搁置起来。这里重点介绍第三中办法,速度快而且对于64位支持良好!:

名字是usb-driver,但是广义上来说,对于各种烧录方式都是支持的,我只是在spartan III starter kit中测试了usb借口的jtag烧录方式,可以正确运行。

首先安装一些必要的包:
su # root must emerge, install and change the config files.
emerge libusb #install the generic user-mode usb library
emerge fxload #install the generic USB firmware loader

之后是下载编译usb-driver:
mkdir
cd
wget http://cvs.zerfleddert.de/cgi-bi ... ver.tar.gz?view=tar
tar xzvf usb-driver*
cd usb-driver
more README # read this. It has better instructions for the steps after the make
make
mkdir /opt/usb-driver #or other directory of your choice
mv *.so /opt/usb-driver

之后就可以编辑ise启动脚本文件
nano /usr/local/bin/startise
将下面这行加上
export LD_PRELOAD=/opt/usb-driver/libusb-driver.so
当然,如果你是按照前面一步一步来做的,这个内容已经在ISE启动脚本上了。

注意:
在amd64环境下,编译出来的连接文件是64位的,在实际使用中会出现错误,这里我采用的是下面这个办法:

下载一个32位的libusb-0.1-4_0.1.12-9_i386.deb,从debian网站上可以下载到,然后
emerge -v deb2targz
安装这个工具,解压,将里面的libusb-0.1.4_0.1.12.9.so改名为libusb.so,放在/lib32下面,之后,在上面的make这步,我们改成
make lib32
编译出32为的动态连接文件。之后按照上面介绍的的来,就可以了。

5.安装modelsim
从hit的ftp上下载来,解压modelsim-linux_x86_64.exe.gz以及其他的tar.gz文件到同一个文件夹就可以了,安装比较简单:)

然后是生成license.dat文件,要用到同时下载的keygen.exe文件。这里要注意,理论上来说是可以在linux下用wine生成的,但是wine生成的license.dat中没有host-id,解决办法就是发送到邮箱中,采用在windows环境中生成的license.dat。谁有更好的解决办法,可以给我说下:)

环境变量的设定:
在/etc/env.d中创建82modelsim文件
LM_LICENSE_FILE="/personal/modelsim/modeltech/license.dat"
PATH="/personal/modelsim/modeltech/linux_x86_64"

6.PCMCIA转串口器件的使用

这个东西折腾了我两个多小时才搞定,下面介绍可以使用的解决办法:

首先要对内核中的serial串口驱动程序做一点修改,在我使用的内核版本:2.6.23中还没有提交这个补丁,具体的修改办法如下:diff文件很容易看懂的,可以自己手动修改:)

diff -ru linux-2.6.16-orig/drivers/serial/8250_pci.c
linux-2.6.16/drivers/serial/8250_pci.c
--- linux-2.6.16-orig/drivers/serial/8250_pci.c 2006-03-23
13:32:17.000000000 +0200
+++ linux-2.6.16/drivers/serial/8250_pci.c 2006-03-23 13:39:08.000000000
+0200
@@ -2045,6 +2045,9 @@
{ PCI_VENDOR_ID_OXSEMI, 0x950a,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_2_1130000 },
+ { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_CB950,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ pbn_b0_1_115200 },
{ PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
pbn_b0_4_115200 },

diff -ru linux-2.6.16-orig/include/linux/pci_ids.h
linux-2.6.16/include/linux/pci_ids.h
--- linux-2.6.16-orig/include/linux/pci_ids.h 2006-03-23 13:32:24.000000000
+0200
+++ linux-2.6.16/include/linux/pci_ids.h 2006-03-23 13:40:32.000000000
+0200
@@ -1808,6 +1808,7 @@
#define PCI_VENDOR_ID_OXSEMI 0x1415
#define PCI_DEVICE_ID_OXSEMI_12PCI840 0x8403
#define PCI_DEVICE_ID_OXSEMI_16PCI954 0x9501
+#define PCI_DEVICE_ID_OXSEMI_CB950 0x950B /* OXCB950 Cardbus 16950 UART */
#define PCI_DEVICE_ID_OXSEMI_16PCI95N 0x9511
#define PCI_DEVICE_ID_OXSEMI_16PCI954PP 0x9513
#define PCI_DEVICE_ID_OXSEMI_16PCI952 0x9521

之后重新编译内核,将pcmcia驱动下面的选项全部选中。

然后可以查看相关的信息,我的lspci -v以及dmesg | grep tty如下
03:00.0 Serial controller: Oxford Semiconductor Ltd OXCB950 Cardbus 16950 UART (prog-if 06 [16950])
Subsystem: Oxford Semiconductor Ltd Unknown device 0001
Flags: medium devsel, IRQ 20
I/O ports at 1010
Memory at 58000000 (32-bit, non-prefetchable) [size=4K]
I/O ports at 1000
Memory at 58001000 (32-bit, non-prefetchable) [size=4K]
Memory at 58002000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [40] Power Management version 1

ttyS0: detected caps 00000700 should be 00000100
0000:03:00.0: ttyS0 at I/O 0x1010 (irq = 20) is a 16C950/954
setserial sets custom speed on ttyS0. This is deprecated.

如果看到dmesg中只要生成了/dev/ttyS*,那么你的PCMCIA转串口卡基本上就可以正常使用了。
但是针对OXFORD CB950这个芯片的串口卡,还要设定一些额外的(很奇怪的)东西:

首先使用下面的命令修改串口
#!/bin/bash
setserial /dev/ttyS0 spd_cust divisor 104

然后根据linux-serial论坛上的说明,该芯片的比特率需要做修正,在Xilinx Spartan III 的板子中的教程使用的是9600的波特率,在minicom中要设定针对该PCMCIA转串口芯片(CBP950),进行特定的设定:
minicom -s
在port设定中,波特率要(一定要)*选择*为38400,其他的参数依照要求进行设定,这样才能保证该串口卡是以9600进行通信。之后就可以正常的使用该PCMCIA转串口,调试Xilinx板子了。
对于minicom的使用可以查看minicom的教程,这里就不详细叙述。