谈DSP HPI总线与MPC8272总线接口的FPGA实现-通信工程(2)
2013-08-12 01:03
导读:HHWIL指示当前的为第一个或是第二个半字传输,但需要注意的是,它并不代表是最高有效的(most significant)还是最低有效的(least significant),而决定的依据是
HHWIL指示当前的为第一个或是第二个半字传输,但需要注意的是,它并不代表是最高有效的(most significant)还是最低有效的(least significant),而决定的依据是HPIC中的HWOB位的状态。对于第一个半字,HHWIL必须被驱动为低电平;对于第二个半字,HHWIL必须被驱动为高电平。
(4) HR/W (读/写操作指示)
HR/W为高电平,表示从HPI接口读;HR/W为低电平,表示向HPI接口写。
(5) HRDY (输出准备好)
(6) HCS,HDS1,HDS2(选通信号)
当HCS有效,并且HDS1和HDS2中仅有一个有效时,内部触发信号HSTROBE有效。这三个信号的组合逻辑其实就是片选和读/写信号构成的组合逻辑,因此,可直接与主机的片选和读/写信号相连。如下图所示:
(7) HAS (地址输入选通)
在TMS320C6421 HPI接口中目前没有用,连接到逻辑高电平。
(8) HINT(向主机输出的中断)
三、HPI接口寄存器简介
如上所述,主机通过HPI接口对DSP的访问实际上是通过三个寄存器来实现的,下面就针对这三个专用寄存器进行介绍。
(1)HPI控制寄存器(HPIC)
HPIC中每一位都有特定的功能,在对HPI进行访问的过程中需要特别注意。简要介绍一下这些功能位的作用。
①HWOB(半字顺序位)
如果HWOB=1,第一个半字为最低有效;如果HWOB=0,第一个半字为最高有效。HWOB对地址和数据都起作用,如果采用HPI16模式,在访问数据或者地址寄存器之前,应该首先初始化HWOB位。
②DSPINT(主机产生的Processor-to-CPU中断,用于HPI启动方式中将DSP内核从复位状态中唤醒)
③HINT(DSP-to-Host中断,即通过向此位写入特定值来产生对主机的中断)
(2) HPI地址寄存器(HPIA)
存放32bit数据,指向将要访问的DSP地址空间中的地址。
(转载自http://zw.NSEaC.com科教作文网)
(3) HPI数据寄存器(HPID)
在写操作中存放将要写入HPIA所指向地址的数据,在读操作中为HPIA所指向地址中的数据。
四、HPI接口读写时序
⑴HPI接口读时序
⑵HPI接口写时序
五、HPI接口硬件设计
从C6421 HPI寄存器的编址方式可以看出,主机需两根地址线寻址到HPI接口的控制寄存器、地址寄存器和数据寄存器,因此选择主机的地址线A29、A28连接C6421 HPI的HCNTL1、HCNTL0。选择主机的地址线A30连接到C6421 HPI的HHWIL,作为半字指示选择。HPI的选通由HCS、HDS1、HDS2三根信号线共同作用,最后的HPI使能信号(STROBE)为HDS1异或HDS2后,再与HCS进行与非运算的结果。HCS、HDS1、HDS2信号由FPGA产生。TA为MPC8272传输结束标识,HPI口HRDY有效后FPGA向CPU发送TA,保证HPI数据正确读出。C6416 HPI的HINT信号可以直接连接到主机的IRQ引脚上实现HPI对主机的中断信号连接,也可通过FPGA连接到主机,使控制更灵活。
六、地址空间分配
由于C6421为16位的HPI口,其内部总线为32位,所以每次读写要分两次,一次为高16位,一次为低16位,由HHWIL来选择(0-First Half Word, 1-Second Half Word),设定HPIC.HWOB = 0(First Half Word =高16位, Second Half Word = 低16位)。C6421的HPI接口映射为MPC8272的4对地址空间,由MPC8272 CS3控制,配置CS3为16位宽的GPCM访问模式,如下地址分配:
HPIC:0x0D000000(高16位), 0x0D000002(低16位)。
HPIA: 0x0D000004(高16位), 0x0D000006(低16位)。
HPID_FIX: 0x0D00000C(高16位), 0x0D00000E(低16位),C6421地址由当前的HPIA决定。
HPID_Auto: 0x0D000008(高16位), 0x0D00000A(低16位) C6421地址自动加1。
七、HPI接口相关VHDL代码
output wire c6421_hasn, c6421_hcsn, c6421_hdsn1, c6421_hdsn2,
(转载自http://zw.NSEaC.com科教作文网)
assign c6421_hasn = 1’B1;
assign c6421_hcsn = cs3;
assign c6421_hdsn1 = wen;
assign c6421_hdsn2 = oen;
reg [7:0] st_ta;
reg tax;
wire tax001 = (zzz_cnt==256) ? 0 : 1 ;
wire tax002 = (zzz_cnt==256+8) ? 0 : 1 ;
wire tax003 = (zzz_cnt==256+16)? 0 : 1 ;
wire tax004 = (zzz_cnt==256+32)? 0 : 1 ;
reg c6421hcsn_start;
always @(posedge clk_cpu)