欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

基于片内WISHBONE总线的高速缓存一致性实现

时间:2022-11-19 08:09:39 其他范文 收藏本文 下载本文

今天小编在这给大家整理了基于片内WISHBONE总线的高速缓存一致性实现,本文共7篇,我们一起来阅读吧!

基于片内WISHBONE总线的高速缓存一致性实现

篇1:基于片内WISHBONE总线的高速缓存一致性实现

基于片内WISHBONE总线的高速缓存一致性实现

摘要:基于IP可重用的设计方法,利用WISHBONE总线协议,把两个已成功开发出的具有自主知识产权的THUMP内核在一个芯片上,实现了片上多处理器FPGA。开发重点是实现基于片内WISHBONE总线的高速缓存一致性协议。

关键词:WISHBONE总线片上多处理器高缓一致性SOCIP

清华大学嵌入式微处理器芯片设计为国家重点863项目,单芯片多处理器设计为项目的一个延伸。单芯片多处理器是提高处理器性能的有效途径,具有低耦合度、粗粒度并行性的主要特点。清华大学已成功开发出具有自主知识产权的MIPS4Kc架构的32位微处理器--THUMPl07。该处理器具有内核性能高、面积小、功耗低的优点。使其经过裁减非常适合作为单芯片多处理器的内核。

本次单芯片多处理器的设计将两个Thumpl07内核集成在一个芯片上,两个内核处于完全对等地位,实现进程级的粗粒度并行。由于已经具有可以利用的内核,开发的重点就集中在高速缓存(Cache)一致性的实现上。芯片采用了基于内部总线写更新监听的高速缓存一致性协议,具有控制逻辑简单、可扩展性好的特点。内部总线采用适合片上系统通信、高可配置性的WISHBONE总线。使用该片上总线有效地解决了IP核可移植性、设计复用的问题[2l]。

1WISHBONE总线

WISHBONE最先由Silicore公司提出,现在被移交给OpenCores组织维护。由于其开放性,现在已有不少用户群体。特别是一些免费的IP核,大多数都采用WISH-BONE标准。该总线结构具有公用的接口规范方便结构化设计,有效地解决了IP核可移植性、设计复用的问题。

WISHBON耳总线为半导体内核提供了可配置的互连方式,能够使各种内核互连起来形成片上系统;WISH-BONE总线具有很强的兼容性,提高了设计的可重用性;WISHBONE总线的接口独立于半导体技术,其互连方式既可以支持FPGA设备,也可以支持ASIC设备;WISHBONE总线协议简单、易懂。

WISHBONE总线是一种主/从接口架构的总线技术,如果具有有效的仲裁机制,总线系统可以支持多个ne/从接口;WISHBONE总线的可配置性主要体现在支持点到点、共享总线、数据流、交叉开关型的互连方式;WISHBONE总线协议既包含了一种容易使用、可靠性高、易测试、所有总线事务都可以在一个时钟周期内协同的同步传输协议,也包含了标准时钟周期的异步传输协议;WISHBONE总线的同步传输协议可以工作在一个大范围的时钟频率上。这样WISHBONE总线接口既可以与内核时钟周期同步,也可与不同的目标设备同步,时序都非常简单。此外,WISHBONE总线还具有如下特点:

・简单、紧凑的硬件逻辑接口,需要更少的逻辑门;

・支持流行的单字读/写、块读/写、读-修改-写的总线协议;

・可调整的总线和操作数位宽;

・支持大端(bigendian)和小端(1ittleendian)两种数据表示方法;

・握手协议能够控制数据传输速率;

・支持单周期数据传输;

・从接口的部分地址解码;

・根据系统需要,用户可自定义增加接口信号;

・系统包含多个MASTER接口时,用户可以自定义总线仲裁方式与算法。

图2

2实现方案

单芯片多处理器的每个内核都有分离的16KB指令高速缓存(1Cache)和16KB数据高速缓存(DCache);指令高速缓存和数据高速缓存都采用两路组相联的映射方式;每块都包含8个字;采用虚拟地址定位、物理地址比较的寻址方法;替换方式为LBU(最近最少使用替换)。

指令高速缓存不涉及一致性问题,不多做说明。数据高速缓存采用基于监听总线的写更新一致性协议Dragonl[3]

协议状态说明见表1。

表1协议状态

状态

说明

干净独占(E)只有一个缓存有这一存储块的拷贝,并且还没有被修改(主存状态也有效)。干净修改(SC)潜在的两个或多个缓冲有这一存储块,主存不一定是最新的。共享已修改(SM)潜在的两个或多个缓冲有这一存储块,主存不是最新的`。该块在被替换时,要更新主存(写回)。一个存储块在一定时间内只能在一个缓冲内共享已修改状态。独点已修改(M)存储块的内容已经被修改,并且只在该存储块里,发生替换需要更新主存的内容。

确定一致性协议后,单芯片多处理器的数据高速缓存单元整体设计见图1。

片内总线采用WISHBONE总线共享型连接,每个内核的数据高速缓存的控制单元都包含WISHBONE总线的一个主接口(MASTER)和一个从接口(SLAVE);数据总线为32位;地址总线为33位,其中最高位是两个从接口的选择位;片内总线采用预先同步传输协议;仲裁方式为轮换型;片外总线接口与广泛应用的工业标准SYSAD系统总线兼容。

在UNCAHCE空间发生的读写操作,直接访问外部总线,与主存通信;在CACHE空间发生的读写操作,过程如下所述:

读缺失:当一个内核的数据高速缓存发生读缺失,由本地主接口通过片内总线向远端数据高速缓存发出读请求,远端从接口通过片内总线应答请求。如果应答有该单元数据,就由远端数据高速缓存调来一个数据块(8个字);如果没有,本地主接口结束片内总线周期,转而访问外部总线,由主存调人数据。

写缺失:内核发生写缺失时,前半部分的操作与读缺失完全一致;只是如果缺失单元是从远端数据高速缓存调来的,由于采用基于写更新的Dragon协议,所以在完成片内总线块传输事务后还要产生一个单字写总线事务,更新远端数据高速缓存单元。

读命中:不会产生任何总线事务。

写命中:如果该单元的原来状态是SC或SM,基于写更新协议,由本地主接口通过片内总线向远端数据高速缓存发出写请求,远端从接口通过片内总线应答请求。如果应答有该单元数据,则通过一个单字写总线事务更新远端数据高速缓存单元;如果没有,结束片内总线周期。

替换:实现写回协议,只有被替换出的单元状态为SM或M状态,才通过外部总线更新主存,其他情况抛弃即可。

注意:完成上述操作后要根据DRAGON协议,更新本地和远端DCahe单元的相关状态。

3总线事务时序分析

由前部分的说明发现在内部总线上可以产生三种类型的总线事务:读缺失时,块传输总线事务;SM或SC状态写命中时,发生单宇写总线事务;写缺失时,先是一个块传输总线事务而后在本地写操作完成后,一个单字写总线事务更新远端的数据高速缓存单元。以下是块传输和单字写总线周期具体的时序分析,下文提到的具体信号其意义可以查阅参考文献[1]。

块传输时序:主接口通过声明CYC_O申请总线的使用权,同时也给出STB_O、CTI_0(010)、WE_O(低电平)和ADR_O;经过若干时钟周期等待后,如果远端从接口给出ACK_I信号,同时给出的SHARE_I信号为低电平(说明远端数据高速缓存没有所需要的数据块,.SHARE_I为自定义的信号),这时主接口忽略DAT-I信号,下一个时钟周期撤销CYC_O信号,结束片内总线周期;如果给出AClI信号的同时,SHARE_I信号为高电平(说明远端数据高速缓存有所需要的数据块),接收DAT-I上的数据;而后7个时钟周期内,每个时钟周期ADR_O数据加4,DAII上的数据根据地址相应地变化,在第7个数据传输的时钟周期CTI_O变为111,告诉远端从接口这是最后一个传输时钟周期,下一个时钟周期:降完成这个总线事务;最后一个时钟周期主接口撤销CYC_O信号,结束片内总线周期。

内块传输时序见图2。

单字写总线周期:主接口通过声明CYC_O申请总线的使用权,同时也给出STB_O、CTI_O(111)、WE_O(高电子)、ADlO和DAT-0;经过若干时钟周期等待后,如果远端从接口给出ACK_I信号,同时给出的SHARE信号为低电子(说明远端数据高速缓存没有所需要的数_I据块),主接口下一个时钟周期撤销CYC_O信号,结束片内总线周期;如果给出ACK_I信号的同时,SHARK-I信号为高电子(说明远端数据高速缓存有所需要的数据块),说明从接口已经用DAT-O上的数据更新了相应的数据单元,下一个时钟周期撤销CYC_O信号,结束片内总线周期。

单字写时序见图3。

块传输总线事务时序图2,单字写总线事务时序图3中WAIT表示主接口等待总线仲裁和从接口的应答,需若干时钟周期,最快的情况下只要一个时钟周期。总线仲裁:如果两个数据高速缓存的主接口同时请求,由仲裁单元决定哪个主接口可以使用片内总线,仲裁的优先级算法是轮换法。数据高速缓存的主接口,在声明CYC_O申请总线后,如果AClI一直是低电平无效,但同时该数据高速缓存从接口的CYC_I信号有效,说明数据高速缓存主接口没有得到总线使用权,主接口撤销CYC_O信号,该数据高速缓存响应从接口的操作,操作完成后,主接口再次声明CYC_O信号请求总线;相反,如果数据高速缓存主接口的ACK_I信号高电平有效,说明得到了总线使用权,可以使用总线。

综上所述,片内总线采用WISHBONE总线地址增量的传输方式,与内核时钟同步,最快可以在9个时钟周期从另一个数据高速缓存调来一个块(8个宇)的内容,可在2个时钟周期更新远端数据高速缓存的一个相关单元;数据高速缓存实现写回、写更新机制,减少了向外部总线写操作的频度。该结构具有可扩展性,只要把片内WISHBONE・总线的地址线的位数扩展(用于选择多个从接口)就可以把多个内核集成在该芯片上,协议无需变化。该种体系结构运行两个耦合度很低的程序,性能最好。

该方案利用WISHBONE总线,基于监听总线的写更新一致性协议,把两个IP核集成在一块芯片上,实现了单芯片多处理器结构的FPGA。该体系结构采用开放的片上总线标准,具有公用的主从接口规范,实现了IP核可移植性,具有设计可复用的优点。

篇2:TMS320F240片内PWM实现D/A扩展功能

TMS320F240片内PWM实现D/A扩展功能

摘要:根据TMS320F240芯片的结构特点,提出一种新颖的基于TMS320F240的PWM输出,实现D/A转换扩展功能的设计方法;详细讨论该设计的理论基础和具体的软、硬件实现;分析实验结果,并给出具体的应用实例。该设计方案简单易行,性价比高,具有一定的通用性。

关键词:数字信号处理器 TMS320F240 PWM D/A转换

TMS320F240(简称F240) 作为一种高速、高集成度、低成本的微控制器,功能非常强大。美中不足的是,F240芯片本身虽然集成了众多满足数字控制系统所需的先进外围设备,包括A/D转换等功能,却唯独没有集成D/A转换功能,因此,在TMS320F240芯片的实际应用过程中,为其增加 D/A转换接口是很有必要的。

本文提出的基于F240芯片PWM输出的D/A转换扩展功能设计,是一种对F240片内的D/A转换设计。通过F240片内的PWM输出,再加上简单的外围电路及对应的软件设计,实现对PWM的信号处理,得到稳定、精确的模拟量输出。(本网网收集整理)

1 原理及误差分析

1.1 基本原理

F240芯片提供的PWM输出,是一种周期和占空比均可变、幅值为5 V的脉宽调制信号。实现PWM信号到D/A转换输出的理想方法是:采用模拟低通滤波器滤掉PWM输出的高频部分,保留低频的直流分量,即可得到对应的D/A输出,如(图1)所示。低通滤波器的带宽决定了D/A输出的带宽范围。

为了对PWM信号的频谱进行分析,以下提供了一个设计滤波器的理论基础。傅里叶变换理论告诉我们,任何一个周期为T的连续信号f(t),都可以表达为频率是基频的整数倍的正、余弦谐波分量之和。它是以时间轴原点为对称点的、单极性的PWM信号,表达式为

其中,f=1/T为基频,式中An、Bn为各自独立的傅里叶系数:

由于f(t)是一个关于原点对称的.偶函数,因此Bn项为0,只需计算An项即可。只要扣除直流分量A0,由f(t)=-f(t+T/2),An的偶系数也将为0,因此,对占空比为k、幅值为5 V的PWM信号有:

A0=5・k

Bn=0

由式(5)可知,直流分量A0就是所需要的 D/A输出,只要改变PWM信号的占空比k,就能得到电压范围为0~5 V的D/A转换输出;An代表PWM信号的高频直流分量,频率为PWM信号基频的整数倍。因此,对于基频为10 kHz的PWM信号,一个理想的剪切频率≤10 kHz的滤波器即可完全滤掉PWM信号的高频谐波分量An,得到低频的直流分量A0,从而实现PWM信号到D/A输出的转换。

1.2 误差分析

D/A转换输出的电压信号有一个纹波叠加在直流分量上。这是D/A转换误差的来源之一。影响D/A转换误差的另外一个重要因素,取决于PWM信号的基频。对于时钟频率为20 MHz的F240芯片,产生一个20 kHz的PWM信号,意味着每产生一个周期的PWM信号,要计数1000个时钟。即所得的直流分量的最小输出为1个时钟产生的PWM信号,等于5 mV(5 V×1/1000),刚好小于10位的D/A转换器的最小输出4.8 mV(5 V/1024)。因此,理想情况下,PWM信号的频率越低,所得的直流分量就越小,D/A转换的分辨率也就相应的越高。如果将PWM信号的频率从20 kHz降到10 kHz,则直流分量输出的最小输出为2.5 mV(5 V/),接近于11位的分辨率。但是,随着PWM信号基频的减小,谐波分量的频率也随之降低,就会有更多的谐波通过相同带宽的低通滤波器,造成输出的直流分量的纹波更大,导致D/A转换的分辨率降低。所以,单纯降低PWM信号的频率不能获得较高的分辨率。通过以上分析可知,基于DSP芯片PWM输出的D/A转换输出的误差,取决于通过低通滤波器的高频分量所产生的纹波和由PWM信号的频率决定的最小输出电压这两个方面。所以要获得最佳的D/A分辨率,在选取PWM信号的频率时不能太小,要适当地折衷,选取一个最合适的值。如表1所列,通过Matlab仿真,可以得到最佳D/A分辨率下的PWM信号频率。

表1 不同设计参数下F240芯片PWM输出实现D/A转换的分辨率

低通滤波器阶数传递函数-3dB带宽/HzPWM频率f/kHz纹波Vpp/VPWM频率决定的分辨率D/A转换的分辨率/位一阶1/(RCs+1)1000100.782.52.7200.395.03.7二阶ω2n/(s2+2ξωns+ω2n)1000100.0622.56.3200.0165.07.9三阶1/(a3s3+a2s2+a1s+a0)1000100.00642.59.1200.000815.09.7

2 硬件设计

一般来说,F240的PWM输出要通过具有一阶阻容滤波及光电隔离功能的I/O接口板后,方可与实际控制对象连接。为了获得高精度的D/A输出,在滤波之前应先通过缓冲器,整体设计框图如图2所示。

滤波器的运算放大器选用OP07。它温漂小、阻抗低、吸收电流大、精度高。考虑到实际情况,设计模拟低通滤波器的阶数一般不超过三阶,否则会增大系统的复杂性,增加系统的成本。下面主要介绍有源低通滤波器的参数设计。

2.1 二阶Butterworth低通滤波器

图3(a)所示,是二阶Butterworth低通滤波器(最平幅值滤波器)的一种实现电路,其传递函数为

在-3 dB带宽为1000 kHz的条件下:

A0=1

由于考虑到不可能找到与所计算的R、C值完全一致的电阻、电容值,而只能选取与实际的电阻、电容值最接近的值,故求解得到:

C1 = 0.1 μF, C2=0.01 μF,

R1=22 kΩ, R2=1 kΩ (7)

在这些参数下,实际的带宽是1074 Hz,Q值为0.645,与理想的二阶Butterworth低通滤波器有一定的误差。

2.2 三阶低通滤波器

图3(b)所示为三阶低通滤波器的一种实现电路,其传递函数为

Vo/Vi=1/(a3s3+a2s2+a1s+a0)    (8)

其中, a0=1+R1/R4

a1=R1(C1+C2)+(R2+R3)C2+R1C2(R2+R3)/R4

a2=R3C2C3(R1+R2)+R2R3C2C3+R1R2R3C2C3/R4

a3=R1R2R3C1C2C3

在-3 dB带宽为1000 kHz的条件下,求解得到:

R1=1.6 kΩ,R2=2.4 kΩ,R3=7.5 kΩ,R4=∞,C1=0.1μF,C2=0.01μF,C3=0.047μF (9)

R4决定滤波器直流分量的增益,选取R4=∞(即不安装R4),则D/A输出增益为1;要想改变带宽大小,只须保持R4和电容值不变,改变其它电阻的阻值即可。

图3 低通滤波器电路

3 软件程序设计和实验结果

利用TMS320F240配套的EVM(Evaluation Module)板作为DSP的实验平台,给定一模拟电压作为F240的A/D输入,将A/D转换的值作为产生PWM波形的DSP定时器中比较寄存器的值;通过中断,不断获取最新的A/D转换值,改变PWM波形的占空比,得到对应幅值的PWM波形,再将所得的20 kHz的PWM信号输入给滤波器,用数字示波器观察滤波器的D/A输出,以评价这种D/A转换方法的实际效果。

3.1 通过D/A转换产生对应幅值PWM波形的DSP程序

基于DSP功能模块化的特点,其汇编程序的编制主要分三个步骤:① 初始化设置时钟源模块,得到所需的CPUCLK和SYSCLK; ② 设置事件管理模块,初始化定时器和A/D转换操作; ③ 编写定时中断服务子程序,即可完成从A/D转换产生对应幅值的PWM波形输出。部分程序代码如下:

;设置 PLL模块

LDP #224;

SPLK #0000000001000001b,CKCR0

;SYSCLK=CPUCLK/2

SPLK #0000000010111011b,CKCR1

;CLKIN(OSC)=10MHz, CPUCLK=20MHz

SPLK #0000000011000011b,CKCR0

;使能锁相环(PLL)操作

SPLK #0100000011000000b,SYSCR

;CLKOUT=CPUCLK

;设置EV 管理器

LDP #232;

SPLK #0,T1CMPR ;初始化定时比较寄存器

SPLK #0000000001010101b,GPTCON

;通用定时器的PWM输出为低有效

SPLK #1000,T1PR ;设置PWM波形的周期为20 kHz

SPLK #0000h,T1CNT ;初始化计数寄存器

SPLK #0001000000001010b,T1CON

;设置连续增计数方式,使能比较操作

SPLK #0000000010000000b,EVIMRA

;清除定时器1比较中断屏蔽位

LDP #224

SPLK #1000110100000010b,ADCTRL1

;设置A/D连续转换模式,选择通道CH0

SPLK #0000000000000101b,ADCTRL2

;设置A/D转换输入时钟预定标因子为16

LDP #232

SBIT1 T1CON,B6_MSK ;使能定时器1中断启动位

LDP #224

SBIT1 ADCTRL1,B0_MSK;使能A/D转换启动位

CLRC INTM;

END B END ;等待定时器1中断的产生

;产生PWM 波形ISR

Change_CMPR:

LDP #224 ;定时器1比较中断服务子程序

LACC ADCTRL1;

SACL ADCTRL1 ;清除片内A/D转换中断标志位

LACC ADCFIFO1;读取最新的A/D转换值

RPT #5;

SFR ;把存于结果寄存器的高10位的A/D

;转换值移至ACC的低十位

LDP #232;

SACL T1CMPR ;将A/D转换值存于定时比较寄存器

LACC EVIFRA;

SACL EVIFRA ; 清除定时器中断标志

CLRC INTM ;开中断

RET ;中断返回

3.2 PWM输出实现D/A转换功能的实验结果

如图4所示,是在给定一恒定的3.5 V模拟电压作为F240的A/D输入的情况下,所得的PWM输出实现D/A转换的波形图。

波形1为不通过低通滤波器的原始PWM信号。

波形2为PWM信号通过一阶低通模拟低通滤波器后的D/A输出波形,滤波器参数为R=1 kΩ,C=0.1μF,带宽为1592 Hz。可以看出,一阶下的D/A输出为一锯齿波,可用性很差。

波形3为PWM信号通过二阶Butterworth低通模拟滤波器后的D/A输出波形,滤波器参数按照式(7)选取。可以看出,二阶下的D/A输出平均值接近3.5 V,只是尖峰毛刺比较大,有一定的可用性。

波形4为PWM信号通过三阶低通模拟滤波器后的D/A输出波形,滤波器参数按照式(9)选取。可以看出,三阶下的D/A输出毛刺很小,D/A转换的分辨率约为9.2位, 非常接近于理想的D/A输出,可用性强。

实验结果表明,DSP的PWM信号经过三阶低通模拟滤波器后,得到的D/A转换输出带宽较大,在1000 Hz左右;分辨率较高,约为9.5位,可以满足实际应用的需要。

篇3:一致性环Hash算法.NET实现

一致性环Hash算法有一个大用处就是解决Memcache服务器down机问题的,目的是增加或者移除Memcache服务器后,最大限度的减少所受影响。

理论方面的就不介绍了,网上有太多资料了,请大家自己搜索搜索。

在此写了一个ConsistencyRing类来实现算法,具体代码在此下载。

测试类如下:

public static void Test

{

{

ConsistencyRing cr = new ConsistencyRing();

Console.WriteLine(“=============AddServer Test=============”);

cr.AddServer(“1”);

cr.AddServer(“5”);

cr.AddServer(“9”);

cr.AddServer(“11”);

cr.AddServer(“3”);

Console.WriteLine(“=============RemoveServer Test=============”);

cr.RemoveServer(“5”);

cr.RemoveServer(“3”);

cr.RemoveServer(“1”);

cr.RemoveServer(“9”);

}

{

ConsistencyRing cr = new ConsistencyRing();

cr.AddServer(“1”);

cr.AddServer(“5”);

cr.AddServer(“9”);

cr.AddServer(“11”);

cr.AddServer(“3”);

Console.WriteLine(“=============GetServerIp Test=============”);

string key;

string serverIp;

key = “A1”;

serverIp = cr[key];

Console.WriteLine(“A1所在IP:” + serverIp);

cr.RemoveServer(“9”);

serverIp = cr[key];

Console.WriteLine(“A1所在IP:” + serverIp);

}

}

上面AddServer/RemoveServer中的参数为了演示,因此改成了简洁的数字string,大家使用时完全可以用192.168.1.1这样的string来传,

运行结果:

篇4:应用McBSP实现I2C总线控制器

应用McBSP实现I2C总线控制器

摘 要:提出了在TMS320C6000系列DSP上应用McBSP实现I2C总线接口协议的方法,使DSP可以接入其他需要I2C总线配置的智能器件,系统结构简单,硬件设计容易,资源消耗小。

关键字:I2C总线  GPIO  McBSP  DSP

1 引 言

TI公司的TMS320C6000[1,2]系列是高性能的DSP,可广泛的用于XDSL、无线基站、数字图像处理等方面。在进行数字图像处理时,通常需要视频解码器诸如SAA7111A之类的模拟视频前端,而大多数的视频解码器进行初始化通常是通过两线的I2C总线接口,但是现在的DSP和MCU大部分都没有I2C总线接口,在这种情况下我们可以应用两个通用的IO线,通过软件的方法来模拟I2C总线的协议,继而完成I2C总线的接口。在TMS320C6000中通常都有两个或两个以上的多通道缓冲串行接口McBSP,McBSP不仅可以配制成串行接口还可以独立的配制成通用的输入(GPI)、输出(GPO)和输入输出端口(GPIO)。

I2C[3]串行总线是用双向数据线(SDA)和串行时钟线(SCL)两根信号线,在连接到该总线的器件之间传送信息。总线上的.每个器件均可设置一个唯一地址,然后根据所设的功能进行信息的发送或接收。除了作为发送器和接收器以外,在执行数据传输时,总线的器件还可以设定为主控器和受控器。通常由主控器启动总线上的数据传输,并产生数据传输所需的时钟信号。而被其寻址的其它器件均为受控器,这意味着总线上可连接多个有控制总线的器件。

I2C总线上的数据传输率为100kbit/s,快速方式下可达400kbit/s。连接到总线上的器件数仅受400pF的总线电容的限制。同时,为了避免总线信号的混乱,要求连接到总线上的各器件输出端必须是集电极开路或漏极开路,以便产生“线与”功能。I2C总线上的SDA和SCL线都是双向传输线,它们可通过一个电阻连接到正电源端,当总线处于空闲状态时,两条线均为高电平。

2 硬件设计

I2C总线的硬件设计非常方便,只需要将SDA 和SCL连接即可,在I2C总线上只允许有一个主控器,其余的都是受控器。当节点的个数大于了400pF的限制时,可以通过总线驱动器如82B715来进行总线扩展。连接见图1

3 软件设计

3.1 McBSP的配置

I2C总线应用McBSP的两个管脚,首先禁用McBSP功能以便将McBSP的管脚配制成GPI、GPO、GPIO。本文应用McBSP0的CLKX0作为I2C总线的SCL,FSX0作为I2C总线的SDA,McBSP的DX,DR,通常不能配置成I2C的SDA,因为SDA是双向的,而DX,DR只能配制成单一的输入或输出。

配置代码如下:

McBSP0_SPCR=0x00000000;//McBSP0 发送和接收复位

McBSP0_PCR=0x00003F00;// McBSP0的所有的管脚都配置为GPIO,CLKX0和FSX0为输出

对于主机来说SCL总是输出,所以它的方向是保持不变的,SCL应该输出0,1作为接口的时钟,为了实现此功能我们定义一个宏(MACROS):SET_SCLHI( ) SET_SCLLO( )

#define Set_SCLHi( ) McBSP0_SPSA = PCR; McBSP0_SPSA |= 0x00000002

#define Set_SCLLo( ) McBSP0_SPSA = PCR; McBSP0_SPSA &= 0Xfffffffd

I2C总线的数据线SDA当写的时候是输入,读的时候是输出。为了改变SDA的方向可以定义Set_SDADirOut( ) Set_SDADirIn( )

#define Set_SDADirOut( ) McBSP0_SPSA = PCR; McBSP0_SPSA | = 0x00000800

#define Set_SDADirIn( ) McBSP0_SPSA = PCR; McBSP0_SPSA &= 0xFFFFF7FF

SDA应该依照数据位的0,1来变化,为了输出1,0定义Set_SDAHi( ) Set_SDALo( )

#define Set_SDAHi( ) McBSP0_SPSA = PCR; McBSP0_SPSA |= 0x00000008

#define Set_SDALo( ) McBSP0_SPSA = PCR; McBSP0_SPSA &= 0xFFFFFFF7

定义好之后可以模拟I2C总线的协议进行传送,例如在SAA7111A上的I2C总线接口是用来对SAA7111A进行初始化用的,SCL的频率可以从0到400KHZ,为了控制SCL的频率可以应用DSP的TIMER0来控制。

当CPU为100MHZ时:

TCR = 0x00000010; // 停止 TIMER0 and TDDR=0

PRD = 6249; // TIMER0 rate = CPU-Frequency/(PDR+1) = 100MHz/6250 = 16kHz

...

TCR &= 0xFFFFFFEF; // 开始 TIMER0

3.2 I2C总线协议编程

3.2.1  I2C总线协议读写数据流的编程

为了进行I2C总线的通讯,我们选用每位数据流4帧(FRAMES),以便延迟和噪声干扰最小,4帧每位的数据流保证了SDA不会变化在SCL的边沿处,仅仅允许数据变化在FRAME0,读仅在FR

AME2。如图2所示

I2C总线的写程序如下

void I2CWrite(unsigned int WriteBit)

{Set_SDADirOut( ); // 设置SDA为输出

switch(FrameCount)

{

case(0): // 起始帧

Set_SCLLo( ); // SCL 为 0

if (WriteBit == 0) // SDA = WriteBit

Set_SDALo( );

else

Set_SDAHi( );

break;

case(3): // 第4帧

Set_SCLLo( ); //

break;

default: // 在第2,3帧

Set_SCLHi( ); // SCL 为 1

}

FrameCount += 1; // 帧计数

if (FrameCount >3)

{

FrameCount = 0;

BitIndex = (BitIndex >>1); } // 准备下一个发送位

}

I2C总线的读程序与写程序很类似,只需要改变SDA为输入即可。

3.2.2 I2C总线的开始位和停止位的编程

I2C总线的开始位和停止位有3帧产生,在I2C总线传输过程中,仅当总线空闲(SCL线和SDA线均为高电平)时,数据传送才能开始,此时总线上的任何器件均可以控制总线。其中当SCL线为高电平且SDA线由高变低时为开始条件;而当SCL线为高电平且SDA线由低变高时为结束条件。如图3所示

开始位:

void I2CSTA ( )

{ // I2C 开始位

Set_SDADirOut ( );//定义SDA为输出

switch ( FrameCount )

{

case (1): // 第2帧

Set_SCLHi ( );

Set_SDALo( );

break;

case (2): // 第三帧

Set_SCLLo ( );

Set_SDALo( );

break;

default: // 第一帧

Set_SCLHi ( );

Set_SDAHi ( );

}

FrameCount += 1; // 帧计数

if ( FrameCount >2 )

{

FrameCount = 0;

BitIndex = 0x0080; } // 定义的低8位

}

停止位的编程方法只需要按照上面所说的将SCL线为高电平且SDA线由低变高即可。

3.2.3 I2C总线的数据格式

起始位 受控器件地址 读写控制位0/1 应答位 数据 应答位 … 停止位

I2C总线数据传输格式[3]如图4。其中第一部分为数据传输起始信号,即由此开始进行数据传送;第二部分为受控器地址,用来选择向哪个受控器传送数据;第三部分为读/写控制位,用于指示受控器的工作方式,0表示写,1表示读;第四部分是被主控器选中的受控器向主控器回传的确认信号;第五部分是所传送的数据,每传送一个字节数据,都要求有一个应答位;第六部分是数据传输的结束信号。每个具有I2C总线接口的受控器件都有唯一固定的地址,当主控器发送数据时,I2C总线上挂接的受控器件都会将主控器发出的、位于起始信号后的8位地址信息与自己的地址进行比较,如果两者相同,则认为该受控器件被选中,然后按照读/写位规定的工作方式接收或发送数据。可以应用上面的程序来按照I2C总线的数据格式进行数据传送。

4 结论

应用DSP的McBSP来设计I2C总线接口,硬件接口简单,调试方便,并且可以节省硬件的花费,此方法已经应用在基于DSP的图像匹配机中,方法可行,并运行可靠。

篇5:应用McBSP实现I2C总线控制器

应用McBSP实现I2C总线控制器

摘 要:提出了在TMS320C6000系列DSP上应用McBSP实现I2C总线接口协议的方法,使DSP可以接入其他需要I2C总线配置的智能器件,系统结构简单,硬件设计容易,资源消耗小。

关键字:I2C总线  GPIO  McBSP  DSP

1 引 言

TI公司的TMS320C6000[1,2]系列是高性能的DSP,可广泛的用于XDSL、无线基站、数字图像处理等方面。在进行数字图像处理时,通常需要视频解码器诸如SAA7111A之类的模拟视频前端,而大多数的视频解码器进行初始化通常是通过两线的I2C总线接口,但是现在的DSP和MCU大部分都没有I2C总线接口,在这种情况下我们可以应用两个通用的IO线,通过软件的方法来模拟I2C总线的协议,继而完成I2C总线的接口。在TMS320C6000中通常都有两个或两个以上的多通道缓冲串行接口McBSP,McBSP不仅可以配制成串行接口还可以独立的配制成通用的输入(GPI)、输出(GPO)和输入输出端口(GPIO)。

I2C[3]串行总线是用双向数据线(SDA)和串行时钟线(SCL)两根信号线,在连接到该总线的器件之间传送信息。总线上的每个器件均可设置一个唯一地址,然后根据所设的功能进行信息的发送或接收。除了作为发送器和接收器以外,在执行数据传输时,总线的器件还可以设定为主控器和受控器。通常由主控器启动总线上的数据传输,并产生数据传输所需的时钟信号。而被其寻址的其它器件均为受控器,这意味着总线上可连接多个有控制总线的器件。

I2C总线上的数据传输率为100kbit/s,快速方式下可达400kbit/s。连接到总线上的器件数仅受400pF的总线电容的限制。同时,为了避免总线信号的.混乱,要求连接到总线上的各器件输出端必须是集电极开路或漏极开路,以便产生“线与”功能。I2C总线上的SDA和SCL线都是双向传输线,它们可通过一个电阻连接到正电源端,当总线处于空闲状态时,两条线均为高电平。

2 硬件设计

I2C总线的硬件设计非常方便,只需要将SDA 和SCL连接即可,在I2C总线上只允许有一个主控器,其余的都是受控器。当节点的个数大于了400pF的限制时,可以通过总线驱动器如82B715来进行总线扩展。连接见图1

3 软件设计

3.1 McBSP的配置

I2C总线应用McBSP的两个管脚,首先禁用McBSP功能以便将McBSP的管脚配制成GPI、GPO、GPIO。本文应用McBSP0的CLKX0作为I2C总线的SCL,FSX0作为I2C总线的SDA,McBSP的DX,DR,通常不能配置成I2C的SDA,因为SDA是双向的,而DX,DR只能配制成单一的输入或输出。

配置代码如下:

McBSP0_SPCR=0x00000000;//McBSP0 发送和接收复位

McBSP0_PCR=0x00003F00;// McBSP0的所有的管脚都配置为GPIO,CLKX0和FSX0为输出

对于主机来说SCL总是输出,所以它的方向是保持不变的,SCL应该输出0,1作为接口的时钟,为了实现此功能我们定义一个宏(MAC

[1] [2] [3]

篇6:内消瘰疬片说明书

【商品名称】内消瘰疬片(隆顺榕)

【拼音全码】NeiXiaoLouLiPian(LongShunZuo)

【主要成份】夏枯草、浙贝母、海藻等。

【性状】内消瘰疬片(隆顺榕)为棕褐色的片;味咸、苦。

【适应症/功能主治】软坚散结。用于瘰疬痰核或肿或痛。

【规格型号】0.6g*12s*4板

【用法用量】口服,一次4~8片,一日1~2次。

【不良反应】尚不明确。

【禁忌】对内消瘰疬片(隆顺榕)过敏者禁用。

【注意事项】1.忌服辛辣刺激性食物。2.对内消瘰疬片(隆顺榕)过敏者禁用,过敏体质者慎用。3.药品性状发生改变时禁止服用。4.请将此药放在儿童不能接触的地方。5.如正在服用其他药品,使用内消瘰疬片(隆顺榕)前请咨询医师或药师。

【药物相互作用】如与其他药物同时使用可能会发生药物相互作用,详情请咨询医师或药师。

【贮藏】密封,置阴凉处。

【包装】0.6g*12s*4板/盒。

【有效期】24月

【批准文号】国药准字Z1267

【生产企业】天津中新药业集团股份有限公司隆顺榕制药厂

内消瘰疬片(隆顺榕)的功效与作用内消瘰疬片(隆顺榕)软坚散结。用于瘰疬痰核或肿或痛。

内消瘰疬片使用常见问题

问:内消瘰疬片(隆顺榕)主治功能是什么呢?

答:软坚散结。用于瘰疬痰核或肿或痛。

篇7:用Verilog HDL实现I2C总线功能

用Verilog HDL实现I2C总线功能

摘要:简述了I2C总线的特点;介绍了开发FPGA时I2C总线模块的设计思想;给出并解释了用Verilog HDL实现部分I2C总线功能的程序,以及I2C总线主从模式下的仿真时序图。

关键词:I2C总线 FPGA Verilog HDL 时序

开发FPGA时,利用EDA工具设计芯片实现系统功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。在软件设计过程中,越来越强调模块化设计。I2C总线是Philips公司推出的双向两线串行通讯标准,具有接口线少、通讯效率高等特点。把I2C总线设计成相应的模块,有利于相关FPCA的开发。 目前有一些介绍相关开发的资料,但都是利用VHDL语言或AHDL语言实现的。本文给出利用Verilog HDL语言设计的I2C总线模块。

1 I2C总线概述

I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。这种总线可以设计成很多种通讯配置,但本文只讨论主从系统的应用。主器件控制总线通讯,开始/结束传送、发送信息并产生I2C系统时钟。在写操作过程中,从器件一旦被主控器件寻址,就执行特定的相应功能。在读操作过程中,主控器件从从器件那里获得数据。在整个主从传送过程中,所有的事件都通过主控器件的SCL时钟线达到同步。连到总线上的器件的接口形式必须是漏极开路或集电极开路输出状态。通过上拉电阻,使得两根总线在空闲的状态下都为高电平状态。因此I2C总线上具有线与功能,即总线上的所有器件都达到高电子状态时,I2C总线才能达到高电平状态,从而使总线上的高速器件和慢速器件工作同步。

在I2C协议中,从器件地址是一个唯一的7位地址。接下来是一个读写方向标志位,读状态是高电平、写状态是低电子。

(本网网收集整理)

2 I2C模块的设计与实现

根据I2C协议中传输过程的特点,I2C模块可以划分为字节发送模块、字节接收模块、开始条件模块、停止条件模块。其中,字节发送模块、字节接收模块和停止条件模块为基本模块。在开始条件模块中,因为需要发送从器件地址,所以要调用字节发送模块。

下面给出用Verilog HDL语言实现字节发送模块的关键程序。相关变量的声明在此略去。程序在Max+PlusII环境下编译、调试、仿真。

assign en_sdao=tempen_sdao;//设置SDA三态输出使能

assign send_byte_over=tempsend_byte_over;

assign NO_ACK=tempNO_ACK;

assign sdao=tempsda;

assign sclo=tempscl;

always@(posedge send_byte_clk)

begin

case(send_byte_zt)

sendbit 1:

begin

if(send_byte_num==0)

begin

shiftdata[7:0]=indata[7:0];

end

shiftdata=shiftdata<<1;

tempsda=shiftdata[8];

tempscl=1; //置SCL为高电平

send_byte_zt=delay_1;

send_byte_num=send_byte_num+1;

end

delay_1: //延时三个周期

begin

if(delay_counter>=2)

begin

send_byte_zt=sendbit2;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

end

end

sendbit2:

begin

tempsc1=0; //SCL置零

send_byte_zt=delay_2;

end

delay_2: //延时三个周期

begin

if(delay_counter>=2)

begin

send_byte_zt=sendbit3;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

end

end

sendbit3: //判断是否字节中所有位都发送完毕

begin

if(send_byte_num<=8)

begin

send_byte_zt=sendbit1;

end

else

begin

send_byte_zt=ForACK1;

send_byte_num=0;

end

end

ForACK1:

begin

tempsda=1; //释放数据线,等待应答信号

send_byte_zt=delay_ACK;

end

delay_ACK: //延时

begin

if(delay_counter>=3)

begin

send_byte_zt=ForACK2;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

tempscl=1;

end

end

ForACK2:

begin

send_byte_zt=AckYESNO;

tempen_sdao=0; //输出SDA使能信号,控制sdao和sdai

end

AckYESNO:

begin

if(sdai) //如果应答信号sdai为1,NO_ACK置1

begin

tempNO_ACK=1; //设置未应答标志信号

end

tempsc1=0; //终止应答位

send_byte_zt=Finish_delay;

end

Finish_delay: //延时

begin

if(delay_counter>=2)

begin

tempsend_byte_over=1;

send_byte_zt=FinishACK1;

delay_counter=0;

end

else

begin

delay_counter=delay_counter+1;

send_byte_zt=send_byte_zt;

end

end

FinishACK1:

begin

send_byte_zt=sendbit1;

send_byte_num=0;

end

default:

begin

send_byte_zt=sendbit1;

send_byte_num=0;

end

endcase

end

程序中sdao、sclo为输出信号,sdai为应答信号,en_sdao是对sdao和sdai进行切换的信号。I2C总线具有SDA和SCL两根信号线,所以在整个模块设计中,把sdao/sclo和sdai/scli作为两组信号。当需要向外部SDA信号线上输出信息时,sdao连到SDA信号线上;当需要从外部SDA信号线上读入信息时,置sdao成高阻态,sdai连到SDA信号线上。en_sdao信号作为这一过程的切换信号。在程序中定义了一些状态信号:NO_ACK、send_byte_over。其中,NO_ACK信号判断从器件是否对发送的信号给予了应答。send_byte_over信号判断字节是否传输完毕。这些信号可以传递给上一层设计模块,以控制程序的流程。为了使I2C总线能够有效地通讯,必须考虑信号的建立和保持时间,所以程序中设置了相应的延时部分。另外,在以clk为触发信号的过程模块中,定义send_byte_clk信号为时钟信号的两倍频信号

,并加入字节发送模块使能信号start_send_byte控制模块工作于篇幅所限,略去该过程模块。

字节发送模块的'仿真测试结果如图1所示。

根据I2C总线标准,利用Verilog HDL很容易实现字节接收模块、开始条件模块、停止条件模块这三个模块。图2是数据发送过程的仿真测试结果。从器件的7位地址为101011,向从器件发送的数据为00010111。aensclo和aensdao分别是sclo/scli和sdao/sdai的切换信号。

图3是数据接收过程的仿真测试结果。从器件的7位地址为0011001,从器件发送的数据为11111111。ensclo和ensdao分别是sclo/scli和sdao/sdai的切换信号。

将图2和图3所模拟的I2C总线时序与I2C总线协议中相关要求进行比较,满足I2C总线的时序要求。

对各个模块进行多层次处理,形成I2C总线模块。

以该I2C总线模块为基础,编写FPGA与AT24C01A(ATMEL公司生产的E2PROM)的通讯程序。然后把相关程序下载到EPF10Kl0LC84-3中,与AT24C01A进行实际通讯实验,效果良好。

航空电子总线测试系统的设计与实现

《基于片内WISHBONE总线的高速缓存一致性实现(整理7篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

最新推荐
猜你喜欢
点击下载本文文档