TestPlFifo.Mod 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. MODULE TestPlFifo;
  2. IMPORT
  3. Trace, Machine, Kernel, KernelLog,
  4. PsConfig, AcAxisIo,
  5. DMA330ProgramWriter;
  6. CONST
  7. ActDmaFill = 0;
  8. ActDmaEmpty = 1;
  9. ActCpuFill = 2;
  10. ActCpuEmpty = 3;
  11. ActCautiousFill = 4;
  12. ActCautiousEmpty = 5;
  13. TYPE
  14. Notifier = OBJECT
  15. VAR
  16. params: ANY;
  17. count, result: LONGINT;
  18. PROCEDURE Await(param: ANY): LONGINT;
  19. BEGIN {EXCLUSIVE}
  20. AWAIT((count = 1)); (* & ((param = NIL) OR (param = params)));*)
  21. (*TRACE('notified', count);*)
  22. DEC(count);
  23. RETURN result
  24. END Await;
  25. PROCEDURE Notify (status: LONGINT; param: ANY);
  26. BEGIN {EXCLUSIVE}
  27. result := status;
  28. params := param;
  29. INC(count)
  30. (*;TRACE('notifying', count)*)
  31. END Notify;
  32. (*BEGIN {ACTIVE}
  33. BEGIN {EXCLUSIVE} done := TRUE END;
  34. LOOP
  35. BEGIN {EXCLUSIVE} AWAIT(~done) END;
  36. LOOP
  37. TRACE(output.ready, input.available)
  38. END
  39. END*)
  40. END Notifier;
  41. Controller = OBJECT
  42. VAR
  43. action: LONGINT;
  44. notifier: Notifier;
  45. PROCEDURE & Init (action: LONGINT);
  46. BEGIN
  47. SELF.action := action;
  48. IF action <= ActDmaEmpty THEN NEW(notifier) END
  49. END Init;
  50. PROCEDURE EmptyCautious;
  51. VAR
  52. k, v: LONGINT;
  53. BEGIN
  54. FOR k := 1 TO 32768+1 DO
  55. REPEAT UNTIL input.available;
  56. v := input.data
  57. END;
  58. KernelLog.Enter; KernelLog.String("CPU cautious emptying done"); KernelLog.Exit
  59. END EmptyCautious;
  60. PROCEDURE FillCautious;
  61. VAR
  62. k: LONGINT;
  63. BEGIN
  64. FOR k := 1 TO 32768+1 DO
  65. REPEAT UNTIL output.ready;
  66. output.data := k
  67. END;
  68. KernelLog.Enter; KernelLog.String("CPU cautious filling done"); KernelLog.Exit
  69. END FillCautious;
  70. PROCEDURE EmptyCpu;
  71. VAR
  72. k, v: LONGINT;
  73. BEGIN
  74. FOR k := 1 TO 32768+1 DO
  75. v := input.data
  76. END;
  77. KernelLog.Enter; KernelLog.String("CPU emptying done"); KernelLog.Exit
  78. END EmptyCpu;
  79. PROCEDURE FillCpu;
  80. VAR
  81. k: LONGINT;
  82. BEGIN
  83. FOR k := 1 TO 32768+1 DO
  84. output.data := k
  85. END;
  86. KernelLog.Enter; KernelLog.String("CPU filling done"); KernelLog.Exit
  87. END FillCpu;
  88. PROCEDURE FillDma;
  89. CONST
  90. size = 16 * 1024;
  91. alignment = 8;
  92. VAR
  93. program: DMA330ProgramWriter.Program;
  94. src: POINTER TO ARRAY OF CHAR;
  95. srcOfs: ADDRESS;
  96. i, status: LONGINT;
  97. BEGIN
  98. NEW(src, size + alignment);
  99. srcOfs := alignment - ADDRESSOF(src[0]) MOD alignment;
  100. FOR i := 0 TO size - 1 DO
  101. src[i] := CHR(i)
  102. END;
  103. Machine.FlushDCacheRange(ADDRESSOF(src[0]), LEN(src));
  104. DMA330ProgramWriter.InitProgram(program);
  105. IF ~DMA330ProgramWriter.SetBurstParameters(program, 8, 4, status) THEN
  106. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  107. RETURN
  108. END;
  109. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(src[srcOfs]), size, 0, ADDRESSOF(output.data), 0, 0, size, status) THEN
  110. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  111. RETURN
  112. END;
  113. IF ~DMA330ProgramWriter.BindToChannel(program, 1, status) THEN
  114. KernelLog.String("Error binding DMA program to channel 1: "); KernelLog.Int(status, 0); KernelLog.Ln;
  115. RETURN
  116. END;
  117. FOR i := 1 TO 8 DO
  118. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  119. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  120. RETURN
  121. END;
  122. status := notifier.Await(NIL);
  123. IF status # DMA330ProgramWriter.Ok THEN
  124. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  125. RETURN
  126. END
  127. END;
  128. output.data := 1234ABCDH;
  129. KernelLog.Enter; KernelLog.String("DMA Filling done"); KernelLog.Exit
  130. END FillDma;
  131. PROCEDURE EmptyDma;
  132. CONST
  133. size = 16 * 1024;
  134. alignment = 8;
  135. VAR
  136. program: DMA330ProgramWriter.Program;
  137. dst: POINTER TO ARRAY OF CHAR;
  138. dstOfs: ADDRESS;
  139. i, status: LONGINT;
  140. BEGIN
  141. NEW(dst, size + alignment);
  142. dstOfs := alignment - ADDRESSOF(dst[0]) MOD alignment;
  143. DMA330ProgramWriter.InitProgram(program);
  144. IF ~DMA330ProgramWriter.SetBurstParameters(program, 8, 4, status) THEN
  145. KernelLog.String("Error setting burst parameters: "); KernelLog.Int(status, 0); KernelLog.Ln;
  146. RETURN
  147. END;
  148. IF ~DMA330ProgramWriter.Generate(program, ADDRESSOF(input.data), 0, 0, ADDRESSOF(dst[dstOfs]), size, 0, size, status) THEN
  149. KernelLog.String("Error programming DMA: "); KernelLog.Int(status, 0); KernelLog.Ln;
  150. RETURN
  151. END;
  152. IF ~DMA330ProgramWriter.BindToChannel(program, 0, status) THEN
  153. KernelLog.String("Error binding DMA program to channel 0: "); KernelLog.Int(status, 0); KernelLog.Ln;
  154. RETURN
  155. END;
  156. FOR i := 1 TO 8 DO
  157. IF ~DMA330ProgramWriter.Execute(program, notifier.Notify, NIL, status) THEN
  158. KernelLog.String("Error starting DMA program: "); KernelLog.Int(status, 0); KernelLog.Ln;
  159. RETURN
  160. END;
  161. status := notifier.Await(NIL);
  162. IF status # DMA330ProgramWriter.Ok THEN
  163. KernelLog.String("Error in DMA program execution: "); KernelLog.Int(status, 0); KernelLog.Ln;
  164. RETURN
  165. END
  166. END;
  167. Machine.InvalidateDCacheRange(ADDRESSOF(dst[dstOfs]), size);
  168. i := input.data;
  169. KernelLog.Enter; KernelLog.String("DMA emptying done"); KernelLog.Exit
  170. END EmptyDma;
  171. BEGIN {ACTIVE}
  172. CASE action OF
  173. ActDmaFill: FillDma
  174. |ActDmaEmpty: EmptyDma
  175. |ActCpuFill: FillCpu
  176. |ActCpuEmpty: EmptyCpu
  177. |ActCautiousFill: FillCautious
  178. |ActCautiousEmpty: EmptyCautious
  179. END
  180. END Controller;
  181. VAR
  182. output: AcAxisIo.Output;
  183. input: AcAxisIo.Input;
  184. PROCEDURE InitPl;
  185. VAR
  186. freq: HUGEINT;
  187. res: LONGINT;
  188. BEGIN
  189. freq := PsConfig.GetPllClockFrequency(PsConfig.IoPll,res);
  190. Trace.String("IO PLL frequency is "); Trace.Int(freq,0); Trace.StringLn(" Hz");
  191. Trace.String("Initial FPGA clock 0 frequency is "); Trace.Int(PsConfig.GetPlClockFrequency(0,res),0); Trace.StringLn(" Hz");
  192. ASSERT(PsConfig.SetPlResets({0,1,2,3},res));
  193. IF PsConfig.SetPlClock(0,PsConfig.IoPll,9,1,res) THEN
  194. Trace.String("FPGA clock 0 frequency has been changed to "); Trace.Int(PsConfig.GetPlClockFrequency(0,res),0); Trace.StringLn(" Hz");
  195. ELSE Trace.String("Error while setting FPGA clock 0 frequency, res="); Trace.Int(res,0); Trace.Ln;
  196. END;
  197. output := AcAxisIo.GetOutput(0,0);
  198. input := AcAxisIo.GetInput(0,0);
  199. ResetPl
  200. END InitPl;
  201. PROCEDURE ResetPl;
  202. VAR
  203. t: HUGEINT;
  204. res: LONGINT;
  205. BEGIN
  206. (* Reset PL *)
  207. ASSERT(PsConfig.SetPlResets({0,1,2,3},res));
  208. t := Kernel.GetTicks();
  209. WHILE Kernel.GetTicks() - t < 1 DO END;
  210. ASSERT(PsConfig.SetPlResets({},res));
  211. END ResetPl;
  212. PROCEDURE DmaEmpty *;
  213. VAR
  214. ctrl: Controller;
  215. BEGIN
  216. NEW(ctrl, ActDmaEmpty)
  217. END DmaEmpty;
  218. PROCEDURE DmaFill *;
  219. VAR
  220. ctrl: Controller;
  221. BEGIN
  222. NEW(ctrl, ActDmaFill)
  223. END DmaFill;
  224. PROCEDURE Empty *;
  225. VAR
  226. ctrl: Controller;
  227. BEGIN
  228. NEW(ctrl, ActCpuEmpty)
  229. END Empty;
  230. PROCEDURE Fill *;
  231. VAR
  232. ctrl: Controller;
  233. BEGIN
  234. NEW(ctrl, ActCpuFill)
  235. END Fill;
  236. PROCEDURE CautiousEmpty *;
  237. VAR
  238. ctrl: Controller;
  239. BEGIN
  240. NEW(ctrl, ActCautiousEmpty)
  241. END CautiousEmpty;
  242. PROCEDURE CautiousFill *;
  243. VAR
  244. ctrl: Controller;
  245. BEGIN
  246. NEW(ctrl, ActCautiousFill)
  247. END CautiousFill;
  248. BEGIN
  249. InitPl;
  250. END TestPlFifo.
  251. SystemTools.DoCommands
  252. Compiler.Compile -b=ARM --mergeSections
  253. Zynq.PsConfig.Mod
  254. TestFifo/Zynq.AcAxisIo.Mod
  255. DMA330.Mod
  256. DMA330ProgramWriter.Mod
  257. TestPlFifo.Mod
  258. ~
  259. StaticLinker.Link --fileName=Test.Bin --displacement=100000H -a
  260. Runtime Initializer Platform FPE64 ARMRuntime Trace BootConfig Uart Machine Heaps Modules Objects
  261. Kernel KernelLog Plugins Streams Pipes Commands Reals Clock Dates Strings Files Disks Reflection
  262. TrapWriters Traps Locks Options Timer Shell ShellController Math Random DMA330 DMA330ProgramWriter PsConfig AcAxisIo Test
  263. ~
  264. ~
  265. Release.Build -f=ARM.Release.Tool -l --only='Kernel System UsbCore DMA Shell' ZynqA2 ~
  266. setsource TFTP 10.3.34.145
  267. load TestFifo.bin fpga
  268. load Test.Bin memory 100000H
  269. start 100000H