目录

前言

一、时钟源

1.1、片上振荡器

1.2、Fabric CCCs

1.3、MSS CCC

1.4、global buffers

1.5、Dedicated global I/Os(专用的全局I/O)

二、时钟方案

2.1、global buffers

2.2、片上振荡器

2.3、Fabric CCC

2.4、base clocks

2.4.1、MSS CCC

三、FPGA Fabric 全局网络架构

3.1、全局网络架构介绍

3.1.1、专用的全局I/O

3.1.2、Fabric CCC

3.1.3、VCCC

3.1.4、Global Buffer

3.2、推荐的全局网络设计

3.2.1、Global Macros

3.2.2、在Synplify Pro中使用Global Macros

3.2.3、Global Promotion and Demotion Using PDC

四、片上振荡器

4.1、四种振荡器介绍

4.1.1、1MHz RC振荡器

4.1.2、50MHz RC振荡器

4.1.3、主晶振

4.1.4、 Auxiliary Crystal Oscillator

4.2、如何使用片上晶振

五、Fabric CCC

5.1、Fabric CCC的位置

5.2、Fabric CCC的输入管脚

5.3、如何使用Fabric CCC

5.3.1、配置页面

5.3.2、推荐配置流程

六、MSS CCC

6.1、MSS的时钟配置

6.2、如何将MSS和FIC子系统进行时钟同步

词汇表

专用术语


前言

作者认为,在上手之前,有三方面需要重点介绍一下:电源、时钟和复位。

数字电路中,时钟是整个电路最重要、最特殊的信号。

FPGA系统内大部分器件的动作都是在时钟的上升沿或者下降沿进行。无论是在输入、输出或是寄存器与寄存器之间,只要涉及到时钟上升沿或者下降沿的采样,就会提到建立时间(setup time) 和保持时间(hold time)。

第一,系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错;

第二,时钟信号通常是系统中频率最高的信号;

第三,时钟信号通常是负载最重的信号, 所以要合理分配负载。

出于这样的考虑在FPGA这类可编程器件内部一般都设有数量不等的专门用于系统时钟驱动的全局时钟网络。这类网络的特点是:一、负载能力特别强, 任何一个全局时钟驱动线都可以驱动芯片内部的触发器; 二是时延差特别小; 三是时钟信号波形畸变小, 工作可靠性好。

了解全面信息,可参照官方手册UG0449。

一、时钟源

SmartFusion2系列时钟源见下表,包含:4种振荡器(2个片上振荡器)、Fabric CCC(clock conditioning circuitry 时钟调节电路)、MSS CCC、global buffers(全局缓冲器)和专用的全局I/O。

1.1、片上振荡器

四种振荡器都被官方称为片上时钟源,文中姑且先这么归类:1、外部主晶体振荡器(可接外部晶振,但是官方归为了片上振荡器),2、片上25/50MHz RC振荡器,3、片上1MHz RC振荡器,4、Auxiliary(辅助)晶体振荡器。(RC振荡器为电阻电容振荡器,缺点是振荡频率会有误差,同时受到温度、湿度的影响,这个跟元器件的工艺有关)

第四种Auxiliary(辅助)晶体振荡器专门用于MSS RTC。

1.2、Fabric CCCs

可以用于产生不同频率/相位的时钟,每个CCC可以产生4种不同的时钟,最大频率400MHz。每个FPGA Fabric CCC都有专门的PLL用于不同的Fabric需求,同时,Fabric CCCs可以为片上的IP核比如:MSS(MCCC_CLK_BASE,MCCC_CLK_BASE接入MSS CCC)、FDDR和高速串行接口提供时钟(CLK_BASE)。

1.3、MSS CCC

SmartFusion2包含了专用的CCC用于MSS的时钟,这个MSS CCC负责产生对齐的时钟,用于同步MSS模块和其它用户FPGA程序,保证MSS的程序运行正常。

1.4、global buffers

SmartFusion2的global buffers(GBs)提供低倾斜率的贯穿FPGA fabric的全局网络,并且分配给不同的时钟域,global buffers提供低倾斜率的时钟信号或者high-funout网络(high fanout:扇出,对于某一输出信号而言,接收该信号的个数。多出现在复位信号、时钟、某些用的比较多的信号。是一个后端设计的问题, 或者指模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛,所以要注意high fanout的问题,避免时序延迟过高)。

1.5、Dedicated global I/Os(专用的全局I/O)

专用的全局I/O直接驱动GBs,并且是外部输入时钟接入内部全局时钟网络最初的接口。

二、时钟方案

各种时钟、MSS CCC、Fabric CCCs、GBs等关系如下图所示。

图中列举了一个Fabric CCC,其它CCC具有相似的输入和输出。从图中可以看出,第一种振荡器:外部主晶体振荡器可以32KHz~20MHz的外部晶振。

2.1、global buffers

GBs为FPGA fabric提供低倾斜率的全局信号,GBs可以通过4种方式驱动:1、专用的全局I/O,2、虚拟的CCCs(Virtual CCCs,VCCCs)3、Fabric CCCs,4、FPGA fabric routing(FPGA结构路由)

一些专用的全局I/O可以直接连接GBs,但是其它的必须通过VCCCs或者fabric CCCs连接GBs,并且通过一些有规则的I/O或者通过内部信号经由FPGA结构路由进行连接。

每个CCC模块的四个全局时钟输出(GLx,x=0到3)通过硬件连接到GBs,另外GLx同样可以产生四个core clocks(Yx,x=0到3)用于驱动fabric routing资源,请注意core clocks并没有通过global clock buffers进行布局,所以core clocks在使用时可能会扭曲变形导致结果出乎意料。

2.2、片上振荡器

片上1MHz RC振荡器、50MHz RC振荡器和主晶体振荡器通过硬件连接到MSS和所有的fabric CCCs上,这几种振荡器可以作为如下几种分系统的时钟:1、Fabric CCCs,2、通过FPGA fabric routing建立的用户时钟网络,3、Flash*Freeze模式下的MSS,4、MSS RTC。

2.3、Fabric CCC

每个fabric CCC都有自己独立的参考时钟,通过如下的时钟源获得:1、四个专用的全局I/Os(CCC_xyz_CLKIw,w=0到3)2、FPGA fabric输入(CLKx,x=0到3)3、片上时钟源。

2.4、base clocks

所有基础时钟(MCCC_CLK_BASE或者CLK_BASE)都必须经过FPGA fabric才能送到MSS或者FDDR、SERDESIF,基础时钟可以通过Fabric CCC或者内部/外部时钟源产生。MSS CCC使用base clock(基础时钟)作为参考,通过MPLL产生各种同步时钟。FDDR、SERDESIF子系统同样有自己的PLL时钟控制器产生所需的时钟。

2.4.1、MSS CCC

SmartFusion2有专门的CCC用于产生同步时钟给MSS子系统,保证与用户自己的FPGA fabric逻辑通信正常。MSS CCC(MCCC_CLK_BASE)来源于Fabric CCC或者通过FPGA fabric连接外部源。MSS CCC通过专用 的PLL(MPLL)对MCCC_CLK_BASE时钟进行合成和校正。

MCCC_CLK_BASE频率:1MHz~200MHz

MSS(M3_CLK)频率最高166MHz

MDDR时钟(MDDR_CLK)频率最高333MHz(应该是M3_CLK的1/2/3/4/6/8倍)

MDDR fabric接口时钟(DDR_FIC_CLK)频率是MDDR_CLK的Ratio 1,2,3,4,6,8,12,16

MSS APB0/1外设时钟频率(APB_0_CLK和APB_1_CLK)是M3_CLK的Ratio 1,2,4,8

FPGA fabric接口时钟(FIC_0_CLK和FIC_1_CLK)是M3_CLK的Ratio 1,2,3,8,16,32

三、FPGA Fabric 全局网络架构

3.1、全局网络架构介绍

3.1.1、专用的全局I/O

SmartFusion2的用户I/Os被划分为多标准的I/O(MSIO和MSIOD)和DDRIOs,部分用户I/O可以当做专用的全局I/O,这些用来驱动全局路由网络或者本地路由网络的I/O被称作复用I/Os。

专用的全局I/O可以作为输入连接外部时钟信号到FPGA fabric,这些全局I/O还可以当做通用的I/O口,进行输入或输出。

一些专用的全局I/O可以直接连接GBs,然而其它的要通过VCCCs或者CCCs。每个Fabric CCC都有四个专用的全局I/Os作为输入,并且可以驱动四个GBs。

全局专用I/Os通过硬件连接的方式连接Fabric CCCs、VCCCs和GBs

全局专用I/Os使用通用的名字,例如:IOxyBz/GBn/CCCtype_xyz_CLKIw

专用的全局I/O电压跟其所处的IO Bank的电压保持一致。未使用的IO和其它通用IO一样,设置成input buffer disable,输出三态弱上拉。

3.1.2、Fabric CCC

每个Fabric CCC可以产生4个不同的全局时钟(GL0、GL1、GL2、GL3)和4个core clocks(Y0、Y1、Y2、Y3),产生的全局时钟用于驱动GBs,core clocks驱动位于FPGA fabric的local routing resources(本地路由资源)

Fabric CCC的core clock 输出(Yx)可以被用来驱动内部的逻辑,而不占用全局网络资源。由于FPGA fabric routing,core clocks(Yx)将会有一些延迟。core clock在需要节约全局网络资源或者timing-critical paths(Critical Path:全称是关键路径。一般是指我们设计中时序最关键的路径,通常也就是timing最差或者最难修的路径。我们要学会从时序报告中去找到timing最差的path并去分析它。那如何分析呢?首先,我们可以看下这条path的走向是否合理,也叫作detour,通俗的解释就是有没有绕远路。其次,我们可以看下设计的clock tree做得平不平。 通常来说,我们还是希望clock tree能尽可能做平一点,这样timing更容易meet。简单一点的方法,我们能直接从时序报告中得到clock tree的skew,就是自己算下launch clock path和capture clock path的delay差值,如果差值过大,那就要重点看一下clock tree的质量了。最后,我们也可以分析下具体data path上,有没有一些bad buffering, 过大的 load或者transition,甚至一些距离比较长的net都可以研究下)时显得尤为重要。

与GLx有关的GBs可以被用户逻辑使用。

3.1.3、VCCC

每个VCCC都有4个专用全局IO管脚作为输入,可以驱动4个GBs。VCCC模块没有fabric的输入和输出,并且他们不能互相连接。

使用Libero SOC开发工具,基于专用全局IO可以对VCCC自动进行实例化,而不能通过人工干预进行实例化。

在Libero SOC开发工具里,VCCCs不能动态配置,可以在FPGA fabric时序编程时可以通过flash bits sets进行配置。

3.1.4、Global Buffer

GB是一个multiplexer(多路调制器、多路开关,目前不知道如何称呼比较妥当)用来产生独立的全局信号。

GB可以被全局专用I/Os、fabric CCCs、VCCCs或者fabric routing等驱动。

Libero SoC设计软件基于fabric CCC输出(GL0 - GL3) 执行全局缓冲区(GBs)分配。

3.2、推荐的全局网络设计

3.2.1、Global Macros

Global macros用来分配信号到全局网络上。下图中列举了SmartFusion2中的可用的global macros。CLKBUF, CLKBIBUF, GCLKBUF,and GCLKBIBUF macros可以允许你把时钟从全局专用I/Os布线到GBs上,具有最小的延时。CLKINT和GCLKINT将内部时钟信号或者通用I/O信号通过FPGA fabric routing连接到GBs上。

3.2.2、在Synplify Pro中使用Global Macros

综合工具Synplify自动将global macros插入到nets where the fanout exceeds the
fanout threshold value supplied to the tool. The fanout threshold value can be set using the constraint set_option -globalthreshold value, where the value refers to the minimum number of fanout loads. The default value is 1.

3.2.3、Global Promotion and Demotion Using PDC

Libero SOC设计工具可以允许你通过PDC命令将一个信号提升到全局网络或者降级为通用网络。

提升信号的语法:assign_global_clock -net netname

此网络经过编译,将会自动插入到CLKINT进行驱动

降级信号到通用网络:unassign_global_clock -net netname

此时,CLKBUF变成了INBUF,CLKINT被从网络上移除。

四、片上振荡器

4.1、四种振荡器介绍

片上振荡器可以通过Libero开发工具中的Chip Oscillators macro进行配置去驱动用户逻辑或者fabric CCCs。

4.1.1、1MHz RC振荡器

1MHz RC振荡器供电为芯片核心电压VDD

4.1.2、50MHz RC振荡器

50MHz RC振荡器供电为芯片核心电压VDD

4.1.3、主晶振

主晶振可以外接一个晶振用来提供源,主晶振有2个I/O口,XTLOSC_MAIN_EXTAL 和 XTLOSC_MAIN_XTAL,如果主晶振没有使用,这两个管脚可悬空。

主晶振可以外接三种不同的源:晶体振荡器、RC振荡器、陶瓷振荡器。接不通的源可以输出的频率范围不通。

主晶振支持四种工作模式,在Libero设计工具中的IP核进行选择不同的输入源后,模式将会自动切换。四种工作模式见下表

4.1.4、 Auxiliary Crystal Oscillator

辅助晶振专用与MSS RTC,需要外接晶振,有两个I/O口:XTLOSC_AUX_EXTAL 和 XTLOSC_AUX_XTAL

4.2、如何使用片上晶振

通过Libero SOC设计软件可以配置3中片上晶体振荡器和Fabric CCCs。

双击Chip Oscillators在SmartDesign画布上创建时钟,会弹出下图窗口。共有三个选项可以选择:外部主晶体、片上25/50M、片上1M振荡器。

仔细观察可以发现,不管是选择三种之中的哪种(除了辅助晶体振荡器),都可以选择1、驱动Fabric(FPGA)的CCC,2、驱动Fabric(FPGA)逻辑。

如果选用Main Crystal(主晶振)连接fabric CCC的话,CCC的配置界面如下,clock选项应该选择主晶振(main crystal oscillatror)

片上晶振驱动fabric CCC(s)的连接如下:

片上晶振驱动用户逻辑如下:

建议使用main crystal或者auxiliary crystal产生MSS RTC的时钟。

五、Fabric CCC

Fabric CCC可以通过Libero工具设置,也可以通过APB3总线接口进行动态设置。

Fabric CCC具有如下特色:

1、可接内部和外部的时钟源;

2、产生四种不同的时钟,最高400MHz;

3、经过PLL lock后自动输出同步;

4、Configurable phase error window for PLL lock assertion;

5、可配置PLL lock延迟;

6、Spread spectrum clock generation(SSCG)(扩频时钟产生器)

7、无任何故障的动态时钟切换;

8、时钟延迟或时钟提前;

9、时钟相移;

10、时钟反转;

11、时钟保持;

12、时钟门控;

5.1、Fabric CCC的位置

所有可用的fabric CCC都与专用PLL相关联。例如与CCC-NE1相关的PLL能够接受32 KHz参考时钟输入,而其他(NE0、NW0、NW1、SW0、SW1等)能够接受1 MHz和200 MHz之间的参考时钟输入。

每种器件包含的CCC数量不同,依次从1~4增加(M2S010~M2S150)。

5.2、Fabric CCC的输入管脚

当使用PLL时,PLL的参考时钟频率必须在1MHz~200MHz之间(除CCC-NE1必须使用32KHz外)当不使用PLL时,fabric CCC的输入时钟频率可以高达400MHz。

5.3、如何使用Fabric CCC

5.3.1、配置页面

CCC配置——Basic页面如下

Reference Clock可有三种选型:Dedicated Input、Fabric Input、Oscillators

Dedicated Input:

Dedicated Input 0~3对应的管脚名称是CCC_xyz_CLKIw(w,0~3),xy代表CCC的位置(NE、NW、SE、SW),z代表CCC的编号(0、1)

依据原理图,可以选择时钟源是否为差分输入。例如下第二张图,图中左下角为原理图。

CCC配置——Advanced页面如下

5.3.2、推荐配置流程

1、选择期望输出的时钟数量;

2、设置每路时钟输出的频率;

3、对于每个选定的输出时钟,从中选择所需的参考时钟(NGMUX主时钟)将从中导出输出。它可以是以下任意一种:CCC的一个输入时钟(PLL Bypass模式)、8个PLL输出相位中的一个;

4、如有必要,配置NGMUX次时钟频率和参考时钟,从中获取数据将导出。它可以是以下任一项:CCC的一个输入时钟(PLL Bypass模式)、8个PLL输出相位中的一个;

5、如果使用PLL:

a)选择PLL的参数时钟和频率;

b)选择PLL反馈时钟;

c)依据板子上的供电电压,选择PLL的模拟电压是2.5V还是3.3V,

d)如果需要,通过配置延迟来启用可编程延迟元件;

6、输入每个选定时钟源的频率。配置器使用这些频率计算PLL参考和反馈分频器以及GPD的分频因子,如上图所示。

7、在PLL Options配置页面,配置高级选项,例如GPD输出同步配置、PLL SSCG和锁定PLL选项选项卡中的控制参数等。

六、MSS CCC

SmartFusion2有专用的CCC产生对齐的时钟用于MSS,MSS CCC的基础时钟来自fabric CCC或通过FPGA fabric的外部输入源。MSS CCC与专用PLL(MPLL)相关联,用于时钟合成和从MCCC_CLK_BASE对内部MSS时钟进行倾斜。

6.1、MSS的时钟配置

6.2、如何将MSS和FIC子系统进行时钟同步

在MSS和FPGA结构FIC子系统之间,同步通信必须遵循SmartFusion2体系结构的以下规则:

1、Drive each FPGA fabric FIC subsystem by a clock with a frequency that matches the frequency defined for that particular subsystem in the Clocks configuration tab in System Builder wizard.
2、The FPGA fabric FIC subsystem clock with the smallest frequency must drive the MSS
CLK_BASE.
3、Align all the FPGA fabric FIC subsystem clocks precisely; the clocks could be of different
frequencies, but align the rising-edges of the slower clocks to the rising-edges of the fastest
clocks


词汇表

CCC
Clock conditioning circuitry
FAB_CCC
Fabric CCC configurator
FACC
Fabric alignment clock controller
FBCLK
Fabric PLL feedback clock input
FBDIV
Fabric PLL feedback clock divider
FBDLY
Fabric PLL feedback clock programmable delay
FBMUX
Fabric PLL feedback clock multiplexer
GB
Global buffer
GPD
General purpose frequency divider
GPMUX
General purpose multiplexer
MPLL
Memory subsystem PLL
MSS_CCC
MSS CCC configurator
NGMUX
No-Glitch multiplexer
PLL
Phase-locked loop
RDLY
Fabric PLL reference clock programmable delay
REFCLK
Fabric PLL reference clock input
RFDIV
Fabric PLL reference clock divider
RFMUX
Fabric PLL reference clock multiplexer
SSC
Spread spectrum clock
SSCG
Spread spectrum clock generation
VCCC
Virtual clock conditioning circuitry

专用术语

 FPGA fabric
Programmable logic portion of the SmartFusion2 and IGLOO2 devices
Base clock (MCCC_CLK_BASE)
Reference clock input to the MSS and HPMS from the FPGA fabric
On-chip oscillators
Includes various oscillator circuitry available on SmartFusion2 and IGLOO2 devices.
Fabric PLL
The PLL which is used in conjunction with the fabric CCC for generating clocks for the logic implemented in the fabric
Fabric CCC
Provides clock conditioning capabilities to the logic implemented in the FPGA fabric.
High-speed serial interfaces
On-chip SERDES interfaces
User Logic
The logic implemented in the FPGA fabric portion of the SmartFusion2 and IGLOO2 devices
VDD
Device core power supply or core supply voltage
MPLL
The PLL which is dedicated for the MSS and HPMS clocking
Static configuration
Configured using Libero SoC tool and cannot be modified at run time.
Dynamic configuration
Configuration can be modified at run time by writing to appropriate registers.
Glitch free clock switching
Switching the clock source of a subsystem without any glitches.
Clock holding
Stopping the clock signal without any glitches by asserting CCC control input (NGMUX_HOLD_N). It holds the clock signal at Low.
Clock gating
You can enable or disable the global clocks by driving the control signal (GLx_EN) from the FPGA fabric.

Microsemi SmartFusion2从入门到精通<3>时钟介绍相关推荐

  1. NGINX由入门到精通:Nginx介绍

    原文:http://www.aosabook.org/en/nginx.html nginx(发音"engine x")是俄罗斯软件工程师Igor Sysoev开发的免费开源web ...

  2. AUTOSAR从入门到精通-AUTOSAR PPT介绍

  3. [SharePoint][SharePoint 2013从入门到精通]Chapter 1 介绍 SharePoint2013

    本章你讲学到 什么是SharePoint2013 SharePoint2013如何加强协作与共享 SharePoint2013中有什么用户权限 什么是SharePoint Online 本地部署与在线 ...

  4. vTESTstudio入门到精通 - vTESTstudio工具栏介绍_File

    vTESTstudio作为跟CANoe工具并套使用的一个强大的工具,那么想要用好它就得对他有个全面的认识,第一步起码要知道tade工具栏都包含哪些功能要清楚,今天我们就着重分享下vTESTstudio ...

  5. kafka从入门到精通:Java设置全局变量传值

    如何高效的学习MyBatis源码呢? 市面上真正适合学习的MyBatis资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃.学透MyBatis源码难道就真 ...

  6. SpringCloud Alibaba 从入门到精通(精选)

    SpringCloud Alibaba 从入门到精通 一. 课程介绍 1.1 课程导学 1.2 项目环境搭建 二. SpringBoot基础 2.1 本章概述 2.2 Spring Boot是什么?能 ...

  7. jooq从入门到精通(一)

    jooq从入门到精通 简介 环境介绍 环境准备 代码生成 代码测试 简介 本篇文章作为jooq的入门,搭建一个jooq的基本的测试环境,为后续深入学习jooq作准备. jooq是一个orm层的框架,生 ...

  8. Ruby从入门到精通pdf

    下载地址:网盘下载 内容简介  · · · · · · <Ruby从入门到精通>还讲解了Ruby关键内容(如类.对象.项目.模板和程序库)以及Ruby的其他方面(如数据库访问).另外,&l ...

  9. 8Lua从入门到精通-王桂林-专题视频课程

    <8>Lua从入门到精通-391人已学习 课程介绍         lua语言以其,轻量级: 可扩展,支持面向过程编程和函数式编程:自动内存管理:只提供了一种通用类型的表(table),用 ...

最新文章

  1. 大数运算(7)——大数阶乘(求阶乘)
  2. OpenCASCADE绘制测试线束:拓扑命令之扫掠Sweeping
  3. java list 转数组_数组转List,一定要小心这个坑!
  4. MySQL的事务与事务隔离
  5. ajax绑定事件页面重复提交,ajax防止用户重复提交点击事件
  6. docker mysql输入中文_Docker解决终端无法输入中文的问题
  7. python 文件指针及文件覆盖
  8. 【干货】2021年技术趋势:全球企业加速数字化转型-德勤.pdf(附下载链接)
  9. 思科BFD协议帮助侦测网络失败
  10. Windows 10 安装SVN 不显示状态图标--解决方法
  11. 一张图搞定Java设计模式——工厂模式! 就问你要不要学!
  12. Java中的管程Monitor
  13. 【三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 155期】
  14. 滚动轴承的代号表示方法
  15. 正交试验设计例题及答案_正交试验设计与数理统计作业.doc
  16. matlab 频域采样定理,信号时域和频域采样函数周期性与原信号的关系
  17. 广东再增一项重大跨海工程 黄茅海跨海通道将开建
  18. 【问题解决】电脑微信聊天记录备份时显示不在同一网络(电脑LAN,手机WIFI)
  19. 在法国读计算机研究生的日子开始了
  20. python实现自动打卡_python实现腾讯文档自动打卡教程

热门文章

  1. 已解决Win10家庭版找不到组策略gpedit.msc
  2. 二叉树深度优先广度优先算法
  3. 储氢合金/金属氢化物床层有效导热系数的数学模型
  4. 2年Android开发面经分享:跳槽网易个人创业失败后,拿到快手,字节,百度,美团的Offer之旅
  5. size_t、sizeof、strlen
  6. Nature:最新一期机器学习在代谢组学、蛋白质组学、微生物组学、基因组学研究中的应用
  7. nessus扫描mysql_Nessus使用笔记.doc
  8. 音视频开发之旅(四)Camera视频采集
  9. photoshop学习之路--------自定义画笔预设与图像动态效果的制作(gif格式输出)
  10. 《我的一个 OIer 朋友》歌词