lanlingshan

 

关于HPI时序的总结

 

1、利用状态机的思想,将复杂的问题状态分清楚,(非诚勿扰有一个女博士曾谈到她IQ高,她喜欢对事物进行分类,分类的思想很重要)

2、参考资料利用

  (1)芯片用的是美国TI公司的TMS320C6713B,在看了官网提供的PDF后,有几个问题没看懂,没太注意

    a、‡ P = 1/CPU clock frequency in ns. For example, when running parts at 225 MHz, use P = 4.4 ns.

 

    

 后来才发现这个问题是导致几天来没有发现的关键致命问题。下面一段话来之互联网:

      “C6713 HPI在读写过程中,选通信号有效周期(低电平)最小时间要求4个CPU周期,失效周期(高电平)最小时间也要4个CPU周期。在HPI启动模式时,PLL将启动于bypass mode,CPU将操作与CLKIN频率。以20MHz CLKIN为例,HPI选通时间应该大于200ns,在你的屏幕截图中,你使用25ns选通宽度,这需要CLKIN有160MHz或者更高。这能满足条件吗?6713数据手册定义了HPI时序:HSTRB应该保持低有效至少4个DSP时钟周期,即40MHz时等于100ns。两次HPI存取的延迟时间idle time也是4个DSP时钟周期,即HSTRB失效周期至少也是100ns。这个延迟时间在所有HPI传送中间都是必需的,在第一个半字和第二个半字之间是均等的。对DSP的目标存储器和源存储器的存取不影响这个基本的HPI时序。HPI选通不是一个时钟源,它是异步输入的。DSP内部将把HPI信号与它的时钟同步起来。这是最少4个周期限制的原因所在。如果你违反这个时序,DSP可能不会正确完成HPI存取。如果你的主机是FPGA,基本的HPI时序用状态机来表示会更容易达到恰当的时钟要求。”

    b、在看了TMS320C6713B的官网资料和时序图后,又查阅了《TMS320C674x/OMAP-L1x Processor Host Port Interface (HPI) User's Guide》,其实TMS320C6713B和TMS320C674X的HCNTL的控制还有点儿区别

 

 

(2)芯片型号确认好,参考资料对应好是一个不能够忽视的问题

3、对于时序图来说,首先要看懂时序,还要注意时序图中标明的时序约束以及一些注释,往往小的忽略会造成比较大的错误,利用状态机比较利于写时序。划分好状态,组合逻辑和时序逻辑,以及中间产生一些控制信号的约束。

4、

HPI基本时序
 1 /* HOST-PORT一个操作周期 */
 2 reg [3:0]HPI_state;
 3 reg [1:0]HCNTL_data;
 4 reg frame_end;
 5 reg HCS;
 6 reg HHWIL;
 7 reg HDS1;
 8 reg [1:0]HCNTL;
 9 reg [15:0]HD;
10 reg HPI_en;
11 reg verify_bit;
12 wire [15:0]HD_data_1st;
13 wire [15:0]HD_data_2nd;
14 reg [1:0]HCNTL_state;
15 always @(posedge HPI_clk or negedge reset)
16 begin
17     if(~reset)
18         begin
19         HCS<=1;
20         HHWIL<=0;
21         HDS1<=1;
22         HPI_state<=0;
23         HD<=16'b0;
24         frame_end<=0;//传一个HPIC
25         //frame_end<=1;//N个HPIC
26         verify_bit<=0;
27         end
28     else if(HPI_en)
29         case (HPI_state)
30         0:begin///////////////第一个半字
31             HCS<=0;
32             HCNTL<=HCNTL_data;
33             HHWIL<=0;
34             HPI_state<=1;
35             frame_end<=0;
36             end
37         1:begin//锁存控制信号
38             HDS1<=0;
39             HPI_state<=2;
40             end
41         2:begin//准备数据
42             if(HCNTL_state!=1)//写HPIC时不用检测HRDY
43                 begin
44                 HD<=HD_data_1st;
45                 HPI_state<=3;
46                 end
47             else if(HCNTL_state==1)//写地址时,当FIFO不为空时,要产生HRDY,为空时不产生HRDY
48                 begin
49                 if(HRDY)
50                     HPI_state<=2;
51                 else 
52                     begin
53                     HD<=HD_data_1st;
54                     HPI_state<=3;
55                     end
56                 end
57             // HD<=HD_data_1st;    
58             // HPI_state<=3;
59             end
60         3:begin//锁存数据
61             HDS1<=1;
62             HPI_state<=4;
63             end
64         4:begin
65             HCS<=1;    
66             HPI_state<=5;                    
67             end
68         5:begin
69             HD<=16'b0;
70             HPI_state<=6;
71             end
72         6:begin/////////////第二个半字
73             HCS<=0;
74             HHWIL<=1;
75             HPI_state<=7;            
76             end
77         7:begin//锁存控制信号
78             HDS1<=0;
79             HPI_state<=8;            
80             end
81         8:begin//准备数据
82             HD<=HD_data_2nd;
83             HPI_state<=9;
84             end
85         9:begin//锁存数据
86             HDS1<=1;
87             HPI_state<=10;
88             end
89         10:begin
90             HCS<=1;
91             HD<=16'b0;
92             HPI_state<=0;
93             frame_end<=1;
94             verify_bit<=~verify_bit;
95             end
96         endcase
97         
98 end

 

5、系统住状态机

系统主状态
  1 /* 内部信号控制,系统主状态机*/
  2 reg [1:0]work_state;
  3 reg [1:0]HD_data_type;
  4 reg [31:0]HD_data;
  5 reg [4:0]frame_cnt;
  6 reg [3:0]HPID_cnt;
  7 reg [7:0]HPIC_cnt;
  8 reg HPIA_identifyer;
  9 reg HPID_identifyer;
 10 reg HPIC_identifyer;
 11 reg verify_bit2;
 12 
 13 always @(posedge clk or negedge reset)
 14 begin
 15     if(~reset)
 16         begin
 17         work_state<=`idle;
 18         HPI_en<=0;
 19         frame_cnt<=8;
 20         HPIA_identifyer<=0;
 21         HPID_identifyer<=0;
 22         HPIC_identifyer<=0;
 23         HPID_cnt<=0;
 24         HPIC_cnt<=0;
 25         verify_bit2<=0;
 26         end
 27     else
 28         case (work_state)
 29         `idle:
 30                     begin
 31                     if(start)
 32                         begin
 33                         work_state<=`HPIC_send;
 34                         end
 35                     else 
 36                         work_state<=`idle;
 37                     end
 38         `HPIC_send:
 39                     begin
 40                     /* 传一个HPIC */
 41                     if(~frame_end)
 42                         begin
 43                         HPI_en<=1;
 44                         HCNTL_state<=0;
 45                         HD_data_type<=0;
 46                         work_state<=`HPIC_send;
 47                         end
 48                     else if(frame_end)
 49                         begin
 50                         work_state<=`HPIA_send;
 51                         HPI_en<=0;
 52                         verify_bit2<=~verify_bit2;//////HPIC传完verify_bit已经取反了一次,故veriry_bit2取反保证同步
 53                         end
 54                      /* 传N个HPIC */
 55                     // if(frame_end&~HPIC_identifyer)
 56                         // begin
 57                         // HPI_en<=1;
 58                         // HCNTL_state<=0;
 59                         // HD_data_type<=0;
 60                         // HPIC_identifyer<=1;
 61                         // verify_bit2<=~verify_bit2;//为下一帧校验做准备
 62                         // end
 63                     // else if(frame_end&HPIC_identifyer)
 64                         // begin
 65                         // if(verify_bit2^~verify_bit)//一个HD传完
 66                             // begin
 67                             // if(HPIC_cnt==100)
 68                                 // begin
 69                                 // HPI_en<=0;
 70                                 // HPIC_identifyer<=0;//
 71                                 // work_state<=`HPIA_send;
 72                                 // end
 73                             // else
 74                                 // begin
 75                                 // HPI_en<=0;
 76                                 // HPIC_identifyer<=0;
 77                                 // end
 78                             // end
 79                         // end
 80                     // else
 81                         // begin
 82                         // work_state<=`HPIC_send;
 83                         // end
 84                     end
 85         `HPIA_send:
 86                     begin
 87                     if(frame_end&~HPIA_identifyer)
 88                         begin
 89                         if(fre_20hz&&frame_cnt==8)//重新发地址
 90                             begin
 91                             HPIA_identifyer<=1;
 92                             HPI_en<=1;
 93                             HCNTL_state<=1;
 94                             HD_data_type<=1;
 95                             frame_cnt<=0;
 96                             verify_bit2<=~verify_bit2;//////
 97                             end
 98                         else if(fre_20hz&&frame_cnt!=8)//不发地址
 99                             begin
100                             work_state<=`HPID_send;
101                             end
102                         end
103                     else if(frame_end&HPIA_identifyer)
104                         begin
105                         if(verify_bit2^~verify_bit)//进行同或校验,检测一帧是否传完,因为HPI_clk和clk的频率不一样
106                             begin
107                             work_state<=`HPID_send;
108                             HPI_en<=0;
109                             HPIA_identifyer<=0;
110                             end
111                         end
112                     else
113                         begin
114                         work_state<=`HPIA_send;
115                         end
116                     end
117         `HPID_send:
118                     begin
119                     if(frame_end&~HPID_identifyer)
120                         begin
121                         HPI_en<=1;
122                         HCNTL_state<=2;
123                         HD_data_type<=2;
124                         HPID_identifyer<=1;
125                         verify_bit2<=~verify_bit2;//为下一帧校验做准备
126                         end
127                     else if(frame_end&HPID_identifyer)
128                         begin
129                         if(verify_bit2^~verify_bit)//一个HD传完
130                             begin
131                             if(HPID_cnt==5)
132                                 begin
133                                 HPI_en<=0;
134                                 HPID_identifyer<=0;//
135                                 HPID_cnt<=0;
136                                 frame_cnt<=frame_cnt+1;
137                                 work_state<=`HPIA_send;
138                                 end
139                             else
140                                 begin
141                                 HPI_en<=0;
142                                 HPID_identifyer<=0;
143                                 HPID_cnt<=HPID_cnt+1;//////////
144                                 end
145                             end
146                         end
147                     else
148                         begin
149                         work_state<=`HPID_send;
150                         end
151                     end
152         endcase
153                 
154 end

 

posted on 2012-04-10 11:44  lanlingshan  阅读(1092)  评论(0编辑  收藏  举报

导航