uPP通信(2)---FPGA篇 2013-01-13 09:59:32

分类: 嵌入式

系统架构

本系统组成如下图,FPGA挨个读取24个AD通道中的数据,然后通过UPP方式传送给OMAPL138中的DSP核,经过一系列运算,DSP核通过DSPLINK方式将数据送到ARM核。

FPGA数据读取、存储、传送、数据识别问题

因为OMAPL138需要识别传送上来的数据是对应哪个通道的。所以FPGA对数据必须做一些处理以便于OMAPL138对数据分门别类。

方法一:

在FPGA中生成一个FIFO,挨个读取24个AD通道中的数据按次序存放到FIFO中,FIFO中存放满预定大小的数据量时再上传给OMAPL138,这样OMAPL138就知道第一个数据是对应通道1的,第二个数据是对应通道2的。

优点:简单,容易实现

缺点:如果其中一个数据出错或者漏传,那后面的一大堆数据都会被错误归类。

方法二:

AD通道输出数据是16位,将其扩展为32位,高16位作为标志位。例如,如果第一个AD通道读出来的0xDE33,那扩展为32位时其数据为0x0001DE33。OMAPL138通过其高16位辨别这个数据是哪个通道的。

优点:不再像方法一担心数据传错了,传错也不会危害到整体。

缺点:OMAPL138的UPP通信时16位的数据线,原来是需要传送数据,现在还要传送标志数据,这样直接导致传输效率打5折。但是对于能够到达150MB/s吞吐量的UPP来说,就算传输只能达到50%,也是能满足我目前这个系统的。

读取AD:

以下是读取ad的代码,状态机的状态比较多,比较麻烦。

点击(此处)折叠或打开

  1. module ads_ddio (
  2. clk,
  3. rst,
  4. eoc,
  5. datain,
  6. dataout,
  7. f_ncs,
  8. f_nrd,
  9. fifo_wr,
  10. f_c1,
  11. f_c2,
  12. f_c3,
  13. f_c4,
  14. f_c5,
  15. f_c6
  16. );
  17. input             clk,rst;
  18. input[1:0]        eoc;
  19. input[15:0]     datain;
  20. output             f_c1, f_c2, f_c3, f_c4, f_c5, f_c6;
  21. output[1:0]      f_ncs;
  22. output[1:0]             f_nrd;
  23. output fifo_wr;
  24. output[31:0]     dataout;
  25. reg[7:0] counter;
  26. reg[31:0] data_reg;
  27. reg state;
  28. reg[1:0] eoc1;
  29. reg[5:0] cstate,nstate;
  30. reg[1:0] f_nrd_reg,f_ncs_reg;
  31. reg fifo_wr_reg;
  32. parameter     SET_COUNT          = 8'hff,
  33. SET_CSRD_C1UA = 8'd23,
  34. SET_DATA_C1UA = 8'd24,
  35. SET_CSRD_C1UB = 8'd26,
  36. SET_DATA_C1UB = 8'd27,
  37. SET_CSRD_C1UC = 8'd29,
  38. SET_DATA_C1UC = 8'd30,
  39. SET_CSRD_C1IA = 8'd32,
  40. SET_DATA_C1IA = 8'd33,
  41. SET_CSRD_C1IB = 8'd35,
  42. SET_DATA_C1IB = 8'd36,
  43. SET_CSRD_C1IC = 8'd38,
  44. SET_DATA_C1IC = 8'd39,
  45. SET_CSRD_C2UA = 8'd41,
  46. SET_DATA_C2UA = 8'd42,
  47. SET_CSRD_C2UB = 8'd44,
  48. SET_DATA_C2UB = 8'd45,
  49. SET_CSRD_C2UC = 8'd47,
  50. SET_DATA_C2UC = 8'd48,
  51. SET_CSRD_C2IA = 8'd50,
  52. SET_DATA_C2IA = 8'd51,
  53. SET_CSRD_C2IB = 8'd53,
  54. SET_DATA_C2IB = 8'd54,
  55. SET_CSRD_C2IC = 8'd56,
  56. SET_DATA_C2IC = 8'd57,
  57. SET_FIFO_DATA = 8'd60, //上个状态+3
  58. SET_IDLE          = 8'd62;
  59. parameter     IDLE                 = 6'd0,
  60. CSRDN_C1UA        = 6'd1,
  61. DATA_C1UA         = 6'd2,
  62. DATA1_C1UA = 6'd3,
  63. CSRDN_C1UB        = 6'd4,
  64. DATA_C1UB         = 6'd5,
  65. DATA1_C1UB = 6'd6,
  66. CSRDN_C1UC        = 6'd7,
  67. DATA_C1UC         = 6'd8,
  68. DATA1_C1UC = 6'd9,
  69. CSRDN_C1IA        = 6'd10,
  70. DATA_C1IA         = 6'd11,
  71. DATA1_C1IA = 6'd12,
  72. CSRDN_C1IB        = 6'd13,
  73. DATA_C1IB         = 6'd14,
  74. DATA1_C1IB = 6'd15,
  75. CSRDN_C1IC        = 6'd16,
  76. DATA_C1IC         = 6'd17,
  77. DATA1_C1IC = 6'd18,
  78. CSRDN_C2UA        = 6'd19,
  79. DATA_C2UA         = 6'd20,
  80. DATA1_C2UA = 6'd21,
  81. CSRDN_C2UB        = 6'd22,
  82. DATA_C2UB         = 6'd23,
  83. DATA1_C2UB = 5'd24,
  84. CSRDN_C2UC        = 6'd25,
  85. DATA_C2UC         = 6'd26,
  86. DATA1_C2UC = 6'd27,
  87. CSRDN_C2IA        = 6'd28,
  88. DATA_C2IA         = 6'd29,
  89. DATA1_C2IA = 6'd30,
  90. CSRDN_C2IB        = 6'd31,
  91. DATA_C2IB         = 6'd32,
  92. DATA1_C2IB = 6'd33,
  93. CSRDN_C2IC        = 6'd34,
  94. DATA_C2IC         = 6'd35,
  95. DATA1_C2IC = 6'd36,
  96. FIFO_DATA = 6'd37;
  97. wire csrd_n_c1ua_req;
  98. wire csrd_n_c1ub_req;
  99. wire csrd_n_c1uc_req;
  100. wire csrd_n_c1ia_req;
  101. wire csrd_n_c1ib_req;
  102. wire csrd_n_c1ic_req;
  103. wire csrd_n_c2ua_req;
  104. wire csrd_n_c2ub_req;
  105. wire csrd_n_c2uc_req;
  106. wire csrd_n_c2ia_req;
  107. wire csrd_n_c2ib_req;
  108. wire csrd_n_c2ic_req;
  109. wire data_c1ua_req;
  110. wire data_c1ub_req;
  111. wire data_c1uc_req;
  112. wire data_c1ia_req;
  113. wire data_c1ib_req;
  114. wire data_c1ic_req;
  115. wire data_c2ua_req;
  116. wire data_c2ub_req;
  117. wire data_c2uc_req;
  118. wire data_c2ia_req;
  119. wire data_c2ib_req;
  120. wire data_c2ic_req;
  121. wire fifo_data_req;
  122. wire idle_req;
  123. assign f_c1 = 1'b1;
  124. assign f_c2 = 1'b0;
  125. assign f_c3 = 1'b1;
  126. assign f_c4 = 1'b0;
  127. assign f_c5 = 1'b0;
  128. assign f_c6 = 1'b0;
  129. assign dataout = data_reg;
  130. assign csrd_n_c1ua_req = (counter == SET_CSRD_C1UA);
  131. assign csrd_n_c1ub_req = (counter == SET_CSRD_C1UB);
  132. assign csrd_n_c1uc_req = (counter == SET_CSRD_C1UC);
  133. assign csrd_n_c1ia_req = (counter == SET_CSRD_C1IA);
  134. assign csrd_n_c1ib_req = (counter == SET_CSRD_C1IB);
  135. assign csrd_n_c1ic_req = (counter == SET_CSRD_C1IC);
  136. assign csrd_n_c2ua_req = (counter == SET_CSRD_C2UA);
  137. assign csrd_n_c2ub_req = (counter == SET_CSRD_C2UB);
  138. assign csrd_n_c2uc_req = (counter == SET_CSRD_C2UC);
  139. assign csrd_n_c2ia_req = (counter == SET_CSRD_C2IA);
  140. assign csrd_n_c2ib_req = (counter == SET_CSRD_C2IB);
  141. assign csrd_n_c2ic_req = (counter == SET_CSRD_C2IC);
  142. assign data_c1ua_req = (counter == SET_DATA_C1UA);
  143. assign data_c1ub_req = (counter == SET_DATA_C1UB);
  144. assign data_c1uc_req = (counter == SET_DATA_C1UC);
  145. assign data_c1ia_req = (counter == SET_DATA_C1IA);
  146. assign data_c1ib_req = (counter == SET_DATA_C1IB);
  147. assign data_c1ic_req = (counter == SET_DATA_C1IC);
  148. assign data_c2ua_req = (counter == SET_DATA_C2UA);
  149. assign data_c2ub_req = (counter == SET_DATA_C2UB);
  150. assign data_c2uc_req = (counter == SET_DATA_C2UC);
  151. assign data_c2ia_req = (counter == SET_DATA_C2IA);
  152. assign data_c2ib_req = (counter == SET_DATA_C2IB);
  153. assign data_c2ic_req = (counter == SET_DATA_C2IC);
  154. assign fifo_data_req = (counter == SET_FIFO_DATA);
  155. assign idle_req = (counter == SET_IDLE);
  156. assign f_nrd[0] = (cstate == DATA_C1UA || cstate == CSRDN_C1UA || cstate == DATA_C1UB || cstate == CSRDN_C1UB || cstate == DATA_C1UC || cstate == CSRDN_C1UC || cstate == DATA_C1IA || cstate == CSRDN_C1IA || cstate == DATA_C1IB || cstate == CSRDN_C1IB || cstate == DATA_C1IC || cstate == CSRDN_C1IC ) ? f_nrd_reg[0] : 1'b1;
  157. assign f_ncs[0] = (cstate == DATA_C1UA || cstate == CSRDN_C1UA || cstate == DATA_C1UB || cstate == CSRDN_C1UB || cstate == DATA_C1UC || cstate == CSRDN_C1UC || cstate == DATA_C1IA || cstate == CSRDN_C1IA || cstate == DATA_C1IB || cstate == CSRDN_C1IB || cstate == DATA_C1IC || cstate == CSRDN_C1IC ) ? f_ncs_reg[0] : 1'b1;
  158. assign f_nrd[1] = (cstate == DATA_C2UA || cstate == CSRDN_C2UA || cstate == DATA_C2UB || cstate == CSRDN_C2UB || cstate == DATA_C2UC || cstate == CSRDN_C2UC || cstate == DATA_C2IA || cstate == CSRDN_C2IA || cstate == DATA_C2IB || cstate == CSRDN_C2IB || cstate == DATA_C2IC || cstate == CSRDN_C2IC ) ? f_nrd_reg[1] : 1'b1;
  159. assign f_ncs[1] = (cstate == DATA_C2UA || cstate == CSRDN_C2UA || cstate == DATA_C2UB || cstate == CSRDN_C2UB || cstate == DATA_C2UC || cstate == CSRDN_C2UC || cstate == DATA_C2IA || cstate == CSRDN_C2IA || cstate == DATA_C2IB || cstate == CSRDN_C2IB || cstate == DATA_C2IC || cstate == CSRDN_C2IC ) ? f_ncs_reg[1] : 1'b1;
  160. assign fifo_wr = ( /* cstate ==DATA_C1UA ||*/ cstate == DATA_C1UB || cstate == DATA_C1UC || cstate == DATA_C1IA || cstate == DATA_C1IB || cstate == DATA_C1IC || cstate == DATA_C2UA || cstate == DATA_C2UB || cstate == DATA_C2UC || cstate == DATA_C2IA || cstate == DATA_C2IB || cstate == DATA_C2IC ||cstate == FIFO_DATA ) ? fifo_wr_reg : 1'b0;
  161. always @ (posedge clk or negedge rst)
  162. if(!rst)
  163. cstate <= IDLE;
  164. else
  165. cstate <= nstate;
  166. always @ (cstate or fifo_data_req or csrd_n_c1ua_req or data_c1ub_req or csrd_n_c1uc_req or data_c1ia_req or data_c1ib_req or data_c1ic_req or csrd_n_c2ua_req or data_c2ub_req or csrd_n_c2uc_req or data_c2ia_req or data_c2ib_req or data_c2ic_req)
  167. case (cstate)
  168. IDLE:
  169. if(csrd_n_c1ua_req)
  170. nstate <= CSRDN_C1UA;
  171. else
  172. nstate <= IDLE;
  173. CSRDN_C1UA:
  174. if(data_c1ua_req)
  175. nstate <= DATA_C1UA;
  176. else
  177. nstate <= CSRDN_C1UA;
  178. DATA_C1UA:
  179. nstate <= DATA1_C1UA;
  180. DATA1_C1UA:
  181. if(csrd_n_c1ub_req)
  182. nstate <= CSRDN_C1UB;
  183. else
  184. nstate <= DATA1_C1UA;
  185. CSRDN_C1UB:
  186. if(data_c1ub_req)
  187. nstate <= DATA_C1UB;
  188. else
  189. nstate <= CSRDN_C1UB;
  190. DATA_C1UB:
  191. nstate <= DATA1_C1UB;
  192. DATA1_C1UB:
  193. if(csrd_n_c1uc_req)
  194. nstate <= CSRDN_C1UC;
  195. else
  196. nstate <= DATA1_C1UB;
  197. CSRDN_C1UC:
  198. if(data_c1uc_req)
  199. nstate <= DATA_C1UC;
  200. else
  201. nstate <= CSRDN_C1UC;
  202. DATA_C1UC:
  203. nstate <= DATA1_C1UC;
  204. DATA1_C1UC:
  205. if(csrd_n_c1ia_req)
  206. nstate <= CSRDN_C1IA;
  207. else
  208. nstate <= DATA1_C1UC;
  209. CSRDN_C1IA:
  210. if(data_c1ia_req)
  211. nstate <= DATA_C1IA;
  212. else
  213. nstate <= CSRDN_C1IA;
  214. DATA_C1IA:
  215. nstate <= DATA1_C1IA;
  216. DATA1_C1IA:
  217. if(csrd_n_c1ib_req)
  218. nstate <= CSRDN_C1IB;
  219. else
  220. nstate <= DATA1_C1IA;
  221. CSRDN_C1IB:
  222. if(data_c1ib_req)
  223. nstate <= DATA_C1IB;
  224. else
  225. nstate <= CSRDN_C1IB;
  226. DATA_C1IB:
  227. nstate <= DATA1_C1IB;
  228. DATA1_C1IB:
  229. if(csrd_n_c1ic_req)
  230. nstate <= CSRDN_C1IC;
  231. else
  232. nstate <= DATA1_C1IB;
  233. CSRDN_C1IC:
  234. if(data_c1ic_req)
  235. nstate <= DATA_C1IC;
  236. else
  237. nstate <= CSRDN_C1IC;
  238. DATA_C1IC:
  239. nstate <= DATA1_C1IC;
  240. DATA1_C1IC:
  241. if(csrd_n_c2ua_req)
  242. nstate <= CSRDN_C2UA;
  243. else
  244. nstate <= DATA1_C1IC;
  245. /////////////////////////////////////////////////////////////////
  246. CSRDN_C2UA:
  247. if(data_c2ua_req)
  248. nstate <= DATA_C2UA;
  249. else
  250. nstate <= CSRDN_C2UA;
  251. DATA_C2UA:
  252. nstate <= DATA1_C2UA;
  253. DATA1_C2UA:
  254. if(csrd_n_c2ub_req)
  255. nstate <= CSRDN_C2UB;
  256. else
  257. nstate <= DATA1_C2UA;
  258. CSRDN_C2UB:
  259. if(data_c2ub_req)
  260. nstate <= DATA_C2UB;
  261. else
  262. nstate <= CSRDN_C2UB;
  263. DATA_C2UB:
  264. nstate <= DATA1_C2UB;
  265. DATA1_C2UB:
  266. if(csrd_n_c2uc_req)
  267. nstate <= CSRDN_C2UC;
  268. else
  269. nstate <= DATA1_C2UB;
  270. CSRDN_C2UC:
  271. if(data_c2uc_req)
  272. nstate <= DATA_C2UC;
  273. else
  274. nstate <= CSRDN_C2UC;
  275. DATA_C2UC:
  276. nstate <= DATA1_C2UC;
  277. DATA1_C2UC:
  278. if(csrd_n_c2ia_req)
  279. nstate <= CSRDN_C2IA;
  280. else
  281. nstate <= DATA1_C2UC;
  282. CSRDN_C2IA:
  283. if(data_c2ia_req)
  284. nstate <= DATA_C2IA;
  285. else
  286. nstate <= CSRDN_C2IA;
  287. DATA_C2IA:
  288. nstate <= DATA1_C2IA;
  289. DATA1_C2IA:
  290. if(csrd_n_c2ib_req)
  291. nstate <= CSRDN_C2IB;
  292. else
  293. nstate <= DATA1_C2IA;
  294. CSRDN_C2IB:
  295. if(data_c2ib_req)
  296. nstate <= DATA_C2IB;
  297. else
  298. nstate <= CSRDN_C2IB;
  299. DATA_C2IB:
  300. nstate <= DATA1_C2IB;
  301. DATA1_C2IB:
  302. if(csrd_n_c2ic_req)
  303. nstate <= CSRDN_C2IC;
  304. else
  305. nstate <= DATA1_C2IB;
  306. CSRDN_C2IC:
  307. if(data_c2ic_req)
  308. nstate <= DATA_C2IC;
  309. else
  310. nstate <= CSRDN_C2IC;
  311. DATA_C2IC:
  312. nstate <= DATA1_C2IC;
  313. DATA1_C2IC:
  314. if(fifo_data_req)
  315. nstate <= FIFO_DATA;
  316. else
  317. nstate <= DATA1_C2IC;
  318. FIFO_DATA:
  319. if(idle_req)
  320. nstate <= IDLE;
  321. else
  322. nstate <= IDLE;
  323. /*
  324. DATA1_C1UB:
  325. if(idle_req)
  326. nstate <= IDLE;
  327. else
  328. nstate <= DATA1_C1UB;
  329. */
  330. default:
  331. nstate <= IDLE;
  332. endcase
  333. always @ (posedge clk)
  334. begin
  335. case (cstate)
  336. FIFO_DATA:
  337. fifo_wr_reg <= 1'b1; //把最后一个数据输出到fifo中详细请看signaltap2
  338. DATA_C1UA:
  339. begin
  340. data_reg <= {16'h11,datain};
  341. f_nrd_reg[0] <= 1'b0;
  342. f_ncs_reg[0] <= 1'b0;
  343. //                fifo_wr_reg <= 1'b1; //第一个数据刚好读到寄存器,还没放到fifo的总线上,所以第一个DATA状态不要拉高,详细请看signaltap2
  344. end
  345. CSRDN_C1UA:
  346. begin
  347. f_nrd_reg[0] <= 1'b0;
  348. f_ncs_reg[0] <= 1'b0;
  349. end
  350. DATA1_C1UA:
  351. begin
  352. f_nrd_reg[0] <= 1'b1;
  353. f_ncs_reg[0] <= 1'b1;
  354. end
  355. DATA_C1UB:
  356. begin
  357. data_reg <= {16'h12,datain};
  358. f_nrd_reg[0] <= 1'b0;
  359. f_ncs_reg[0] <= 1'b0;
  360. fifo_wr_reg <= 1'b1;
  361. end
  362. CSRDN_C1UB:
  363. begin
  364. f_nrd_reg[0] <= 1'b0;
  365. f_ncs_reg[0] <= 1'b0;
  366. end
  367. DATA1_C1UB:
  368. begin
  369. f_nrd_reg[0] <= 1'b1;
  370. f_ncs_reg[0] <= 1'b1;
  371. end
  372. DATA_C1UC:
  373. begin
  374. data_reg <= {16'h13,datain};
  375. f_nrd_reg[0] <= 1'b0;
  376. f_ncs_reg[0] <= 1'b0;
  377. fifo_wr_reg <= 1'b1;
  378. end
  379. CSRDN_C1UC:
  380. begin
  381. f_nrd_reg[0] <= 1'b0;
  382. f_ncs_reg[0] <= 1'b0;
  383. end
  384. DATA1_C1UC:
  385. begin
  386. f_nrd_reg[0] <= 1'b1;
  387. f_ncs_reg[0] <= 1'b1;
  388. end
  389. DATA_C1IA:
  390. begin
  391. data_reg <= {16'h14,datain};
  392. f_nrd_reg[0] <= 1'b0;
  393. f_ncs_reg[0] <= 1'b0;
  394. fifo_wr_reg <= 1'b1;
  395. end
  396. CSRDN_C1IA:
  397. begin
  398. f_nrd_reg[0] <= 1'b0;
  399. f_ncs_reg[0] <= 1'b0;
  400. end
  401. DATA1_C1IA:
  402. begin
  403. f_nrd_reg[0] <= 1'b1;
  404. f_ncs_reg[0] <= 1'b1;
  405. end
  406. DATA_C1IB:
  407. begin
  408. data_reg <= {16'h15,datain};
  409. f_nrd_reg[0] <= 1'b0;
  410. f_ncs_reg[0] <= 1'b0;
  411. fifo_wr_reg <= 1'b1;
  412. end
  413. CSRDN_C1IB:
  414. begin
  415. f_nrd_reg[0] <= 1'b0;
  416. f_ncs_reg[0] <= 1'b0;
  417. end
  418. DATA1_C1IB:
  419. begin
  420. f_nrd_reg[0] <= 1'b1;
  421. f_ncs_reg[0] <= 1'b1;
  422. end
  423. DATA_C1IC:
  424. begin
  425. data_reg <= {16'h16,datain};
  426. f_nrd_reg[0] <= 1'b0;
  427. f_ncs_reg[0] <= 1'b0;
  428. fifo_wr_reg <= 1'b1;
  429. end
  430. CSRDN_C1IC:
  431. begin
  432. f_nrd_reg[0] <= 1'b0;
  433. f_ncs_reg[0] <= 1'b0;
  434. end
  435. DATA1_C1IC:
  436. begin
  437. f_nrd_reg[0] <= 1'b1;
  438. f_ncs_reg[0] <= 1'b1;
  439. end
  440. ///////////////////////////////////////
  441. DATA_C2UA:
  442. begin
  443. data_reg <= {16'h21,datain};
  444. f_nrd_reg[1] <= 1'b0;
  445. f_ncs_reg[1] <= 1'b0;
  446. fifo_wr_reg <= 1'b1;
  447. end
  448. CSRDN_C2UA:
  449. begin
  450. f_nrd_reg[1] <= 1'b0;
  451. f_ncs_reg[1] <= 1'b0;
  452. end
  453. DATA1_C2UA:
  454. begin
  455. f_nrd_reg[1] <= 1'b1;
  456. f_ncs_reg[1] <= 1'b1;
  457. end
  458. DATA_C2UB:
  459. begin
  460. data_reg <= {16'h22,datain};
  461. f_nrd_reg[1] <= 1'b0;
  462. f_ncs_reg[1] <= 1'b0;
  463. fifo_wr_reg <= 1'b1;
  464. end
  465. CSRDN_C2UB:
  466. begin
  467. f_nrd_reg[1] <= 1'b0;
  468. f_ncs_reg[1] <= 1'b0;
  469. end
  470. DATA1_C2UB:
  471. begin
  472. f_nrd_reg[1] <= 1'b1;
  473. f_ncs_reg[1] <= 1'b1;
  474. end
  475. DATA_C2UC:
  476. begin
  477. data_reg <= {16'h23,datain};
  478. f_nrd_reg[1] <= 1'b0;
  479. f_ncs_reg[1] <= 1'b0;
  480. fifo_wr_reg <= 1'b1;
  481. end
  482. CSRDN_C2UC:
  483. begin
  484. f_nrd_reg[1] <= 1'b0;
  485. f_ncs_reg[1] <= 1'b0;
  486. end
  487. DATA1_C2UC:
  488. begin
  489. f_nrd_reg[1] <= 1'b1;
  490. f_ncs_reg[1] <= 1'b1;
  491. end
  492. DATA_C2IA:
  493. begin
  494. data_reg <= {16'h24,datain};
  495. f_nrd_reg[1] <= 1'b0;
  496. f_ncs_reg[1] <= 1'b0;
  497. fifo_wr_reg <= 1'b1;
  498. end
  499. CSRDN_C2IA:
  500. begin
  501. f_nrd_reg[1] <= 1'b0;
  502. f_ncs_reg[1] <= 1'b0;
  503. end
  504. DATA1_C2IA:
  505. begin
  506. f_nrd_reg[1] <= 1'b1;
  507. f_ncs_reg[1] <= 1'b1;
  508. end
  509. DATA_C2IB:
  510. begin
  511. data_reg <= {16'h25,datain};
  512. f_nrd_reg[1] <= 1'b0;
  513. f_ncs_reg[1] <= 1'b0;
  514. fifo_wr_reg <= 1'b1;
  515. end
  516. CSRDN_C2IB:
  517. begin
  518. f_nrd_reg[1] <= 1'b0;
  519. f_ncs_reg[1] <= 1'b0;
  520. end
  521. DATA1_C2IB:
  522. begin
  523. f_nrd_reg[1] <= 1'b1;
  524. f_ncs_reg[1] <= 1'b1;
  525. end
  526. DATA_C2IC:
  527. begin
  528. data_reg <= {16'h26,datain};
  529. f_nrd_reg[1] <= 1'b0;
  530. f_ncs_reg[1] <= 1'b0;
  531. fifo_wr_reg <= 1'b1;
  532. end
  533. CSRDN_C2IC:
  534. begin
  535. f_nrd_reg[1] <= 1'b0;
  536. f_ncs_reg[1] <= 1'b0;
  537. end
  538. DATA1_C2IC:
  539. begin
  540. f_nrd_reg[1] <= 1'b1;
  541. f_ncs_reg[1] <= 1'b1;
  542. end
  543. ///////////////////////////////////////
  544. IDLE:
  545. begin
  546. data_reg <= {16'h88,16'h00};
  547. //    fifo_wr_reg <= 1'b1;
  548. end
  549. default: ;
  550. endcase
  551. end
  552. always @ (posedge clk)
  553. if(!rst)
  554. begin
  555. counter <= 8'd0;
  556. eoc1 <= 1'd0;
  557. state <= 1'd0;
  558. end
  559. else
  560. begin
  561. eoc1      <= eoc;
  562. case (state)
  563. 1'd0:
  564. begin
  565. counter <= 8'd0;
  566. if(eoc & (~eoc1))
  567. begin
  568. state     <=     1'd1;
  569. counter    <=        counter + 8'd1;
  570. end
  571. end
  572. 1'd1:
  573. begin
  574. if(counter == SET_COUNT)
  575. begin
  576. state     <=     1'd0;
  577. counter     <=     8'd0;
  578. end
  579. else
  580. if(eoc & (~eoc1))
  581. begin
  582. counter <= 8'd0;
  583. end
  584. else
  585. counter <=     counter + 8'd1;
  586. end
  587. endcase
  588. end
  589. endmodule

FIFO传送判断条件

点击(此处)折叠或打开

  1. module fifo_switch(
  2. clk,
  3. rst,
  4. almost_full,
  5. empty,
  6. rdreq
  7. );
  8. input clk,rst;
  9. input almost_full,empty;
  10. output rdreq;
  11. reg state = 1'b0;
  12. reg almost_full_p, empty_p;
  13. assign rdreq = state ? 1'b1 : 1'b0;
  14. always @ (posedge clk)
  15. if(!rst)
  16. begin
  17. almost_full_p <= 1'b0;
  18. empty_p    <= 1'b0;
  19. end
  20. else
  21. begin
  22. almost_full_p <= almost_full;
  23. empty_p <= empty;
  24. end
  25. always @ (posedge clk)
  26. case (state)
  27. 1'b0:
  28. if(almost_full & ~almost_full_p)
  29. state <= 1'b1;
  30. 1'b1:
  31. if(empty & ~empty_p)
  32. state <= 1'b0;
  33. endcase
  34. endmodule

UPP接口

点击(此处)折叠或打开

  1. module uPP_ddio(
  2. clk,
  3. oe,
  4. datain,
  5. dataout
  6. );
  7. input oe;
  8. input clk;
  9. input[31:0]     datain;
  10. output[15:0]     dataout;
  11. reg[15:0]         data_reg;
  12. reg                 state         = 0;
  13. //assign
  14. dataout = (oe == 1) ? data_reg : 16'd0 ;
  15. assign dataout = data_reg;
  16. always @ (posedge clk)
  17. begin
  18. state <= ~state;
  19. if(state)
  20. data_reg <= datain[31:16];
  21. else
  22. data_reg <= datain[15:0];
  23. end
  24. endmodule

最后整体图:

omam138/upp/fpga相关推荐

  1. Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输

    Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输 一.Xilinx FIFO IP核介绍 二.UPP 仿真效果 总结 一.Xilinx FIFO IP核介绍 1. 因 ...

  2. UPP协议转AXI4协议的burst读写FPGA实现

    UPP协议转AXI4协议的burst读写FPGA实现 名字是按标准协议命名的,细节都在图里,有兴趣的朋友自己看下,或者私信我,欢迎批评指正! Burst 读和写 写数据 读数据

  3. OMAPL138 + SPARTAN6 DSP+ARM+FPGA开发例程

    目 录 本例程基于信迈OMAPL138+SPARTAN6评估板开发. 开发板准备 16 查看仿真器驱动是否正常安装 17 程序加载和烧写 19 基于仿真器的程序加载和烧写 19 设置工程配置文件信息 ...

  4. FPGA研发心得~~转

    FPGA是个什么玩意? 首先来说: FPGA是一种器件.其英文名 feild programable gate arry .很长,但不通俗.通俗来说,是一种功能强大似乎无所不能的器件.通常用于通信.网 ...

  5. TI C2000系列TMS320F2837xD开发板(DSP+FPGA)硬件规格参数说明书

    前 言 本文档主要介绍TMS320F2837xD开发板硬件接口资源以及设计注意事项等内容. 它是基于TI C2000系列TMS320F2837xD双核C28x 32位浮点DSP + 紫光同创Logos ...

  6. 基于C6748+FPGA的高精度北斗接收机设计与实现

    随着计算机技术.通信技术.测控技术的提高,卫星导航技术不断进步,尤其在军事.民用领域应用越来越广泛,逐渐成为衡量国家军事实力和科学技术水平的一个重要标杆.我国在20世纪90年代中期开始建设中国北斗卫星 ...

  7. 基于TI TMS320F2837x系列的单/双核32位浮点MCU控制器+ Xilinx Spartan-6低功耗FPGA核心板

    由创龙自主研发的SOM-TL2837xF核心板,大小仅有72mm*44mm.采用沉金无铅工艺的8层板设计,专业的PCB Layout保证信号完整性的同时,经过严格的质量控制,非常适用于高速数据采集与处 ...

  8. 基于OMPAL138+FPGA的三相电能质量分析仪设计

    随着我国经济的快速发展,电力资源已经成为人民生活.社会生产的重要能源.由于各种各样的用电设备日益增多,使得实际电网中存在很多不平衡和非线性的冲击性负载,导致电网出现供电电压偏差.频率偏差.谐波.间谐波 ...

  9. 基于C6748 DSP+FPGA电能质量检测仪设计和实现

    随着清洁能源的大规模并网以及电力电子元件的广泛应用,公用电网的电能质量面临愈发严重的挑战.同时,工业生产和社会生活朝智能化方向发展使得更多的电力系统负荷对电能质量敏感,因此用户也明显提高了对电能质量的 ...

最新文章

  1. 分布式消息队列 — Overview
  2. 如何在cmd命令行中查看、修改、删除与添加环境变量
  3. discuz和php的区别,discuz和phpwind优劣比较
  4. ObjectArx R14-2007下载地址
  5. 轻量级过程改进项目启动
  6. [微博]页面table 闪动问题解决
  7. qq为何没有linux版本,如何安装linux版本QQ?
  8. 【数据库】E-R图向关系模型转换的规则
  9. axios上传图片到php报500,vue项目中使用axios上传图片等文件
  10. 通过企业账号邀请开发者(不需要支付99刀,在真机上调试)
  11. hadoop 空间配置
  12. matlab单元刚度矩阵,求助:关于有限元三角形单元合成总刚度矩阵怎么处理
  13. knn(k近邻算法)——python
  14. win7下强制结束进程的cmd命令
  15. 排列奇偶性与排序的关系
  16. 如何做到长期稳定的禅修?
  17. 卷积神经网络残差计算
  18. AUTOSAR技术分析报告
  19. 高版本Android真机逆向测试环境搭建
  20. 计算机上配置静态ip,如何给电脑设置固定IP地址

热门文章

  1. 安装 | 企业版CDH服务器集群配置(详细)
  2. FAST无线网卡自助
  3. mac下Homebrew安装Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed报错解决方法
  4. cudn以及cudnn安装教程(自用)
  5. .net core 中使用Google的protoc
  6. 双非计算机全奖博士,录取捷报|双非本科背景拿下普渡大学药理学全奖博士
  7. 图像处理之高通滤波器与低通滤波器
  8. php读取word里的内容
  9. [如何写一篇优秀的论文] 书写初稿
  10. uni-app APP开发升级功能