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.

337 lines
8.6 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. RngWait_o : out std_logic_vector(7 downto 0);
  66. RngRun_o : out std_logic_vector(7 downto 0);
  67. RngDataValid_i : in std_logic;
  68. RngData_i : in std_logic_vector(7 downto 0)
  69. );
  70. end component RaspiFpgaCtrlE;
  71. component FiRoCtrlE is
  72. generic (
  73. EXTRACT : boolean := true
  74. );
  75. port (
  76. --+ system if
  77. Clk_i : in std_logic;
  78. Reset_i : in std_logic;
  79. --+ ctrl/status
  80. Start_i : in std_logic;
  81. Wait_i : in std_logic_vector(7 downto 0);
  82. Run_i : in std_logic_vector(7 downto 0);
  83. --+ rnd data
  84. DataValid_o : out std_logic;
  85. Data_o : out std_logic_vector(7 downto 0);
  86. -- firo
  87. Run_o : out std_logic;
  88. Data_i : in std_logic
  89. );
  90. end component FiRoCtrlE;
  91. component FiRoE is
  92. generic (
  93. TOGGLE : boolean := true
  94. );
  95. port (
  96. FiRo_o : out std_logic;
  97. Run_i : in std_logic
  98. );
  99. end component FiRoE;
  100. --+ EFB SPI slave component
  101. component EfbSpiSlave is
  102. port (
  103. wb_clk_i : in std_logic;
  104. wb_rst_i : in std_logic;
  105. wb_cyc_i : in std_logic;
  106. wb_stb_i : in std_logic;
  107. wb_we_i : in std_logic;
  108. wb_adr_i : in std_logic_vector(7 downto 0);
  109. wb_dat_i : in std_logic_vector(7 downto 0);
  110. wb_dat_o : out std_logic_vector(7 downto 0);
  111. wb_ack_o : out std_logic;
  112. spi_clk : inout std_logic;
  113. spi_miso : inout std_logic;
  114. spi_mosi : inout std_logic;
  115. spi_scsn : in std_logic;
  116. spi_irq : out std_logic
  117. );
  118. end component EfbSpiSlave;
  119. --+ oscillator component
  120. component OSCH is
  121. generic (
  122. NOM_FREQ : string := "26.60"
  123. );
  124. port (
  125. STDBY : in std_logic;
  126. OSC : out std_logic;
  127. SEDSTDBY : out std_logic
  128. );
  129. end component OSCH;
  130. attribute NOM_FREQ : string;
  131. attribute NOM_FREQ of i_OSC : label is "26.60";
  132. --+ system signals
  133. signal s_sys_clk : std_logic;
  134. signal s_sys_rst : std_logic := '1';
  135. signal s_spi_sclk : std_logic;
  136. signal s_spi_miso : std_logic;
  137. signal s_spi_mosi : std_logic;
  138. --+ Wishbone bus signals
  139. signal s_wb_clk : std_logic;
  140. signal s_wb_rst : std_logic;
  141. signal s_wb_cyc : std_logic;
  142. signal s_wb_stb : std_logic;
  143. signal s_wb_we : std_logic;
  144. signal s_wb_adr : std_logic_vector(7 downto 0);
  145. signal s_wb_master_dat : std_logic_vector(7 downto 0);
  146. signal s_wb_slave_dat : std_logic_vector(7 downto 0);
  147. signal s_wb_ack : std_logic;
  148. --+ EFB signals
  149. signal s_efb_irq : std_logic;
  150. --+ Wishbone master signals
  151. signal s_local_wen : std_logic;
  152. signal s_local_ren : std_logic;
  153. signal s_local_adr : std_logic_vector(7 downto 0);
  154. signal s_local_read_data : std_logic_vector(7 downto 0);
  155. signal s_local_write_data : std_logic_vector(7 downto 0);
  156. signal s_local_ack : std_logic;
  157. --+ RNG signals
  158. signal s_rng_start : std_logic;
  159. signal s_rng_wait : std_logic_vector(7 downto 0);
  160. signal s_rng_run : std_logic_vector(7 downto 0);
  161. signal s_rng_data_valid : std_logic;
  162. signal s_rng_data : std_logic_vector(7 downto 0);
  163. signal s_firo_run : std_logic;
  164. signal s_firo_data : std_logic;
  165. begin
  166. --+ Oscillator instance
  167. --+ It's generating our 26.6 MHz system lock
  168. i_OSC : OSCH
  169. generic map (
  170. NOM_FREQ => "26.60"
  171. )
  172. port map (
  173. STDBY => '0',
  174. OSC => s_sys_clk,
  175. SEDSTDBY => open
  176. );
  177. s_wb_clk <= s_sys_clk;
  178. s_wb_rst <= not(s_sys_rst);
  179. ResetP : process (s_sys_clk) is
  180. variable v_clk_count : natural range 0 to 15 := 15;
  181. begin
  182. if(rising_edge(s_sys_clk)) then
  183. if(v_clk_count = 0) then
  184. s_sys_rst <= '1';
  185. else
  186. s_sys_rst <= '0';
  187. v_clk_count := v_clk_count - 1;
  188. end if;
  189. end if;
  190. end process ResetP;
  191. --+ EFB SPI slave instance
  192. i_EfbSpiSlave : EfbSpiSlave
  193. port map (
  194. wb_clk_i => s_wb_clk,
  195. wb_rst_i => s_wb_rst,
  196. wb_cyc_i => s_wb_cyc,
  197. wb_stb_i => s_wb_stb,
  198. wb_we_i => s_wb_we,
  199. wb_adr_i => s_wb_adr,
  200. wb_dat_i => s_wb_master_dat,
  201. wb_dat_o => s_wb_slave_dat,
  202. wb_ack_o => s_wb_ack,
  203. spi_clk => SpiSclk_i,
  204. spi_miso => SpiMiso_o,
  205. spi_mosi => SpiMosi_i,
  206. spi_scsn => SpiSte_i,
  207. spi_irq => s_efb_irq
  208. );
  209. i_WishBoneMasterE : WishBoneMasterE
  210. generic map (
  211. G_ADR_WIDTH => 8,
  212. G_DATA_WIDTH => 8
  213. )
  214. port map (
  215. --+ wishbone system if
  216. WbRst_i => s_wb_rst,
  217. WbClk_i => s_wb_clk,
  218. --+ wishbone outputs
  219. WbCyc_o => s_wb_cyc,
  220. WbStb_o => s_wb_stb,
  221. WbWe_o => s_wb_we,
  222. WbAdr_o => s_wb_adr,
  223. WbDat_o => s_wb_master_dat,
  224. --+ wishbone inputs
  225. WbDat_i => s_wb_slave_dat,
  226. WbAck_i => s_wb_ack,
  227. WbErr_i => '0',
  228. --+ local register if
  229. LocalWen_i => s_local_wen,
  230. LocalRen_i => s_local_ren,
  231. LocalAdress_i => s_local_adr,
  232. LocalData_i => s_local_write_data,
  233. LocalData_o => s_local_read_data,
  234. LocalAck_o => s_local_ack,
  235. LocalError_o => open
  236. );
  237. i_RaspiFpgaCtrlE : RaspiFpgaCtrlE
  238. port map (
  239. --+ System if
  240. Rst_n_i => s_sys_rst,
  241. Clk_i => s_sys_clk,
  242. --+ local register if
  243. LocalWen_o => s_local_wen,
  244. LocalRen_o => s_local_ren,
  245. LocalAdress_o => s_local_adr,
  246. LocalData_i => s_local_read_data,
  247. LocalData_o => s_local_write_data,
  248. LocalAck_i => s_local_ack,
  249. LocalError_i => '0',
  250. --+ EFB if
  251. EfbSpiIrq_i => s_efb_irq,
  252. --+ RNG if
  253. RngStart_o => s_rng_start,
  254. RngWait_o => s_rng_wait,
  255. RngRun_o => s_rng_run,
  256. RngDataValid_i => s_rng_data_valid,
  257. RngData_i => s_rng_data
  258. );
  259. i_FiRoCtrlE : FiRoCtrlE
  260. generic map (
  261. EXTRACT => true
  262. )
  263. port map (
  264. --+ system if
  265. Clk_i => s_sys_clk,
  266. Reset_i => s_sys_rst,
  267. --+ ctrl/status
  268. Start_i => s_rng_start,
  269. Wait_i => s_rng_wait,
  270. Run_i => s_rng_run,
  271. --+ rnd data
  272. DataValid_o => s_rng_data_valid,
  273. Data_o => s_rng_data,
  274. -- firo
  275. Run_o => s_firo_run,
  276. Data_i => s_firo_data
  277. );
  278. i_FiRoE : FiRoE
  279. generic map (
  280. TOGGLE => true
  281. )
  282. port map (
  283. FiRo_o => s_firo_data,
  284. Run_i => s_firo_run
  285. );
  286. RaspiIrq_o <= '0';
  287. end architecture rtl;