1 概述
pstn短消息终端soc是为固定电话网短消息业务而设计的一种数字终端处理芯片。片上集成了微控制器、ram、fsk/dtmf调制解调器、 lcd接口、键盘扫描、数据存储器扩展页面寻址接口以及线路状态控制接口;可以完成fsk和dtmf格式的短消息上传、下传,cid(calling identity delivery,主叫识别信息传送)号码的接收,振铃信号检测,话机状态控制等功能[1],提供了pstn短消息终端的单芯片解决方案。其中,使用了 dw8051_core ip核作为soc的微控制器核心。
soc(system on chip,片上系统)不仅指它的硬件平台,还包括运行在其上的软件成分。如果系统采用全硬件设计的方案,优点是速度快、效率高,但是研制周期长,从而成本也高;用软件实现则更为灵活,研制周期短。缺点是速度慢,效率比较低。因此,soc设计必须在硬件与软件功能划分上有一个合理的权衡,并进行协同设计 [2]。
2 soc系统任务的软硬件功能划分
系统任务按功能可以分为通信、人机交互、flash存储器管理和外设管理四部分。通信的物理层功能即dtmf/fsk信号的调制解调,涉及插值、加权、相关等dsp运算。考虑到通信的实时性要求和所使用8位微控制器的数据处理能力,这些运算由专门设计的modem硬件逻辑实现;而在数据链路层,比如建立和释放与服务器的连接、超时控制、接收fsk数据帧、拆包、差错控制、提取返回消息层的信息和相应标志位的建立等,都交给微处理器由软件实现。人机交互中的键盘扫描要不断判断是否有按键动作发生,用软件实现效率低,这里也用专门的硬件逻辑实现。其他人机交互功能,如菜单操作、短信编辑等,则都由软件实现。flash存储器管理和外设管理在硬件提供了接口寄存器的情况下,由软件实现。
把实时性强、运算量大和重复性强的功能交给硬件去实现,然后在满足系统性能要求的情况下,把尽可能多的任务留给片上的微控制器用软件实现。这样降低了soc的硬件复杂度以及制造成本,同时系统也可以获得最大的灵活性。
3 soc的软硬件协同设计
3.1 对微控制器核的配置和扩展
dw8051_core是synopsys公司提供的一个与8051指令兼容的8位微控制器ip核。它采用4个时钟周期为1个指令周期的模式,在时钟周期相同的情况下,处理能力是标准8051的3倍。dw8051_core访问程序存储器和数据存储器的mem地址总线是16位总线,避免了传统 8051结构中数据总线和地址总线低位的时分复用问题。
由于dw8051_core是一个ip软核(soft core),所以可以对它进行配置和扩展。在综合(synthesis)的时候,通过对参数文件的设置,可以选择配置内部ram是128字节还是256字节;可以选择是否使用定时/计数器2,使用1个串口还是2个串口等。用户还可以按照dw8051_core手册的要求使用硬件描述语言编写硬件逻辑,扩展 sfr总线和中断系统(最多可以扩展到13级中断)[3]。
在soc设计中,只使用到了微控制器核的1个硬件定时器(timer0),1个外部中断(interrupt0),1个串行口(uart),并没有使用dw8051_core的全部功能。那些冗余的功能只会增加系统的硬件负担,所以按照最精简的原则配置dw8051_core:使用内部128字节ram,不使用定时/计数器2,不使用内部rom,只使用1个串口,不扩展中断。在dw8051_parameter.vhd文件中,作如下的参数设定 [3]可以完成上述配置:
package dw8051_parameter is
constant ram_256 : integer := 0;
constant timer2 : integer := 0;
constant rom_addr_size : integer := 0;
constant serial : integer := 0;
constant extd_intr : integer := 0;
end dw8051_parameter;
soc中的fsk/dtmf调制解调器、lcd接口、键盘扫描、数据存储器扩展页面寻址接口以及线路状态控制接口等,都作为片内外设连接在 dw8051_core所特有的sfr内部总线上。8 kb的片上ram和片外512 kb的flash存储器am29lv040都连接在dw8051_core的mem总线上,如图1所示。
图1 经过扩展的dw8051_core sfr总线以及soc系统结构
3.2 外设在sfr总线上的地址映射
dw8051_core通过sfr地址总线sfr_addr[0:7],sfr读信号sfr_rd,sfr写信号sfr_wr,sfr数据输出总线sfr_data_out[0:7],数据输入总线sfr_data_in[0:7]来访问映射到sfr总线上的片上外设。每一个外设都通过sfr地址映射成sfr总线上的一个寄存器,如图2所示。
对这些扩展sfr寄存器的访问和对普通寄存器的访问在形式上并没有区别。当应用程序使用keil的c51编译器时,修改reg51.h文件可以让编译器确认用户所扩展的sfr寄存器。对扩展sfr外设地址的分配可以根据设计需要而不同,但是只能使用dw8051_core没有保留和占用的地址,否则会发生冲突。在reg51.h文件中添加以下语句让编译器确认扩展的寄存器:
sfr send_modem_data = 0xf1;/* 扩展,发送modem数据,只写 */
sfr read_fsk_decode = 0xf1;/* 扩展,读fsk解调数据,只读 */
sfr read_dtmf_decode = 0xf2;/* 扩展,读dtmf解调数据,只读 */
sfr modem_status = 0xf3;/* 扩展,modem状态,只读 */
sfr modem_ctrl = 0xf2;/* 扩展,modem控制,只写 */
sfr keypad_value = 0xf4;/* 扩展,读键盘值,只读 */
sfr flash_page = 0xf5; /* 扩展,页面寻址,只写 */
sfr lcd_data = 0xf6; /* 扩展,lcd数据,读写 */
sfr lcd_ctrl = 0xf7; /* 扩展,lcd控制,只写 */
sfr circuit_status = 0xff; /* 扩展,线路状态,只读 */
sfr circuit_ctrl = 0xff; /* 扩展,线路控制,只写 */
为了节约sfr总线地址资源,一些扩展的sfr寄存器在硬件上设计为只能写、不可读,另外一些被设计为只能读、不可写。这样,二者可以复用同一个sfr总线地址,比如modem_ctrl和read_dtmf_decode寄存器;但是这样在需要先将那些“只写”寄存器的内容读出,运算后再进行写回操作的时候就很不方便。这里采用了镜像变量的方法,为每一个“只写”寄存器建立一个全局变量,每次写寄存器操作后,都对这个全局变量进行同样的写操作,时刻保持变量值和寄存器的内容一致,在需要读出的时候就使用此全局变量。modem_ctrl寄存器的bit0控制modem是dtmf还是fsk模式。下面以对这一位的操作为例说明。
建立它的镜像全局变量:
unsigned char xdata modem_ctrl_mirror;
定义控制位:
#define modem_b0_mode0x01// 1-dtmf, 0-fsk
图2 片上外设在sfr总线上的物理连接
设置modem为fsk模式:
void modem_setmode_fsk() {
modem_ctrl = modem_ctrl_mirror & (~modem_b0_mode);
modem_ctrl_mirror = modem_ctrl_mirror & (~modem_b0_mode);
}
在初始化程序中对这些“只写”寄存器及其镜像全局变量进行赋值。
void devicesinit() {
modem_ctrl = modem_ctrl_ini;
modem_ctrl_mirror = modem_ctrl_ini;
}
3.3 存储空间的划分和映射
在物理上,把8kb的片内ram分为两部分,0000h~1bffh(共7 kb)映射到数据空间,1c00h~1fffh(共1 kb)映射到程序空间,并覆盖flash中程序空间的1c00h~1fffh区域;把512 kb的flash存储器也分成两部分,00000h~0ffffh(共64 kb)映射到程序空间,剩下的10000h~7ffffh(共448 kb)都映射到数据空间。
对微控制器核来说,可以寻址64 kb的程序空间和64 kb的数据存储空间。对整个soc而言,因为flash中的程序空间有1 kb被ram程序空间覆盖掉,所以逻辑上它的程序空间依然是64 kb,但数据空间变为7 kb+448 kb,共455 kb。微控制器核通过扩展的sfr寄存器flash_page按32 kb×16页的页面方式访问flash存储器,其中包括程序空间和数据空间,如图3所示。
图3 程序空间和数据空间的划分和映射
在对flash存储器件进行写操作后的某一段时间内(从几十μs~几百μs),对它进行读操作是不能读出一个确切值的,这是flash存储器件的一个特性。本设计中程序和数据存放在同一个am29lv040 flash存储器中。在对flash存储器进行写操作时,要不断地从其中读出进行写操作的程序指令,然后对它本身进行写操作。微控制器核在20 mhz的时钟频率下,指令周期大约是200 ns,即每隔200 ns左右,soc就要从flash存储器中读取一条指令。这显然和上述的flash存储器特性发生了冲突。
通过对编译环境的设定,可以把进行写flash操作的函数unsigned char writedata_flash (unsigned char * dest, unsigned char *scr, unsigned int len) 和flash扇区擦除函数unsigned char erasesector_flash (unsigned char sector_index)定位到程序空间的1c00h~1fffh,并备份到数据空间的0ec00h~0efffh。在应用程序的设备初始化函数 void devicesinit()中,调用加载函数void loadflashoptoram(),把对flash进行写或者擦除操作的这1kb的程序代码从flash加载到ram的程序空间。以后凡是涉及到对 flash的写或者擦除操作,都由硬件逻辑切换总线到ram去执行这一段程序代码。这样,以不大的ram开销,解决了不能同时对flash进行读和写操作的矛盾。函数void loadflashoptoram()的代码如下:
#define prog_ram_data0xec00
#define prog_ram_data_page9
static unsigned char xdata ram_prog\[1024\] _at_ 0x1c00;
void loadflashoptoram(){
unsigned char xdata * p;
flash_page = prog_ram_data_page;
p = (unsigned char xdata *)prog_ram_data;
memcpy(ram_prog,p,1024);
}
4 总结
本文详细讲述了在基于微控制器ip核pstn短消息终端soc设计中软硬件协同设计的方法。在合理划分硬件和软件任务的基础上,使设计更好地达到了系统性能的要求。
2018年,新造车公司将迎来产品的集体阅兵
苹果7预售启动售价5288元被猪队友曝光
实用有效!让你做好全息投影显示的几项参考设计
NEC电子推出集成了LVDS接口的超解像系统LSI
以调试Rust的方式来学习Rust
PSTN短消息终端SoC系统的软硬件设计
以TSN与5G融合技术塑造工业物联网的未来
Model Y/Mach E/Han/ID.4充电插座线束差异
照明方案公司如何才能搭上物联网的快车?
以人民的名义,开始“劣币驱逐良币”
利用测试打造值得信赖的品牌
简述光纤衰减器的技术和应用
预测:苹果明年全年iPhone出货量为2.2亿台
日月光推出整合设计生态系统IDE
基于CCD的全自动焦度计光学图像系统设计
传统的超声波传感器采用高输出功率的块体压电陶瓷材料
紧扣6大亮点,学习亿级大卖从0到100万的操作!
存储数据恢复-硬盘故障离线导致存储崩溃的数据恢复案例
工业控制系统安全控制应用指南,为其信息安全工作提供指导
小米10Pro拿下DxOmark音频测试总分第一 成功超越华为Mate 20 X