Various projects using Raspberry Pi
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

323 lines
8.0 KiB

10 years ago
10 years ago
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. --library machxo2;
  5. -- use machxo2.components.all;
  6. entity RaspiFpgaE is
  7. port (
  8. --+ SPI slave if
  9. SpiSclk_i : inout std_logic;
  10. SpiSte_i : in std_logic;
  11. SpiMosi_i : inout std_logic;
  12. SpiMiso_o : inout std_logic;
  13. --* interrupt line to raspi
  14. RaspiIrq_o : out std_logic
  15. );
  16. end entity RaspiFpgaE;
  17. architecture rtl of RaspiFpgaE is
  18. --+ Wishbone master component
  19. component WishBoneMasterE is
  20. generic (
  21. G_ADR_WIDTH : positive := 8; --* address bus width
  22. G_DATA_WIDTH : positive := 8 --* data bus width
  23. );
  24. port (
  25. --+ wishbone system if
  26. WbRst_i : in std_logic;
  27. WbClk_i : in std_logic;
  28. --+ wishbone outputs
  29. WbCyc_o : out std_logic;
  30. WbStb_o : out std_logic;
  31. WbWe_o : out std_logic;
  32. WbAdr_o : out std_logic_vector(G_ADR_WIDTH-1 downto 0);
  33. WbDat_o : out std_logic_vector(G_DATA_WIDTH-1 downto 0);
  34. --+ wishbone inputs
  35. WbDat_i : in std_logic_vector(G_DATA_WIDTH-1 downto 0);
  36. WbAck_i : in std_logic;
  37. WbErr_i : in std_logic;
  38. --+ local register if
  39. LocalWen_i : in std_logic;
  40. LocalRen_i : in std_logic;
  41. LocalAdress_i : in std_logic_vector(G_ADR_WIDTH-1 downto 0);
  42. LocalData_i : in std_logic_vector(G_DATA_WIDTH-1 downto 0);
  43. LocalData_o : out std_logic_vector(G_DATA_WIDTH-1 downto 0);
  44. LocalAck_o : out std_logic;
  45. LocalError_o : out std_logic
  46. );
  47. end component WishBoneMasterE;
  48. component RaspiFpgaCtrlE is
  49. port (
  50. --+ System if
  51. Rst_n_i : in std_logic;
  52. Clk_i : in std_logic;
  53. --+ local register if
  54. LocalWen_o : out std_logic;
  55. LocalRen_o : out std_logic;
  56. LocalAdress_o : out std_logic_vector(7 downto 0);
  57. LocalData_i : in std_logic_vector(7 downto 0);
  58. LocalData_o : out std_logic_vector(7 downto 0);
  59. LocalAck_i : in std_logic;
  60. LocalError_i : in std_logic;
  61. --+ EFB if
  62. EfbSpiIrq_i : in std_logic;
  63. --+ RNG if
  64. RngStart_o : out std_logic;
  65. RngDataValid_i : in std_logic;
  66. RngData_i : in std_logic_vector(7 downto 0)
  67. );
  68. end component RaspiFpgaCtrlE;
  69. component FiRoCtrlE is
  70. generic (
  71. EXTRACT : boolean := true
  72. );
  73. port (
  74. --+ system if
  75. Clk_i : in std_logic;
  76. Reset_i : in std_logic;
  77. --+ ctrl/status
  78. Start_i : in std_logic;
  79. --+ rnd data
  80. DataValid_o : out std_logic;
  81. Data_o : out std_logic_vector(7 downto 0);
  82. -- firo
  83. Run_o : out std_logic;
  84. Data_i : in std_logic
  85. );
  86. end component FiRoCtrlE;
  87. component FiRoE is
  88. generic (
  89. TOGGLE : boolean := true
  90. );
  91. port (
  92. FiRo_o : out std_logic;
  93. Run_i : in std_logic
  94. );
  95. end component FiRoE;
  96. --+ EFB SPI slave component
  97. component EfbSpiSlave is
  98. port (
  99. wb_clk_i : in std_logic;
  100. wb_rst_i : in std_logic;
  101. wb_cyc_i : in std_logic;
  102. wb_stb_i : in std_logic;
  103. wb_we_i : in std_logic;
  104. wb_adr_i : in std_logic_vector(7 downto 0);
  105. wb_dat_i : in std_logic_vector(7 downto 0);
  106. wb_dat_o : out std_logic_vector(7 downto 0);
  107. wb_ack_o : out std_logic;
  108. spi_clk : inout std_logic;
  109. spi_miso : inout std_logic;
  110. spi_mosi : inout std_logic;
  111. spi_scsn : in std_logic;
  112. spi_irq : out std_logic
  113. );
  114. end component EfbSpiSlave;
  115. --+ oscillator component
  116. component OSCH is
  117. generic (
  118. NOM_FREQ : string := "26.60"
  119. );
  120. port (
  121. STDBY : in std_logic;
  122. OSC : out std_logic;
  123. SEDSTDBY : out std_logic
  124. );
  125. end component OSCH;
  126. attribute NOM_FREQ : string;
  127. attribute NOM_FREQ of i_OSC : label is "26.60";
  128. --+ system signals
  129. signal s_sys_clk : std_logic;
  130. signal s_sys_rst : std_logic := '1';
  131. signal s_spi_sclk : std_logic;
  132. signal s_spi_miso : std_logic;
  133. signal s_spi_mosi : std_logic;
  134. --+ Wishbone bus signals
  135. signal s_wb_clk : std_logic;
  136. signal s_wb_rst : std_logic;
  137. signal s_wb_cyc : std_logic;
  138. signal s_wb_stb : std_logic;
  139. signal s_wb_we : std_logic;
  140. signal s_wb_adr : std_logic_vector(7 downto 0);
  141. signal s_wb_master_dat : std_logic_vector(7 downto 0);
  142. signal s_wb_slave_dat : std_logic_vector(7 downto 0);
  143. signal s_wb_ack : std_logic;
  144. --+ EFB signals
  145. signal s_efb_irq : std_logic;
  146. --+ Wishbone master signals
  147. signal s_local_wen : std_logic;
  148. signal s_local_ren : std_logic;
  149. signal s_local_adr : std_logic_vector(7 downto 0);
  150. signal s_local_read_data : std_logic_vector(7 downto 0);
  151. signal s_local_write_data : std_logic_vector(7 downto 0);
  152. signal s_local_ack : std_logic;
  153. --+ RNG signals
  154. signal s_rng_start : std_logic;
  155. signal s_rng_data_valid : std_logic;
  156. signal s_rng_data : std_logic_vector(7 downto 0);
  157. signal s_firo_run : std_logic;
  158. signal s_firo_data : std_logic;
  159. begin
  160. --+ Oscillator instance
  161. --+ It's generating our 26.6 MHz system lock
  162. i_OSC : OSCH
  163. generic map (
  164. NOM_FREQ => "26.60"
  165. )
  166. port map (
  167. STDBY => '0',
  168. OSC => s_sys_clk,
  169. SEDSTDBY => open
  170. );
  171. s_wb_clk <= s_sys_clk;
  172. s_wb_rst <= not(s_sys_rst);
  173. ResetP : process (s_sys_clk) is
  174. variable v_clk_count : natural range 0 to 15 := 15;
  175. begin
  176. if(rising_edge(s_sys_clk)) then
  177. if(v_clk_count = 0) then
  178. s_sys_rst <= '1';
  179. else
  180. s_sys_rst <= '0';
  181. v_clk_count := v_clk_count - 1;
  182. end if;
  183. end if;
  184. end process ResetP;
  185. --+ EFB SPI slave instance
  186. i_EfbSpiSlave : EfbSpiSlave
  187. port map (
  188. wb_clk_i => s_wb_clk,
  189. wb_rst_i => s_wb_rst,
  190. wb_cyc_i => s_wb_cyc,
  191. wb_stb_i => s_wb_stb,
  192. wb_we_i => s_wb_we,
  193. wb_adr_i => s_wb_adr,
  194. wb_dat_i => s_wb_master_dat,
  195. wb_dat_o => s_wb_slave_dat,
  196. wb_ack_o => s_wb_ack,
  197. spi_clk => SpiSclk_i,
  198. spi_miso => SpiMiso_o,
  199. spi_mosi => SpiMosi_i,
  200. spi_scsn => SpiSte_i,
  201. spi_irq => s_efb_irq
  202. );
  203. i_WishBoneMasterE : WishBoneMasterE
  204. generic map (
  205. G_ADR_WIDTH => 8,
  206. G_DATA_WIDTH => 8
  207. )
  208. port map (
  209. --+ wishbone system if
  210. WbRst_i => s_wb_rst,
  211. WbClk_i => s_wb_clk,
  212. --+ wishbone outputs
  213. WbCyc_o => s_wb_cyc,
  214. WbStb_o => s_wb_stb,
  215. WbWe_o => s_wb_we,
  216. WbAdr_o => s_wb_adr,
  217. WbDat_o => s_wb_master_dat,
  218. --+ wishbone inputs
  219. WbDat_i => s_wb_slave_dat,
  220. WbAck_i => s_wb_ack,
  221. WbErr_i => '0',
  222. --+ local register if
  223. LocalWen_i => s_local_wen,
  224. LocalRen_i => s_local_ren,
  225. LocalAdress_i => s_local_adr,
  226. LocalData_i => s_local_write_data,
  227. LocalData_o => s_local_read_data,
  228. LocalAck_o => s_local_ack,
  229. LocalError_o => open
  230. );
  231. i_RaspiFpgaCtrlE : RaspiFpgaCtrlE
  232. port map (
  233. --+ System if
  234. Rst_n_i => s_sys_rst,
  235. Clk_i => s_sys_clk,
  236. --+ local register if
  237. LocalWen_o => s_local_wen,
  238. LocalRen_o => s_local_ren,
  239. LocalAdress_o => s_local_adr,
  240. LocalData_i => s_local_read_data,
  241. LocalData_o => s_local_write_data,
  242. LocalAck_i => s_local_ack,
  243. LocalError_i => '0',
  244. --+ EFB if
  245. EfbSpiIrq_i => s_efb_irq
  246. );
  247. i_FiRoCtrlE : FiRoCtrlE
  248. generic map (
  249. EXTRACT => true
  250. )
  251. port map (
  252. --+ system if
  253. Clk_i => s_sys_clk,
  254. Reset_i => s_sys_rst,
  255. --+ ctrl/status
  256. Start_i => s_rng_start,
  257. --+ rnd data
  258. DataValid_o => s_rng_data_valid,
  259. Data_o => s_rng_data,
  260. -- firo
  261. Run_o => s_firo_run,
  262. Data_i => s_firo_data
  263. );
  264. i_FiRoE : FiRoE
  265. generic map (
  266. TOGGLE => true
  267. )
  268. port map (
  269. FiRo_o => s_firo_data,
  270. Run_i => s_firo_run
  271. );
  272. RaspiIrq_o <= '0';
  273. end architecture rtl;