packaging.vhd 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. ----------------------------------------------------------------------------------
  2. -- Company:
  3. -- Engineer:
  4. --
  5. -- Create Date: 03.06.2019 20:10:59
  6. -- Design Name:
  7. -- Module Name: packaging - Behavioral
  8. -- Project Name:
  9. -- Target Devices:
  10. -- Tool Versions:
  11. -- Description:
  12. --
  13. -- Dependencies:
  14. --
  15. -- Revision:
  16. -- Revision 0.01 - File Created
  17. -- Additional Comments:
  18. --
  19. ----------------------------------------------------------------------------------
  20. library IEEE;
  21. use IEEE.STD_LOGIC_1164.ALL;
  22. use IEEE.std_logic_arith.ALL;
  23. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  24. use work.myPackage.ALL;
  25. entity packaging is
  26. generic(
  27. busWidth : integer:=32);
  28. Port ( clk : in STD_LOGIC;
  29. rst : in STD_LOGIC;
  30. inputStream : in STD_LOGIC_VECTOR (busWidth-1 downto 0);
  31. inpRdEn : out std_logic;
  32. --inputDataCount : in STD_LOGIC_VECTOR (15 downto 0);
  33. inputEmpty : in std_logic;
  34. outData : out STD_LOGIC_VECTOR (busWidth-1 downto 0);
  35. outWrEn : out std_logic;
  36. outputFull : in std_logic;
  37. errorCode : out STD_LOGIC_VECTOR(3 DOWNTO 0);
  38. stateOut : out STD_LOGIC_VECTOR(3 downto 0));
  39. end packaging;
  40. architecture Behavioral of packaging is
  41. constant PREAMBLE : std_logic_vector(31 downto 0) := x"E1E4C312";
  42. type state_t is (
  43. waitPreamble,
  44. checkPreamble,
  45. waitDatasetId,
  46. getDatasetId,
  47. waitModuleId,
  48. checkModuleId,
  49. writeHeader,
  50. waitProcessing,
  51. waitChecksum,
  52. readChecksum,
  53. writeChecksum);
  54. component multiplex is
  55. generic(
  56. busWidth : integer:=busWidth);
  57. Port (
  58. clk : in STD_LOGIC;
  59. start : in STD_LOGIC;
  60. ready: out std_logic;
  61. rst : in STD_LOGIC;
  62. done : out STD_LOGIC;
  63. idle : out STD_LOGIC;
  64. moduleId : in STD_LOGIC_VECTOR (31 downto 0);
  65. srcData : in STD_LOGIC_VECTOR (busWidth-1 downto 0);
  66. srcValid : in std_logic;
  67. srcReady : out std_logic;
  68. dstData : out STD_LOGIC_VECTOR (busWidth-1 downto 0);
  69. dstValid : out std_logic;
  70. dstReady : in std_logic);
  71. end component;
  72. component checksum is
  73. Port ( clk : in STD_LOGIC;
  74. reset : in STD_LOGIC;
  75. enable : in STD_LOGIC;
  76. dataIn : in STD_LOGIC_VECTOR (busWidth-1 downto 0);
  77. output : out STD_LOGIC_VECTOR (busWidth-1 downto 0));
  78. end component;
  79. signal state : state_t;
  80. signal moduleId : STD_LOGIC_VECTOR (31 downto 0);
  81. signal datasetId : STD_LOGIC_VECTOR (31 downto 0);
  82. signal inputReadReady : std_logic;
  83. signal outputWriteEnable_s : std_logic;
  84. signal outputStream_s : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  85. signal inputReadEnable : std_logic;
  86. signal outputWriteEnable : std_logic;
  87. signal outputStream : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  88. signal errorCode_s : std_logic_vector(3 downto 0);
  89. signal outHeaderCounter : integer range 0 to 3;
  90. signal muxSrcData : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  91. signal muxSrcValid : std_logic;
  92. signal muxSrcReady : std_logic;
  93. signal muxDstData : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  94. signal muxDstValid : std_logic;
  95. signal muxDstReady : std_logic;
  96. signal muxStart : std_logic;
  97. signal muxReady : std_logic;
  98. signal muxDone : std_logic;
  99. signal muxIdle : std_logic;
  100. signal muxControlsFIFO : std_logic;
  101. signal csReset : std_logic;
  102. signal csOutReset : std_logic;
  103. signal csSum : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  104. signal csOutSum : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  105. begin
  106. mux1 : multiplex port map (
  107. clk => clk,
  108. rst => rst,
  109. start => muxStart,
  110. ready => muxReady,
  111. done => muxDone,
  112. idle => muxIdle,
  113. moduleId => moduleId,
  114. srcData => muxSrcData,
  115. srcValid => muxSrcValid,
  116. srcReady => muxSrcReady,
  117. dstData => muxDstData,
  118. dstValid => muxDstValid,
  119. dstReady => muxDstReady
  120. );
  121. checksum1 : checksum port map (
  122. clk => clk,
  123. reset => csReset,
  124. enable => inputReadEnable,
  125. dataIn => inputStream,
  126. output => csSum
  127. );
  128. checksum2 : checksum port map (
  129. clk => clk,
  130. reset => csOutReset,
  131. enable => outputWriteEnable,
  132. dataIn => outputStream,
  133. output => csOutSum
  134. );
  135. sm : process(rst, clk)
  136. begin
  137. if(rst = '0') then
  138. state <= waitPreamble;
  139. inputReadReady <= '0';
  140. csReset <= '0';
  141. csOutReset <= '0';
  142. outHeaderCounter <= 3;
  143. muxStart <= '0';
  144. muxControlsFIFO <= '0';
  145. elsif(rising_edge(clk)) then
  146. csReset <= '1';
  147. csOutReset <= '1';
  148. errorCode_s <= x"0";
  149. muxStart <= '0';
  150. muxControlsFIFO <= '0';
  151. outputWriteEnable_s <= '0';
  152. outHeaderCounter <= 0;
  153. outputStream_s <= (others=>'0');
  154. case state is
  155. -- wait for header
  156. when waitPreamble =>
  157. csReset <= '0';
  158. inputReadReady <= '1';
  159. if(inputEmpty = '1' or outputFull = '1') then
  160. state <= waitPreamble;
  161. else
  162. state <= checkPreamble;
  163. end if;
  164. -- is preamble correct?
  165. when checkPreamble =>
  166. if(inputStream = PREAMBLE and inputEmpty = '0') then
  167. state <= getDatasetId;
  168. elsif inputStream = PREAMBLE then
  169. state <= waitDatasetId;
  170. else
  171. state <= waitPreamble;
  172. errorCode_s <= x"1";
  173. end if;
  174. when waitDatasetId =>
  175. if inputEmpty = '1' then
  176. errorCode_s <= x"F";
  177. state <= waitDatasetId;
  178. else
  179. state <= getDatasetId;
  180. end if;
  181. when getDatasetId =>
  182. datasetId <= inputStream;
  183. if inputEmpty = '1' then
  184. state <= waitModuleId;
  185. else
  186. state <= checkModuleId;
  187. end if;
  188. when waitModuleId =>
  189. if inputEmpty = '1' then
  190. errorCode_s <= x"E";
  191. state <= waitModuleId;
  192. else
  193. state <= checkModuleId;
  194. end if;
  195. -- is moduleId known?
  196. when checkModuleId =>
  197. inputReadReady <= '0';
  198. if outputFull = '1' then
  199. state <= checkModuleId;
  200. errorCode_s <= x"D";
  201. elsif(inputStream = x"2cb31e7c" or inputStream = x"f218e0a2" or inputStream = x"9323eb24") then
  202. state <= writeHeader;
  203. moduleId <= inputStream;
  204. outputStream_s <= PREAMBLE;
  205. csOutReset <= '0';
  206. outputWriteEnable_s <= '1';
  207. else
  208. state <= waitPreamble;
  209. errorCode_s <= x"2";
  210. end if;
  211. -- wait for data
  212. when writeHeader =>
  213. if outputFull = '1' then
  214. state <= writeHeader;
  215. errorCode_s <= x"C";
  216. outHeaderCounter <= outHeaderCounter;
  217. elsif(outHeaderCounter < 2) then
  218. outputWriteEnable_s <= '1';
  219. case outHeaderCounter is
  220. when 0 => outputStream_s <= datasetId;
  221. when others => outputStream_s <= moduleId;
  222. end case;
  223. outHeaderCounter <= outHeaderCounter + 1;
  224. state <= writeHeader;
  225. else
  226. state <= waitProcessing;
  227. muxStart <= '1';
  228. muxControlsFIFO <= '1';
  229. end if;
  230. when waitProcessing =>
  231. if(muxDone = '0') then
  232. state <= waitProcessing;
  233. muxControlsFIFO <= '1';
  234. errorCode_s <= x"B";
  235. muxStart <= '1';
  236. else
  237. state <= waitChecksum;
  238. inputReadReady <= '1';
  239. end if;
  240. when waitChecksum =>
  241. if inputEmpty = '1' then
  242. errorCode_s <= x"A";
  243. state <= waitChecksum;
  244. inputReadReady <= '1';
  245. else
  246. state <= readChecksum;
  247. inputReadReady <= '0';
  248. end if;
  249. when readChecksum =>
  250. state <= writeChecksum;
  251. when writeChecksum =>
  252. if outputFull = '0' then
  253. outputWriteEnable_s <= '1';
  254. state <= waitPreamble;
  255. else
  256. state <= writeChecksum;
  257. end if;
  258. if(unsigned(csSum) = 0) then
  259. outputStream_s <= 0 - unsigned(csOutSum);
  260. else
  261. errorCode_s <= x"3";
  262. outputStream_s <= 1 - unsigned(csOutSum);
  263. end if;
  264. when others =>
  265. state <= waitPreamble;
  266. inputReadReady <= '0';
  267. end case;
  268. if signed(errorCode_s) > 0 and outputFull = '0' then
  269. outputWriteEnable_s <= '1';
  270. outputStream_s <= x"E330300" & errorCode_s;
  271. end if;
  272. muxSrcValid <= muxSrcReady and not inputEmpty;
  273. end if;
  274. end process;
  275. muxCtrl : process(muxControlsFIFO, outputWriteEnable_s, inputReadReady, outputStream_s, muxDstValid, muxSrcReady, muxDstData, inputStream, outputFull, inputEmpty)
  276. begin
  277. if muxControlsFIFO = '0' then
  278. outputWriteEnable <= outputWriteEnable_s;
  279. inputReadEnable <= inputReadReady and not inputEmpty;
  280. outputStream <= outputStream_s;
  281. muxSrcData <= (others => 'U');
  282. muxDstReady <= '0';
  283. else
  284. outputWriteEnable <= muxDstValid and not outputFull;
  285. inputReadEnable <= muxSrcReady and not inputEmpty;
  286. outputStream <= muxDstData;
  287. muxSrcData <= inputStream;
  288. muxDstReady <= not outputFull;
  289. end if;
  290. end process;
  291. errorCode <= errorCode_s;
  292. stateOut <= std_logic_vector(conv_unsigned(state_t'POS(state), 4));
  293. outWrEn <= outputWriteEnable;
  294. inpRdEn <= inputReadEnable;
  295. outData <= outputStream;
  296. end Behavioral;