packaging.vhd 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  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. inputEmpty : in std_logic;
  33. outData : out STD_LOGIC_VECTOR (busWidth-1 downto 0);
  34. outWrEn : out std_logic;
  35. outputFull : in std_logic;
  36. errorCode : out STD_LOGIC_VECTOR(3 DOWNTO 0);
  37. stateOut : out STD_LOGIC_VECTOR(3 downto 0));
  38. end packaging;
  39. architecture Behavioral of packaging is
  40. constant PREAMBLE : std_logic_vector(31 downto 0) := x"E1E4C312";
  41. type state_t is (
  42. waitPreamble,
  43. checkPreamble,
  44. waitDatasetId,
  45. getDatasetId,
  46. waitModuleId,
  47. checkModuleId,
  48. writeHeader,
  49. waitProcessing,
  50. waitChecksum,
  51. readChecksum,
  52. writeChecksum);
  53. component multiplex is
  54. generic(
  55. busWidth : integer:=busWidth);
  56. Port (
  57. clk : in STD_LOGIC;
  58. start : in STD_LOGIC;
  59. ready: out std_logic;
  60. rst : in STD_LOGIC;
  61. done : out STD_LOGIC;
  62. idle : out STD_LOGIC;
  63. moduleId : in STD_LOGIC_VECTOR (31 downto 0);
  64. srcData : in STD_LOGIC_VECTOR (busWidth-1 downto 0);
  65. srcValid : in std_logic;
  66. srcReady : out std_logic;
  67. dstData : out STD_LOGIC_VECTOR (busWidth-1 downto 0);
  68. dstValid : out std_logic;
  69. dstReady : in std_logic);
  70. end component;
  71. component checksum is
  72. Port ( clk : in STD_LOGIC;
  73. reset : in STD_LOGIC;
  74. enable : in STD_LOGIC;
  75. dataIn : in STD_LOGIC_VECTOR (busWidth-1 downto 0);
  76. output : out STD_LOGIC_VECTOR (busWidth-1 downto 0));
  77. end component;
  78. signal state : state_t;
  79. signal moduleId : STD_LOGIC_VECTOR (31 downto 0);
  80. signal datasetId : STD_LOGIC_VECTOR (31 downto 0);
  81. signal inputReadReady : std_logic;
  82. signal inputReadEnable : std_logic;
  83. signal outputWriteReady : std_logic;
  84. signal outputStream_s : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  85. signal outputWriteEnable : std_logic;
  86. signal outputStream : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  87. signal errorCode_s : std_logic_vector(3 downto 0);
  88. signal outHeaderCounter : integer range 0 to 3;
  89. signal muxSrcData : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  90. signal muxSrcValid : std_logic;
  91. signal muxSrcReady : std_logic;
  92. signal muxDstData : STD_LOGIC_VECTOR (busWidth-1 downto 0);
  93. signal muxDstValid : std_logic;
  94. signal muxDstReady : std_logic;
  95. signal muxStart : std_logic;
  96. signal muxReady : std_logic;
  97. signal muxDone : std_logic;
  98. signal muxIdle : std_logic;
  99. signal muxControlsFIFO : std_logic;
  100. signal csEnable : 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 => csEnable,
  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. fsm : process(rst, clk)
  136. variable validModuleId : std_logic := '0';
  137. begin
  138. if(rst = '0') then
  139. state <= waitPreamble;
  140. inputReadReady <= '0';
  141. csReset <= '0';
  142. csOutReset <= '0';
  143. outHeaderCounter <= 3;
  144. muxStart <= '0';
  145. muxControlsFIFO <= '0';
  146. errorCode_s <= x"0";
  147. outputWriteReady <= '0';
  148. outputStream_s <= (others=>'U');
  149. elsif(rising_edge(clk)) then
  150. csReset <= '1';
  151. csOutReset <= '1';
  152. errorCode_s <= x"0";
  153. muxStart <= '0';
  154. muxControlsFIFO <= '0';
  155. inputReadReady <= '0';
  156. outputWriteReady <= '0';
  157. outHeaderCounter <= 0;
  158. outputStream_s <= (others=>'U');
  159. case state is
  160. -- wait for header
  161. when waitPreamble =>
  162. csReset <= '0';
  163. inputReadReady <= '1';
  164. if inputReadEnable = '0' then
  165. state <= waitPreamble;
  166. else
  167. state <= checkPreamble;
  168. end if;
  169. -- is preamble correct?
  170. when checkPreamble =>
  171. inputReadReady <= '1';
  172. if(inputStream = PREAMBLE and inputReadEnable = '1') then
  173. state <= getDatasetId;
  174. elsif inputStream = PREAMBLE then
  175. state <= waitDatasetId;
  176. elsif inputReadEnable = '1' then
  177. state <= checkPreamble;
  178. errorCode_s <= x"1";
  179. else
  180. state <= waitPreamble;
  181. errorCode_s <= x"1";
  182. end if;
  183. when waitDatasetId =>
  184. inputReadReady <= '1';
  185. if inputReadEnable = '0' then
  186. errorCode_s <= x"F";
  187. state <= waitDatasetId;
  188. else
  189. state <= getDatasetId;
  190. end if;
  191. when getDatasetId =>
  192. datasetId <= inputStream;
  193. if inputReadEnable = '0' then
  194. state <= waitModuleId;
  195. inputReadReady <= '1';
  196. else
  197. state <= checkModuleId;
  198. end if;
  199. when waitModuleId =>
  200. if inputReadEnable = '0' then
  201. errorCode_s <= x"E";
  202. state <= waitModuleId;
  203. inputReadReady <= '1';
  204. else
  205. state <= checkModuleId;
  206. end if;
  207. -- is moduleId known?
  208. when checkModuleId =>
  209. validModuleId := '0';
  210. for i in integer range 0 to moduleCount-1 loop
  211. if inputStream = moduleIds(i) then
  212. validModuleId := '1';
  213. end if;
  214. end loop;
  215. if validModuleId = '0' then
  216. state <= waitPreamble;
  217. errorCode_s <= x"2";
  218. else
  219. csOutReset <= '0';
  220. moduleId <= inputStream;
  221. if outputWriteEnable = '1' then
  222. state <= writeHeader;
  223. csOutReset <= '0';
  224. else
  225. outputWriteReady <= '1';
  226. outputStream_s <= PREAMBLE;
  227. errorCode_s <= x"D";
  228. end if;
  229. end if;
  230. -- wait for data
  231. when writeHeader =>
  232. case outHeaderCounter is
  233. when 0 => outputStream_s <= datasetId;
  234. when others => outputStream_s <= moduleId;
  235. end case;
  236. if outHeaderCounter > 1 then
  237. state <= waitProcessing;
  238. muxStart <= '1';
  239. muxControlsFIFO <= '1';
  240. elsif outputWriteEnable = '0' then
  241. state <= writeHeader;
  242. errorCode_s <= x"C";
  243. outHeaderCounter <= outHeaderCounter;
  244. outputWriteReady <= '1';
  245. elsif outHeaderCounter < 1 then
  246. outHeaderCounter <= outHeaderCounter + 1;
  247. state <= writeHeader;
  248. outputWriteReady <= '1';
  249. outputStream_s <= moduleId;
  250. else
  251. state <= waitProcessing;
  252. muxStart <= '1';
  253. muxControlsFIFO <= '1';
  254. end if;
  255. when waitProcessing =>
  256. if(muxDone = '0') then
  257. state <= waitProcessing;
  258. muxControlsFIFO <= '1';
  259. errorCode_s <= x"B";
  260. muxStart <= '1';
  261. else
  262. state <= waitChecksum;
  263. inputReadReady <= '1';
  264. end if;
  265. when waitChecksum =>
  266. if inputReadEnable = '0' then
  267. errorCode_s <= x"A";
  268. state <= waitChecksum;
  269. inputReadReady <= '1';
  270. else
  271. state <= readChecksum;
  272. end if;
  273. when readChecksum =>
  274. state <= writeChecksum;
  275. when writeChecksum =>
  276. if outputWriteEnable = '1' then
  277. state <= waitPreamble;
  278. else
  279. state <= writeChecksum;
  280. outputWriteReady <= '1';
  281. end if;
  282. if(unsigned(csSum) = 0) then
  283. outputStream_s <= 0 - unsigned(csOutSum);
  284. else
  285. errorCode_s <= x"3";
  286. outputStream_s <= 1 - unsigned(csOutSum);
  287. end if;
  288. when others =>
  289. state <= waitPreamble;
  290. inputReadReady <= '0';
  291. end case;
  292. if signed(errorCode_s) > 0 then
  293. outputWriteReady <= '1';
  294. outputStream_s <= x"E330300" & errorCode_s;
  295. end if;
  296. muxSrcValid <= inputReadEnable;
  297. end if;
  298. end process;
  299. muxCtrl : process(muxControlsFIFO, outputWriteReady, inputReadReady, outputStream_s, muxDstValid, muxSrcReady, muxDstData, inputStream, outputFull, inputEmpty)
  300. begin
  301. if muxControlsFIFO = '0' then
  302. outputWriteEnable <= outputWriteReady and not outputFull;
  303. inputReadEnable <= inputReadReady and not inputEmpty;
  304. outputStream <= outputStream_s;
  305. muxSrcData <= (others => 'U');
  306. muxDstReady <= '0';
  307. else
  308. outputWriteEnable <= muxDstValid and not outputFull;
  309. inputReadEnable <= muxSrcReady and not inputEmpty;
  310. outputStream <= muxDstData;
  311. muxSrcData <= inputStream;
  312. muxDstReady <= not outputFull;
  313. end if;
  314. end process;
  315. sumInput : process(rst, clk) begin
  316. if rst = '0' then
  317. csEnable <= '0';
  318. elsif rising_edge(clk) then
  319. csEnable <= inputReadEnable;
  320. end if;
  321. end process;
  322. errorCode <= errorCode_s;
  323. stateOut <= std_logic_vector(conv_unsigned(state_t'POS(state), 4));
  324. outWrEn <= outputWriteEnable;
  325. inpRdEn <= inputReadEnable;
  326. outData <= outputStream;
  327. end Behavioral;