Advertisement
Guest User

xillybus

a guest
Aug 19th, 2015
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.00 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. use ieee.numeric_std.all;
  5.  
  6. entity xilly is
  7. port (
  8. PCIE_PERST_B_LS : IN std_logic;
  9. PCIE_REFCLK_N : IN std_logic;
  10. PCIE_REFCLK_P : IN std_logic;
  11. PCIE_RX_N : IN std_logic_vector(3 DOWNTO 0);
  12. PCIE_RX_P : IN std_logic_vector(3 DOWNTO 0);
  13. GPIO_LED : OUT std_logic_vector(3 DOWNTO 0);
  14. PCIE_TX_N : OUT std_logic_vector(3 DOWNTO 0);
  15. PCIE_TX_P : OUT std_logic_vector(3 DOWNTO 0);
  16.  
  17. in_data : IN std_logic_vector(31 downto 0);
  18. in_dval : IN std_logic;
  19. in_stop : OUT std_logic;
  20.  
  21. data_clock : IN std_logic;
  22. debug_button : IN std_logic
  23. );
  24. end xilly;
  25.  
  26. architecture sample_arch of xilly is
  27. component xillybus
  28. port (
  29. PCIE_PERST_B_LS : IN std_logic;
  30. PCIE_REFCLK_N : IN std_logic;
  31. PCIE_REFCLK_P : IN std_logic;
  32. PCIE_RX_N : IN std_logic_vector(3 DOWNTO 0);
  33. PCIE_RX_P : IN std_logic_vector(3 DOWNTO 0);
  34. GPIO_LED : OUT std_logic_vector(3 DOWNTO 0);
  35. PCIE_TX_N : OUT std_logic_vector(3 DOWNTO 0);
  36. PCIE_TX_P : OUT std_logic_vector(3 DOWNTO 0);
  37. bus_clk : OUT std_logic;
  38. quiesce : OUT std_logic;
  39. user_r_mem_8_rden : OUT std_logic;
  40. user_r_mem_8_empty : IN std_logic;
  41. user_r_mem_8_data : IN std_logic_vector(7 DOWNTO 0);
  42. user_r_mem_8_eof : IN std_logic;
  43. user_r_mem_8_open : OUT std_logic;
  44. user_w_mem_8_wren : OUT std_logic;
  45. user_w_mem_8_full : IN std_logic;
  46. user_w_mem_8_data : OUT std_logic_vector(7 DOWNTO 0);
  47. user_w_mem_8_open : OUT std_logic;
  48. user_mem_8_addr : OUT std_logic_vector(4 DOWNTO 0);
  49. user_mem_8_addr_update : OUT std_logic;
  50. user_r_read_32_rden : OUT std_logic;
  51. user_r_read_32_empty : IN std_logic;
  52. user_r_read_32_data : IN std_logic_vector(31 DOWNTO 0);
  53. user_r_read_32_eof : IN std_logic;
  54. user_r_read_32_open : OUT std_logic;
  55. user_r_read_8_rden : OUT std_logic;
  56. user_r_read_8_empty : IN std_logic;
  57. user_r_read_8_data : IN std_logic_vector(7 DOWNTO 0);
  58. user_r_read_8_eof : IN std_logic;
  59. user_r_read_8_open : OUT std_logic;
  60. user_w_write_32_wren : OUT std_logic;
  61. user_w_write_32_full : IN std_logic;
  62. user_w_write_32_data : OUT std_logic_vector(31 DOWNTO 0);
  63. user_w_write_32_open : OUT std_logic;
  64. user_w_write_8_wren : OUT std_logic;
  65. user_w_write_8_full : IN std_logic;
  66. user_w_write_8_data : OUT std_logic_vector(7 DOWNTO 0);
  67. user_w_write_8_open : OUT std_logic);
  68. end component;
  69.  
  70. component fifo_8x2048
  71. port (
  72. clk: IN std_logic;
  73. srst: IN std_logic;
  74. din: IN std_logic_VECTOR(7 downto 0);
  75. wr_en: IN std_logic;
  76. rd_en: IN std_logic;
  77. dout: OUT std_logic_VECTOR(7 downto 0);
  78. full: OUT std_logic;
  79. empty: OUT std_logic);
  80. end component;
  81.  
  82. component async_fifo_32
  83. port (
  84. rst : IN std_logic;
  85. wr_clk : IN std_logic;
  86. rd_clk : IN std_logic;
  87. din : IN std_logic_vector(31 downto 0);
  88. wr_en : IN std_logic;
  89. rd_en : IN std_logic;
  90. dout : OUT std_logic_vector(31 downto 0);
  91. full : OUT std_logic;
  92. empty : OUT std_logic);
  93. end component;
  94.  
  95. -- Synplicity black box declaration
  96. attribute syn_black_box : boolean;
  97. attribute syn_black_box of async_fifo_32: component is true;
  98. attribute syn_black_box of fifo_8x2048: component is true;
  99.  
  100. type demo_mem is array(0 TO 31) of std_logic_vector(7 DOWNTO 0);
  101. signal demoarray : demo_mem;
  102.  
  103. signal bus_clk : std_logic;
  104. signal quiesce : std_logic;
  105.  
  106. signal reset_8 : std_logic;
  107. signal reset_32 : std_logic;
  108.  
  109. signal ram_addr : integer range 0 to 31;
  110.  
  111. signal user_r_mem_8_rden : std_logic;
  112. signal user_r_mem_8_empty : std_logic;
  113. signal user_r_mem_8_data : std_logic_vector(7 DOWNTO 0);
  114. signal user_r_mem_8_eof : std_logic;
  115. signal user_r_mem_8_open : std_logic;
  116. signal user_w_mem_8_wren : std_logic;
  117. signal user_w_mem_8_full : std_logic;
  118. signal user_w_mem_8_data : std_logic_vector(7 DOWNTO 0);
  119. signal user_w_mem_8_open : std_logic;
  120. signal user_mem_8_addr : std_logic_vector(4 DOWNTO 0);
  121. signal user_mem_8_addr_update : std_logic;
  122. signal user_r_read_32_rden : std_logic;
  123. signal user_r_read_32_empty : std_logic;
  124. signal user_r_read_32_data : std_logic_vector(31 DOWNTO 0);
  125. signal user_r_read_32_eof : std_logic;
  126. signal user_r_read_32_open : std_logic;
  127. signal user_r_read_8_rden : std_logic;
  128. signal user_r_read_8_empty : std_logic;
  129. signal user_r_read_8_data : std_logic_vector(7 DOWNTO 0);
  130. signal user_r_read_8_eof : std_logic;
  131. signal user_r_read_8_open : std_logic;
  132. signal user_w_write_32_wren : std_logic;
  133. signal user_w_write_32_full : std_logic;
  134. signal user_w_write_32_data : std_logic_vector(31 DOWNTO 0);
  135. signal user_w_write_32_open : std_logic;
  136. signal user_w_write_8_wren : std_logic;
  137. signal user_w_write_8_full : std_logic;
  138. signal user_w_write_8_data : std_logic_vector(7 DOWNTO 0);
  139. signal user_w_write_8_open : std_logic;
  140.  
  141. --DATA CAPTURE SIGNALS
  142. signal capture_full : std_logic;
  143. signal capture_has_been_full : std_logic;
  144. signal capture_has_been_nonfull : std_logic;
  145. signal capture_open : std_logic;
  146. signal capture_open_cross : std_logic;
  147. signal has_been_full : std_logic;
  148. signal has_been_full_cross : std_logic;
  149. signal slowdown : std_logic_vector (4 downto 0);
  150. signal slowdown_is_zero : std_logic;
  151.  
  152. begin
  153. xillybus_ins : xillybus
  154. port map (
  155. -- Ports related to /dev/xillybus_mem_8
  156. -- FPGA to CPU signals:
  157. user_r_mem_8_rden => user_r_mem_8_rden,
  158. user_r_mem_8_empty => user_r_mem_8_empty,
  159. user_r_mem_8_data => user_r_mem_8_data,
  160. user_r_mem_8_eof => user_r_mem_8_eof,
  161. user_r_mem_8_open => user_r_mem_8_open,
  162. -- CPU to FPGA signals:
  163. user_w_mem_8_wren => user_w_mem_8_wren,
  164. user_w_mem_8_full => user_w_mem_8_full,
  165. user_w_mem_8_data => user_w_mem_8_data,
  166. user_w_mem_8_open => user_w_mem_8_open,
  167. -- Address signals:
  168. user_mem_8_addr => user_mem_8_addr,
  169. user_mem_8_addr_update => user_mem_8_addr_update,
  170.  
  171. -- Ports related to /dev/xillybus_read_32
  172. -- FPGA to CPU signals:
  173. user_r_read_32_rden => user_r_read_32_rden,
  174. user_r_read_32_empty => user_r_read_32_empty,
  175. user_r_read_32_data => user_r_read_32_data,
  176. user_r_read_32_eof => user_r_read_32_eof,
  177. user_r_read_32_open => user_r_read_32_open,
  178.  
  179. -- Ports related to /dev/xillybus_read_8
  180. -- FPGA to CPU signals:
  181. user_r_read_8_rden => user_r_read_8_rden,
  182. user_r_read_8_empty => user_r_read_8_empty,
  183. user_r_read_8_data => user_r_read_8_data,
  184. user_r_read_8_eof => user_r_read_8_eof,
  185. user_r_read_8_open => user_r_read_8_open,
  186.  
  187. -- Ports related to /dev/xillybus_write_32
  188. -- CPU to FPGA signals:
  189. user_w_write_32_wren => user_w_write_32_wren,
  190. user_w_write_32_full => user_w_write_32_full,
  191. user_w_write_32_data => user_w_write_32_data,
  192. user_w_write_32_open => user_w_write_32_open,
  193.  
  194. -- Ports related to /dev/xillybus_write_8
  195. -- CPU to FPGA signals:
  196. user_w_write_8_wren => user_w_write_8_wren,
  197. user_w_write_8_full => user_w_write_8_full,
  198. user_w_write_8_data => user_w_write_8_data,
  199. user_w_write_8_open => user_w_write_8_open,
  200.  
  201. -- General signals
  202. PCIE_PERST_B_LS => PCIE_PERST_B_LS,
  203. PCIE_REFCLK_N => PCIE_REFCLK_N,
  204. PCIE_REFCLK_P => PCIE_REFCLK_P,
  205. PCIE_RX_N => PCIE_RX_N,
  206. PCIE_RX_P => PCIE_RX_P,
  207. GPIO_LED => GPIO_LED,
  208. PCIE_TX_N => PCIE_TX_N,
  209. PCIE_TX_P => PCIE_TX_P,
  210. bus_clk => bus_clk,
  211. quiesce => quiesce
  212. );
  213.  
  214. -- A simple inferred RAM
  215.  
  216. ram_addr <= conv_integer(user_mem_8_addr);
  217.  
  218. process (bus_clk)
  219. begin
  220. if (bus_clk'event and bus_clk = '1') then
  221. if (user_w_mem_8_wren = '1') then
  222. demoarray(ram_addr) <= user_w_mem_8_data;
  223. end if;
  224. if (user_r_mem_8_rden = '1') then
  225. user_r_mem_8_data <= demoarray(ram_addr);
  226. end if;
  227. end if;
  228. end process;
  229.  
  230. user_r_mem_8_empty <= '0';
  231. user_r_mem_8_eof <= '0';
  232. user_w_mem_8_full <= '0';
  233.  
  234. process (data_clock)
  235. begin
  236. if (data_clock'event and data_clock = '1') then
  237. if ( capture_full = '0' ) then
  238. capture_has_been_nonfull <= '1' ;
  239. elsif ( capture_open = '0' ) then
  240. capture_has_been_nonfull <= '0' ;
  241. end if;
  242.  
  243. if ( capture_full = '1' and capture_has_been_nonfull = '1' ) then
  244. capture_has_been_full <= '1' ;
  245. elsif ( capture_open = '0' ) then
  246. capture_has_been_full <= '0' ;
  247. end if;
  248. end if;
  249. end process;
  250.  
  251. process (data_clock)
  252. begin
  253. if (data_clock'event and data_clock = '1') then
  254. capture_open_cross <= user_r_read_32_open ;
  255. capture_open <= capture_open_cross ;
  256. end if;
  257. end process;
  258.  
  259. process (bus_clk)
  260. begin
  261. if (bus_clk'event and bus_clk = '1') then
  262. has_been_full_cross <= capture_has_been_full ;
  263. has_been_full <= has_been_full_cross ;
  264. end if;
  265. end process;
  266.  
  267. fifo_32 : async_fifo_32
  268. port map(
  269. rst => reset_32,
  270. wr_clk => data_clock,
  271. rd_clk => bus_clk,
  272. din => in_data,
  273. wr_en => in_dval,
  274. rd_en => user_r_read_32_rden,
  275. dout => user_r_read_32_data,
  276. full => capture_full,
  277. empty => user_r_read_32_empty
  278. );
  279.  
  280. user_r_read_32_eof <= user_r_read_32_empty and has_been_full ;
  281. reset_32 <= not user_r_read_32_open;
  282. user_w_write_32_full <= '0';
  283.  
  284. in_stop <= capture_full;
  285. -- 8-bit loopback
  286.  
  287. fifo_8 : fifo_8x2048
  288. port map(
  289. clk => bus_clk,
  290. srst => reset_8,
  291. din => user_w_write_8_data,
  292. wr_en => user_w_write_8_wren,
  293. rd_en => user_r_read_8_rden,
  294. dout => user_r_read_8_data,
  295. full => user_w_write_8_full,
  296. empty => user_r_read_8_empty
  297. );
  298.  
  299. reset_8 <= not (user_w_write_8_open or user_r_read_8_open);
  300.  
  301. user_r_read_8_eof <= '0';
  302.  
  303. end sample_arch;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement