2.2 分页地址发生器
分页地址发生器不但要产生双端口RAM的读写地址,而且还要为缓存器分页;页写满时,还要提供DMA传输申请信号。为了增强灵活性,读写地址发生器由VHDL语言编程集中在一个模块实现,部分程序如下:
signal wtmp:integer range 0 to 1023;
signal rtmp:integer range 0 to 1023;
signal page:intefer range 0 to 1;
if(wclk‘event and wclk=‘1‘)then
if(wtmp>1023)then wtmp<=0;
else wtmp<=wtmp+1; --wtpm为写地址值
end if;
if(0=<wtmp<512)then page<=0; --page为存储器分页标志
else page<=1; --"0"代表第0页
end if; --"1"代表第一页
if(twmp=512 and wtmp=1023)then page_full<=‘1‘;
else page_full<=‘0‘; --page-full为页写满标志,同时为DMA传送申请信号
end if;
end if;
if(page=0)then rtmp<=0; --不同的页置不同的数据读地址初始值
else if(page=1)then rtmp<=512;
end if;
if(rclk‘event and rclk=‘1‘)then
if(en=‘1‘ and rtmp<1024)then rtmp<=rtmp+1;
end if; --rtmp为读地址值
end if;
代码经过编译生成的原理框图如图3的ADD_CRE-ATE模块。在图形输入编辑环境下,可以把它作为一个标准的原理图与其他模块连接;写地址时钟WCK由AD774B的STS端产生,每一组数据转换结束后,地址发生器加1,读地址时钟RCK由DMA应答信号DACK提供;PAGE_FULL在0页或1页满时变为高电平,经D触发器申请DMA传输,把刚满页的数据送给计算机内存。
2.3 时序逻辑电路的设计
在数据采集电路中,时序逻辑电路主要解决地址译码、时序逻辑控制、数据锁存等功能。用普通的中小规模集成电路实现,电路组成庞大;而用VHDL语言实现则简单灵活、易于更新升级。图3中的微机译码电路、数据缓冲器、D触发器等都可以在MAXPLUS II的图形编辑环境下,从库中直接调出。计算机在每次DMA传送中都向外设输出一个应答信号DACK和读允许信号IOR,利用这个特点,正好把它们作为读缓存的地址时钟,即每DMA传送一次,读地址为1;AD774B每转换完一组数据,在STS端输出由低电平转换为高电平,刚好给写缓存提供写地址时钟,同时经过适当延时,STS又可以送到R/C端作为A/D下一次转换的启动信号。