下面就是小编给大家带来的基于 EPM7128 设计的数据合并转换器(共含5篇),希望大家喜欢,可以帮助到有需要的朋友!同时,但愿您也能像本文投稿人“知我”一样,积极向本站投稿分享好文章。
摘要:介绍了基于CPLD芯片EPM7128设计的数据合并转换器。其中,控制串行口数据合并时间的计数器电路和并行数据转换成串行数据的移位电路都是在CPLD中完成的,数据块合并由相应的软件实现,最终形成CPM流输出。
关键词:CPLD 数据合并转换器 串行口 PCM流
数据交换机的传送速率很高,当其和串行口通信时,在发送前把数据分为两部分分别发送到串行口,然后经过数据合并转换器把各个串行口的数据合并在一起并转换成PCM流。本文介绍了基于CPLD芯片EPM7128设计的数据合并转换器。
EPM7128是可编程的大规模逻辑器件,为ALTERA公司的MAX7000系列产品,具有高阻抗、电可擦等特点,可用门单元为2500个,管脚间最大延迟为5ns,工作电压为+5V。
IDT7205为FIFO型异步读写的存储器芯片,容量为8192×9比特,存取时间为12ns,有空、半满、满三个标志位,最大功耗为660mW,工作电压为+5V。
MSM4860DX属于PC104嵌入式系统的'5X86系旬,为AMD-133MHz CPU,具有COM1、COM2两个串口,一个LPT并口,一个ELOPPY接口,一个IDE接口,一个VGA/LCD接口,一个AT-KEYBOARD接口,16个中断,额定功率为8W,工作电压为+5V。
(本网网收集整理)
1.2 数据合并转换器电路框图
可编程的数据合并转换器电路框图如图1所示。图中,DB为数据总线,AB为地址总线,R和W分别为读写信号线,INT5、INT7、INT10 INT11为四个中断,CS1、CS2和CS3是在CPLD内部生成的地址译码器Addr-encoder分别送给分频器、两个串行口的片选信号,ORG是晶振送给分频器的振荡脉冲,CLK是分频器输出的脉冲FRAMECLK和PCMCLK,WFIFO、RFIFO是由CPLD生成的包含地址信息的访问FIFO的读写脉冲,DATA_IN1和DATA_IN2为串行口输入数据,PCM_DATA是数据合并转换器输出的PCM流,PCMCLKA为输出的码同步时钟,WORLDCLKA为输出的字同步时钟。
1.3 电路工作分析
晶振把时钟脉冲送给分频器,分频器含有两个可编程的定时器。分频器把可控的FRAMECLK和PCMCLK送给CPLD,在CPLD内部经过逻辑组合形成三路脉冲信号,一路控制计数器形成INT5、INT7两个帧频中断触发脉冲,CPU接到中断后立即写FIFO;另一路控制移位寄存器把并行数据转换成串行数据PCM流;第三路形成RFIFO去连续读FIFO。两个串行口通过中断方式(INT10、INT11)接收到外部数据后,暂存缓冲区内,按一定格式由中断INT5控制写给FIFO。
2 CPLD内部逻辑电路
CPLD内部逻辑电路如图2所示。图中,虚线框内为CPLD内部电路,虚线框外为CPLD的I/O口。
2.1 地址译码器
地址译码器Addr-encoder用VHDL语言生成。Addr-encoder的输出有总线驱动器芯片74245的使能脉冲ENB,总线传输方向的使能脉冲DIR,写FIFO操作脉冲WFIFO,分频器和串行口的片选CS1、CS2和CS3,FIFO数据空满标志脉冲RFIFOFLAG,FIFO复位时钟脉冲WCTRL。
2.2 数据移位部分
FRAMECLK周期是PCMCLK的8位,它们都是分频送来的脉冲。FRAMECLK反相后作为FIFO的读信号,两次反相后作为字同步时钟。PCMCLK直接作为移位寄存器74165的时钟触发脉冲,两者与非后的输出低电平作为74165重数据的触发电平。它们的信号时序如图3所示。
从三者的时序图可知,每当一个字节的最后一位完成移位后,在FRAMECLK脉冲反相的下降沿触发下读取FIFO数据,这时74165的装载使能74165STD恰好为低电平(与非结果),完成部数据装载,然后在PCMCLK脉冲的上升沿作用下开始新一软次的数据移位。
2.3 帧长计数器的部分
两个74161设计长1/64的分频器,也叫帧长计数器,此计数器的时钟为FRAMECLK,计数器的输出最高两位逻辑与为中断INT7,把与门输出与次高位逻辑异或为中断INT5。这样,INT7比INT5在时序上早半个周期
。开始复位后,INT7脉冲首先产生,触发中断,COU中断后在服务程序中把64个字节数据写到FIFO,然后屏蔽中断INT7,半个周期后,FIFO中还剩32个字节数据(因此FIFO的读脉冲和FRAMECLK反相同频)。然后中断INT5到来,CPU响应后,再写64个字节数据给FIFO,使FIFO中一直保持有数据的状态(可避免读FIFO正好落在两个写FIFO之间,FIFO因无数据而读死)。这样,每当中断INT5到来,都写64字节给FIFO,周而复始,所以把64字节定为帧长。
设PCMCLK的频率为f(MHz),则FRAMECLK的频率为f/8,由于帧长为64,所以有:帧频=f/(8×64),PCM流速率=f(bit/s)。分频器的分频比是通过软件设定的,所以PCM流的速率可编程。
3 软件设计
outp(0x303,0x36);//方式3,方波。//
outp(0x300,0x50);//timer0,分频比为80。//
outp(0x300,0x00);
outp(0x303,0x74);//方式2,脉冲。//
outp(0x301,0x08);//timer1,分频比为8。//
outp(0x301,0x00);
数据合并:
if((com1_count%24)= =0) ;//串行口1的24字节数据放在数组Frame的4~27的位置。//
{
com_buf1[com1_count++]=db1; //串行口1接收数据//
int Original_Counter;
Original_Counter=com1_count/24;
memcpy(Frame[Original_Counter-1]+4,&com_buf1[com1_count-24],24);
}
if((com2_count%24)= =0); //串行口2的24字节数据放在数组Frame的28~51的位置。//
{
com_buf2[com2_count++]=db2 ;//串行口2接收数据//
int Original_Counter;
Original_Counter=com2_count/24;
Memcpy(Frame[Original_Counter-1]+28,&com_buf2[com2_count-24],24) ;//合并后的数据放在Frame数组中。//
写FIFO:
void Send_To_Fifo(int number); //Send_To_Fifo函数为中断服务程序的一部分。//
{
for(int i=0;i<64;i++)
outp(WFIFO,Frame[number][i]); //数组送给FIFO,实现数据合并//
笔者所在单位今年实行了全国计算机应用等级考试,根据晋升职务级别的不同,考生可选择2至4个模块应试,每个考生具有唯一的档案号,同一次考试合格1个及以上模块者,取得1个合格证书,合格证标注了考生合格的模块。
假如考生刘XX合格1科,有1科的合格证,考生王XX合格了3科,也同样取得了一个合格证书,合格证显示了合格的3个模块(图1),
为方便查询及便于考生领证签名,需要将图1中相同档案号考生的合格模块进行合并,模块之间用“/”分隔(图2),那么如何实现上述效果呢? 由于相同的档案号有2个、3个和4个三种情况,因此,要合并的模块数不是固定的,要解决此类问题需要用数组公式。
图1 Excel表格中相同档案号的三个模块
图2 合并Excle相同的档案
在WPS表格中,我们经常会用到合并单元格,在很多情况下,使用合并单元格会使表格更加醒目、条理。但你遇到过提取合并单元格的数据的问题吗?如图1所示,左侧为某位老师辛辛苦苦建立的学生成绩汇总表,郁闷的是现在需要根据这张表还原学生在两次考试中的成绩(图1右侧)。
图1
一、提取合并单元格中的姓名
观察原始表发现,每一姓名均为6个单元格合并而成。由于合并单元格只保留最上方的单元格数据。所以在目标表格“姓名”列应依次引用B3、B9、B15、……单元格数据。看这行数,这不就是高中时学过的那个等差数列嘛。
由此就容易得到规律:J列单元格的当前行数乘6再减去21即B列姓名相应单元格行数。
即J4=B(6*4-21),J5=B(6*5-21)。
在WPS表格公式可是选择使用“INDIRECT”函数。它可以返回指定单元格的数据再配合“ROW”函数获取当前行数。
在J4单元格中输入公式“=INDIRECT(“B”&(6*ROW()-21))”,向下拖动填充句柄至最后行(图2)。
图2
二、提取合并单元格中的对应数据
各位同学的语文成绩位于D3、D9、D15、……单元格,与姓名位于同一行,所以,只需要把上面的公式稍加改造即可,
在K4单元格输入公式
=INDIRECT(“D”&(6*ROW()-21))
再拖动句柄复制公式。
然后在Q4单元格输入公式
=INDIRECT(“F”&(6*ROW()-21))
再向下复制公式即可。比较公式即可知道,只是“D”与“F”的区别(图3)。
图3
语文成绩提取出来了,那其它几科也就容易了。以期中考试成绩为例。数学成绩比语文成绩下移了一行,所以:
L4单元格公式应为“=INDIRECT(“D”&(6*ROW()-20))“
英语科:M4单元格公式应为“=INDIRECT(“D”&(6*ROW()-19))”
物理科:M4单元格公式应为“=INDIRECT(“D”&(6*ROW()-18))”
化学科:M4单元格公式应为“=INDIRECT(“D”&(6*ROW()-17))”
N4单元格公式则为“=INDIRECT(“D”&(6*ROW()-16))”。
然后向下填充公式后效果(图4)。
图4
至于期末成绩,只需要将相应科目公式中的“D”改为“F”就行了。至此,任务完成。
笔者所在单位今年实行了全国计算机应用等级考试,根据晋升职务级别的不同,考生可选择2至4个模块应试,每个考生具有唯一的档案号,同一次考试合格1个及以上模块者,取得1个合格证书,合格证标注了考生合格的模块。
假如考生刘XX合格1科,有1科的合格证,考生王XX合格了3科,也同样取得了一个合格证书,合格证显示了合格的3个模块(图1)。为方便查询及便于考生领证签名,需要将图1中相同档案号考生的合格模块进行合并,模块之间用“/”分隔(图2),那么如何实现上述效果呢? 由于相同的档案号有2个、3个和4个三种情况,因此,要合并的模块数不是固定的,要解决此类问题需要用数组公式。
图1 Excel表格中相同档案号的三个模块
图2 合并Excle相同的档案
具体方法如下:
一、定义名称
为简化公式,需要对引用单元格区域设置名称。
执行“插入→名称→定义”命令,打开“定义名称”对话框,将名称定义为“Date”, 在“引用位置”文本框中输入公式:= Sheet1!$C:$C,按下“确定”按钮返回。接着用同样方法,再定义另一个名叫“Code”的名称,里面包括公式:= Sheet1!$A$2: $A$1200,即A列所在的数据区域。
二、输入公式
首先在E2单元各种输入公式:
“=IF(ISERR(INDEX(Data,SMALL(IF(Code=$A2,ROW(code)),1))),“”,INDEX($C:$C,SMALL(IF(code=$A2,ROW(code)),1))&“/”) ”。该公式首先对A列进行判断,如果A2单元格内容存在于Code区域,则返回该单元格行号,如果存在重复,则取最小的行号,
再用函数INDEX()选取该行对应的Data区域单元格内容,并用“/”分隔。为避免出现错误值,这里还使用了信息函数ISERR(),如果出现错误值,则为空白,否则为公式显示的内容。公式输入完成后,按“Ctrl+Shift+Enter”组合键即可。因为相同档案号最多为4个,因此,还需取第2、第3、第4小的行号。所以还需在F2、G2、H2单元格中依次输入数组公式:
F2单元格:=IF(ISERR(INDEX($C:$C,SMALL(IF($A$2:$A$21=$A2,ROW($A$2:$A$21)),2))),“”,INDEX($C:$C,SMALL(IF($A$2:$A$21=$A2,ROW($A$2:$A$21)),2))&“/”) G2单元格: =IF(ISERR(INDEX($C:$C,SMALL(IF($A$2:$A$21=$A2,ROW($A$2:$A$21)),3))),“”,INDEX($C:$C,SMALL(IF($A$2:$A$21=$A2,ROW($A$2:$A$21)),3))&“/”)
H2单元格: =IF(ISERR(INDEX($C:$C,SMALL(IF($A$2:$A$21=$A2,ROW($A$2:$A$21)),4))),“”,INDEX($C:$C,SMALL(IF($A$2:$A$21=$A2,ROW($A$2:$A$21)),4)))
以上公式输入完成后都要按“Ctrl+Shift+Enter”组合键结束公式输入。然后在D2单元格输入公式:“=E2&F2&G2&H2”。将E2、F2、G2、H2单元格内容连接起来。此时可以看到合格1至3个模块的考生,单元格内容合并后,结尾多了符号“/”,还须将此多余的符号删除。据此,在I2单元格输入公式:=IF(RIGHT(D2,1)=“/”,MID(D2,1,LEN(D2)-1),D2) 。
所有公式输入完成后,选择D2:I2单元格区域采用拖动复制的办法,将公式复制到相应区域。这样就完成了相应数据的合并。最后还需要删除公式,具体方法是:复制所有含公式的区域,执行“编辑→选择性粘贴”命令,在“选择性粘贴”对话框中,选择“数值”选项即可。
完成上述操作后还没达到图2的效果,还需使用公式将重复的数据行删除。因此,在J2单元格输入公式:=IF(A2A3,A2,“”) 。并复制到相应数据区域,再使用排序或筛选的办法将J列空白区域删除,对数据区域作适当处理就完成了图2所示的效果。
★ 语言转换器作文
★ 数据收集教学设计
★ 合并协议书
★ 公司合并合同范本
★ 合并同类项教案
★ 党支部合并请示
★ 公司合并协议书