位置:51电子网 » 技术资料 » 单 片 机

MCS-51单片机串行口IP核的实现

发布时间:2008/8/19 0:00:00 访问次数:560

  本文介绍了利用eda技术设计出一种功能和通信协议与mcs-51系列单片机的串行口相兼容,性能有大幅提高的串行口控制器的ip核,并经过验证获得了满意的效果。

  1 引言

  随着集成电路的深亚微米制造技术和eda技术的迅猛发展,芯片的密度和复杂度不断提高,复用以前的设计模块用于asic芯片和在一块芯片上实现嵌入式系统的功能形成所谓的片上可编程系统( system on programmable chip,sopc) 已成为一种发展的新趋势。ip core(知识产权核) 设计的重用性以及sopc 技术的出现,以其设计的灵活性大大缩短了产品的设计周期,减少了设计成本,降低了设计风险, 加快了产品的上市速度。本文中介绍的串行口控制器是一种功能和通信协议与mcs-51系列单片机的串行口相兼容,性能有大幅提高的数据通信部件,其往往于低速低成本的微机与下位机的通讯中,并允许在串行链路上进行全双工的通信。通过ip核重用技术,可广泛应用在各种soc、嵌入式微处理芯片的设计以及工业应用中。

  2 系统简介

  本课题采用altera公司的max+plusⅱ10.0设计平台,以超高速集成电路硬件描述语言vhdl为系统逻辑描述的唯一表达方式,采用自顶向下的设计原则,对mcs-51单片机的串行接口进行反相设计。同时选用altera公司的acex系列器件来实现最终的ip核。由于篇幅的关系,笔者不打算对开发平台、开发工具以及最终实现硬件电路的fpga芯片进行介绍,而是着重介绍整体的设计思想。根据对mcs-51单片机的串行接口块功能的剖析[1]和模块化的设计思想,在设计时进行模块划分,可划分为4个子模块,它们分别是:

  (1)串口时钟发生器模块;

  (2)数据检测器模块;

  (3)发送器模块;

  (4)接收器模块。由于同步电路较容易使用寄存器的异步复位/置位端,可以使整个电路有一个确定的初始状态;使用同步电路易于消除电路的毛刺,使设计更可靠;同步电路可以很好地利用先进的设计工具,如静态时序分析工具等,为设计者提供最大便利条件,便于电路错误分析,加快设计进度。所以我们采用严格的同步设计电路来设计串行口ip核,即本设计中只有一个clk上升沿,从而保证了每一个触发器同步动作,消除了时钟不同步带来的误动作。

  3 系统现实

  设计一个软核,首先要确定本核与外部的信息交换通路,即本模块与外部电路的接口,友好的接口模型可以大大提高ip核的使用范围。图1是串行口ip核的接口模型图,图中左边的引脚是输入引脚,右边是输出引脚,图中引脚的宽度均有标明(未写出宽度表明宽度为“1”)。由于本设计不支持i/o口的复用,所以为串行口工作于模式0下增加了rxd_o和rxdwr两个输出引脚,前者用于输出,后者为输出有效控制位(rxdwr为高电平时,指示输出)。串行口控制寄存器scon在设计中也被分成两部分,一部分接收来自控制器的输入(一共6位,sm0、sm1、sm2、ren、tb8和ri),一部分作为输出送往控制器(一共3位,rb8以及分别指示发送和接收完毕的两位,控制器会根据这两位来对中断标志置位)。至于发送中断标志位ti,由于其不会影响串行口的工作过程所以在此并未列出,它将在控制器中得到体现。

图1 串行口输入输出引脚图

  串行口有四种工作方式,方式0的波特率固定的(为1/12倍的输入时钟频率);方式1和方式3的波特率是定时器/计数器1的溢出率的1/16或1/32倍;而方式2的波特率则是输入时钟频率的1/32或1/64倍。由此可见,首先必须要解决的问题就是设计分频器。由于在方式0下,串行口是作半双工的同步移位寄存器使用,其发送和接收的波特率是一样的,因此对于方式0,串行口内部的分频信号只需要一路即可。但是对于其他方式,串行口均是工作在全双工的状态下,因此,每种方式下均需要两路分频信号,一个用于发送,一个用于接收。

  对于方式0和方式2,其分频的对象是输入时钟,实现这种分频器的主要vhdl代码的如下:(信号s_count_enable的频率为输入时钟频率的1/12,其高电平维持时间与一个输入时钟的周期相等。)

  s_count_enable<=`1`when s_pre_count=conv_unsigned(11,4) else `0`;

  p_divide_clk: process (clk, reset)

  begin

  if reset = `1` then

  s_pre_count <= conv_unsigned(0,4);

  else

  if clk`event and clk=`1` then

  if s_pre_count = conv_unsigned(11,4) then

  s_pre_count <= conv_unsigned(0,4);

  else

  s_pre_count <= s_pre_count + conv_unsigned(1,1);

  end if;

  end if;

  end if;

  end pro

  本文介绍了利用eda技术设计出一种功能和通信协议与mcs-51系列单片机的串行口相兼容,性能有大幅提高的串行口控制器的ip核,并经过验证获得了满意的效果。

  1 引言

  随着集成电路的深亚微米制造技术和eda技术的迅猛发展,芯片的密度和复杂度不断提高,复用以前的设计模块用于asic芯片和在一块芯片上实现嵌入式系统的功能形成所谓的片上可编程系统( system on programmable chip,sopc) 已成为一种发展的新趋势。ip core(知识产权核) 设计的重用性以及sopc 技术的出现,以其设计的灵活性大大缩短了产品的设计周期,减少了设计成本,降低了设计风险, 加快了产品的上市速度。本文中介绍的串行口控制器是一种功能和通信协议与mcs-51系列单片机的串行口相兼容,性能有大幅提高的数据通信部件,其往往于低速低成本的微机与下位机的通讯中,并允许在串行链路上进行全双工的通信。通过ip核重用技术,可广泛应用在各种soc、嵌入式微处理芯片的设计以及工业应用中。

  2 系统简介

  本课题采用altera公司的max+plusⅱ10.0设计平台,以超高速集成电路硬件描述语言vhdl为系统逻辑描述的唯一表达方式,采用自顶向下的设计原则,对mcs-51单片机的串行接口进行反相设计。同时选用altera公司的acex系列器件来实现最终的ip核。由于篇幅的关系,笔者不打算对开发平台、开发工具以及最终实现硬件电路的fpga芯片进行介绍,而是着重介绍整体的设计思想。根据对mcs-51单片机的串行接口块功能的剖析[1]和模块化的设计思想,在设计时进行模块划分,可划分为4个子模块,它们分别是:

  (1)串口时钟发生器模块;

  (2)数据检测器模块;

  (3)发送器模块;

  (4)接收器模块。由于同步电路较容易使用寄存器的异步复位/置位端,可以使整个电路有一个确定的初始状态;使用同步电路易于消除电路的毛刺,使设计更可靠;同步电路可以很好地利用先进的设计工具,如静态时序分析工具等,为设计者提供最大便利条件,便于电路错误分析,加快设计进度。所以我们采用严格的同步设计电路来设计串行口ip核,即本设计中只有一个clk上升沿,从而保证了每一个触发器同步动作,消除了时钟不同步带来的误动作。

  3 系统现实

  设计一个软核,首先要确定本核与外部的信息交换通路,即本模块与外部电路的接口,友好的接口模型可以大大提高ip核的使用范围。图1是串行口ip核的接口模型图,图中左边的引脚是输入引脚,右边是输出引脚,图中引脚的宽度均有标明(未写出宽度表明宽度为“1”)。由于本设计不支持i/o口的复用,所以为串行口工作于模式0下增加了rxd_o和rxdwr两个输出引脚,前者用于输出,后者为输出有效控制位(rxdwr为高电平时,指示输出)。串行口控制寄存器scon在设计中也被分成两部分,一部分接收来自控制器的输入(一共6位,sm0、sm1、sm2、ren、tb8和ri),一部分作为输出送往控制器(一共3位,rb8以及分别指示发送和接收完毕的两位,控制器会根据这两位来对中断标志置位)。至于发送中断标志位ti,由于其不会影响串行口的工作过程所以在此并未列出,它将在控制器中得到体现。

图1 串行口输入输出引脚图

  串行口有四种工作方式,方式0的波特率固定的(为1/12倍的输入时钟频率);方式1和方式3的波特率是定时器/计数器1的溢出率的1/16或1/32倍;而方式2的波特率则是输入时钟频率的1/32或1/64倍。由此可见,首先必须要解决的问题就是设计分频器。由于在方式0下,串行口是作半双工的同步移位寄存器使用,其发送和接收的波特率是一样的,因此对于方式0,串行口内部的分频信号只需要一路即可。但是对于其他方式,串行口均是工作在全双工的状态下,因此,每种方式下均需要两路分频信号,一个用于发送,一个用于接收。

  对于方式0和方式2,其分频的对象是输入时钟,实现这种分频器的主要vhdl代码的如下:(信号s_count_enable的频率为输入时钟频率的1/12,其高电平维持时间与一个输入时钟的周期相等。)

  s_count_enable<=`1`when s_pre_count=conv_unsigned(11,4) else `0`;

  p_divide_clk: process (clk, reset)

  begin

  if reset = `1` then

  s_pre_count <= conv_unsigned(0,4);

  else

  if clk`event and clk=`1` then

  if s_pre_count = conv_unsigned(11,4) then

  s_pre_count <= conv_unsigned(0,4);

  else

  s_pre_count <= s_pre_count + conv_unsigned(1,1);

  end if;

  end if;

  end if;

  end pro

相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!