查看完整版本: 基于Verilog的SMBus总线控制器的设计与实现

liyf 发表于 2014-10-5 10:15:27

基于Verilog的SMBus总线控制器的设计与实现

基于Verilog的SMBus总线控制器的设计与实现

摘要:SMBus是一种高效的同步串行总线。通过分析SMBus总线协议,提出了一种运行于基于PCI-Express技术的桥接芯片上的SMBus控制器的设计方案,并且用Verilog语言描述,最后在Altera公司的FPGA上得以实现。通过仿真测试,证明该方法是稳定有效的。
   关键词:SMBus 多μC通讯系统 Verilog
SMBus是Intel公司于1995年发布的一种双向两线串行通讯总线标准,具有接口线少、通讯效率高等特点。应用于多μC(microcontroller)通讯系统中,可以满足绝大多数情况下对传输速率、信号稳定性等性能的要求,且相对于并行总线节省了大量的硬件资源。因此多μC通讯系统采用SMBus总线来实现是一种很好的解决方案。
本文提出一种基于Verilog的SMBus总线控制器的设计方法。该方法将总线控制器用有限状态机来实现,并将其应用于基于PCI-Express技术的桥接芯片中。通过仿真测试,证明该方法是稳定有效的。
1 SMBus规范分析
SMBus由两根总线即串行数据线(SDA)和串行时钟线(SCL)构成。主要应用于主从系统。主器件控制总线操作,包括开始/结束传输、发送信息并产生SMBus总线系统时钟等。在整个传输过程中,所有的传送都通过主控的SCL来同步。为使总线有“线与”功能,所有器件的SMBus接口都必须是漏极开路或集电极开路的,并且通过上拉电阻使总线在空闲状态下为高电平状态。这种结构能使不同速度的器件同步运行。图1是典型的SMBus总线结构图。

    1.2 SMBus通讯时序
总线上的所有器件都有一个唯一的地址,且都可以工作在传送或接收方式。因此,有四种工作模式,即主发送、主接收、从发送和从接收。SMBus总线还具有总线仲裁功能,保证在同一时间只有一个主器件在控制总线。
图2是读/写一个字节的时序格式。图中白色块是主器件控制SDA线,灰度块是从器件控制SDA线,SCL线一直都由主器件控制。由图可见,传输由一个开始条件开始,并由一个结束条件中止。SDA上的数据在SCL高电平时必须保持稳定,不允许有电平跳变;SDA电平只有在SCL低电平时才可以改变。开始条件和结束条件是特殊的,可以在SCL高电平时改变SDA的电平,在SCL高是电平时,开始条件是把SDA从高电平拉到低电平,而结束条件则把SDA从低电平拉到高电平。开始条件和结束条件的这种定义方法可以避免电平与传输的数据相混淆。
SMBus协议定义了十二种传输命令格式,其中以读/写一个字节命令格式最为重要。本文所设计的控制器主要用这两种命令格式,所以本文主要分析这两种格式,其它的与之类似,可以很容易地加以扩展,在此略过。
下面分析图2的时序:
(1)总线空闲时,SCL和SDA保证为高电平,等待开始条件。
(2)主控产生开始条件,表明要发起传输。
(3)主控传送一个7位地址和一个写位,指定目标器件和写方式。
(4)目标器件应答。
(5)主控传送一个8位Command Code,指定本次操作类型。
(6)目标器件应答。
(7)如果是write byte,主控直接传送1byte数据;如果是read byte,则要产生restart条件,后跟目标地址和一个读位,然后开始接收目标数据。
(8)由接收方应答。
(9)主控发出结束条件,结束整个传输。


图2

    在SMBus上传输的每一个数据包括8个数据位和一个确认位,所以需要9个SCL时钟。主控确认位时释放总线,由从器件来驱动SDA。
1.3 SMBus的总线仲裁
一个主控开始一个传输时并不知道是否还有其它主控也想进行传输。当CLK为高电平时将在SDA线上进行仲裁。当一个主控发送高电平而有其它的主控发送低电平时,这个主控将失去总线控制权。
如果一个主控同时具有检测目标器件的功能,那当它失去总线控制权时,它仍将检测总线上实际传送的地址,以确定掌握总线控制的主控进行操作的目标。
2 SMBus控制器设计
本文将SMBus控制器分为两个模块:与SMBus的接口模块和与μC的接口模块。与SMBus的接口模块输出SDA和SCL两个信号;与μC的接口模块输出ADDR、DATA及若干控制信号。
为了便于μC对控制器的操作,与μC的接口模块中定义了四个8位寄存器,分别是数据寄存器(DR)、地址寄存器(AR)、状态寄存器(SR)和控制寄存器(CR)。DR存放传送或接收的数据;AR存放控制器的本地地址;SR存放当前控制器的状态;CR存放控制器配置和操作命令。SR是只读的,其它寄存器都可以被μC进行读写。
与SMBus的接口模块又分成下列几个分模块:SCL看门狗、开始/结束信号检测、仲裁检测、开始/结束信号生成、SCL生成状态机和主状态机等模块。
看门狗模块用来处理SMBus协议规定的正常SCL和SDA不可以出现的两种情况:
(1)SCL低电平超过25ms。一旦超过,所有器件必须重置。在本设计中,一旦检测到SCL下降沿就开始计时,25ms内出现上升沿则计数器清零。在计数超过时限则把控制寄存器中的RESET位置位。
(2)SCL和SDA高电平超过50ms。一旦超过,所有器件都认为总线处于空闲状态。这时会将状态寄存器中的BB(Bus Busy)位清零。


图3

    SCL生成状态机模块用来控制SCL线。当SMBus处于主控模式时,它就要在传输期间一直控制SCL线。SCL的频率可以从10kHz到100kHz不等,可以通过对系统时钟进行分频得到。程序中定义了一些常量,如HIGH_COUNT、LOW_COUNT、HOLD等,用来设定计数器的上界,这样不仅使信号频率满足要求,而且也满足了SMBus对信号的一些电气要求,比如数据维持时间、开始结束信号维持时间等。有了这些量,修改总线频率也非常方便。
从对图2时序的分析可以看出,控制器只在有限的几个状态之间控制转换,所以在与SMBus接口的模块中采用有限状态机进行设计是合适的。图3为SMBus将制器的状态机图示及状态之间转换的条件。本示意图是读/写一个字节的状态机,是整个状态机的主体框架,其它命令格式只需在这个状态机上进行简单的修改即可。
下面以从器件为例分析一下主状态机。处于空闲状态时,若检测到开始信号,则进入接收地址状态。收完8位后,前7位和内部地址寄存器前7位进行比较,若相同则确认(拉低SDA),不同则不响应,因为主控找的不是自己。地址相同确认后开始接收命令,收完8位后确认。然后对命令解码,根据命令时入相应状态。当数据传送结束时,确认或被确认转到结束状态,一个时钟后返回空闲状态。
其它模块处理一些简单的事件,在此从略。
3 仿真
(1)从器件地址为1110010,主器件写11001101,写一个字节,命令为00000110。
(2)从器件地址为1110010,内部数据为10001100,主器件读一个字节,命令为00000111。
用modelsim6.0进行前仿真,波形图如图4所示。

图4
    从仿真结束上看,总线波形满足SMBus总线的时序要求(符合图2的格式)。
用Altera公司的quartus II 4.0综合后,下载到Altera eplk30 FPGA芯片上进行测试,测试结果一切功能正常。

4 实际应用
本文设计的SMBus总线控制器应用于PCI-EXPRESS桥接芯片中,框图如图5所示。
在芯片初使化阶段,外围器件需要向桥接芯片的配置表内写入关于外围器件的一些属性(attribute),这样桥接芯片才能正常工作。因为这些信息比较特殊,所以用SMBus总线传输比较合适,而这正是在该芯片中应用SMBus控制器的原因。
5 注意事项
(1)SDA和SCL都定义为双向口,既要接收数据也要发送数据。在双向口的使用上,要注意读数据时要将双向口置为高阻态。
(2)状态机采用两个always块设计,一个时序slways块和一个组合always块。这样写不但易于综合,而且清楚明了,便于实现。
本文采用有限状态机的方法,将SMBus控制器分为与SMBus接口的模块和与μC接口的模块两个模块,从而实现SMBus总线控制器的设计。并将其应用于PCIPCI-EXPRESS桥接芯片中,通过软件及在altera公司的eplk-30 FPGA芯片上进行仿真测试,结果表明该方法是稳定有效的。

李小路 发表于 2021-6-23 15:01:32

谢谢分享!:D
页: [1]
查看完整版本: 基于Verilog的SMBus总线控制器的设计与实现