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、
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