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.

263 lines
6.8 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. generic (
  50. G_ADR_WIDTH : positive := 8; --* address bus width
  51. G_DATA_WIDTH : positive := 8 --* data bus width
  52. );
  53. port (
  54. --+ System if
  55. Rst_n_i : in std_logic;
  56. Clk_i : in std_logic;
  57. --+ local register if
  58. LocalWen_o : out std_logic;
  59. LocalRen_o : out std_logic;
  60. LocalAdress_o : out std_logic_vector(G_ADR_WIDTH-1 downto 0);
  61. LocalData_i : in std_logic_vector(G_DATA_WIDTH-1 downto 0);
  62. LocalData_o : out std_logic_vector(G_DATA_WIDTH-1 downto 0);
  63. LocalAck_i : in std_logic;
  64. LocalError_i : in std_logic;
  65. --+ EFB if
  66. EfbSpiIrq_i : in std_logic
  67. );
  68. end component RaspiFpgaCtrlE;
  69. --+ EFB SPI slave component
  70. component EfbSpiSlave is
  71. port (
  72. wb_clk_i : in std_logic;
  73. wb_rst_i : in std_logic;
  74. wb_cyc_i : in std_logic;
  75. wb_stb_i : in std_logic;
  76. wb_we_i : in std_logic;
  77. wb_adr_i : in std_logic_vector(7 downto 0);
  78. wb_dat_i : in std_logic_vector(7 downto 0);
  79. wb_dat_o : out std_logic_vector(7 downto 0);
  80. wb_ack_o : out std_logic;
  81. spi_clk : inout std_logic;
  82. spi_miso : inout std_logic;
  83. spi_mosi : inout std_logic;
  84. spi_scsn : in std_logic;
  85. spi_irq : out std_logic
  86. );
  87. end component EfbSpiSlave;
  88. --+ oscillator component
  89. component OSCH is
  90. -- synthesis translate_off
  91. generic (
  92. NOM_FREQ : string := "26.60"
  93. );
  94. -- synthesis translate_on
  95. port (
  96. STDBY : in std_logic;
  97. OSC : out std_logic;
  98. SEDSTDBY : out std_logic
  99. );
  100. end component OSCH;
  101. attribute NOM_FREQ : string;
  102. attribute NOM_FREQ of i_OSC : label is "26.60";
  103. --+ system signals
  104. signal s_sys_clk : std_logic;
  105. signal s_sys_rst : std_logic := '1';
  106. signal s_spi_sclk : std_logic;
  107. signal s_spi_miso : std_logic;
  108. signal s_spi_mosi : std_logic;
  109. --+ Wishbone bus signals
  110. signal s_wb_clk : std_logic;
  111. signal s_wb_rst : std_logic;
  112. signal s_wb_cyc : std_logic;
  113. signal s_wb_stb : std_logic;
  114. signal s_wb_we : std_logic;
  115. signal s_wb_adr : std_logic_vector(7 downto 0);
  116. signal s_wb_master_dat : std_logic_vector(7 downto 0);
  117. signal s_wb_slave_dat : std_logic_vector(7 downto 0);
  118. signal s_wb_ack : std_logic;
  119. --+ EFB signals
  120. signal s_efb_irq : std_logic;
  121. --+ Wishbone master signals
  122. signal s_local_wen : std_logic;
  123. signal s_local_ren : std_logic;
  124. signal s_local_adr : std_logic_vector(7 downto 0);
  125. signal s_local_read_data : std_logic_vector(7 downto 0);
  126. signal s_local_write_data : std_logic_vector(7 downto 0);
  127. signal s_local_ack : std_logic;
  128. begin
  129. --+ Oscillator instance
  130. --+ It's generating our 26.6 MHz csystem lock
  131. i_OSC : OSCH
  132. -- synthesis off
  133. generic map (
  134. NOM_FREQ => "26.60"
  135. )
  136. -- synthesis on
  137. port map (
  138. STDBY => '0',
  139. OSC => s_sys_clk,
  140. SEDSTDBY => open
  141. );
  142. s_wb_clk <= s_sys_clk;
  143. s_wb_rst <= not(s_sys_rst);
  144. ResetP : process (s_sys_clk) is
  145. variable v_clk_count : natural range 0 to 15 := 15;
  146. begin
  147. if(rising_edge(s_sys_clk)) then
  148. if(v_clk_count = 0) then
  149. s_sys_rst <= '1';
  150. else
  151. s_sys_rst <= '0';
  152. v_clk_count := v_clk_count - 1;
  153. end if;
  154. end if;
  155. end process ResetP;
  156. --+ EFB SPI slave instance
  157. i_EfbSpiSlave : EfbSpiSlave
  158. port map (
  159. wb_clk_i => s_wb_clk,
  160. wb_rst_i => s_wb_rst,
  161. wb_cyc_i => s_wb_cyc,
  162. wb_stb_i => s_wb_stb,
  163. wb_we_i => s_wb_we,
  164. wb_adr_i => s_wb_adr,
  165. wb_dat_i => s_wb_master_dat,
  166. wb_dat_o => s_wb_slave_dat,
  167. wb_ack_o => s_wb_ack,
  168. spi_clk => SpiSclk_i,
  169. spi_miso => SpiMiso_o,
  170. spi_mosi => SpiMosi_i,
  171. spi_scsn => SpiSte_i,
  172. spi_irq => s_efb_irq
  173. );
  174. i_WishBoneMasterE : WishBoneMasterE
  175. generic map (
  176. G_ADR_WIDTH => 8,
  177. G_DATA_WIDTH => 8
  178. )
  179. port map (
  180. --+ wishbone system if
  181. WbRst_i => s_wb_clk,
  182. WbClk_i => s_wb_rst,
  183. --+ wishbone outputs
  184. WbCyc_o => s_wb_cyc,
  185. WbStb_o => s_wb_stb,
  186. WbWe_o => s_wb_we,
  187. WbAdr_o => s_wb_adr,
  188. WbDat_o => s_wb_master_dat,
  189. --+ wishbone inputs
  190. WbDat_i => s_wb_slave_dat,
  191. WbAck_i => s_wb_ack,
  192. WbErr_i => '0',
  193. --+ local register if
  194. LocalWen_i => s_local_wen,
  195. LocalRen_i => s_local_ren,
  196. LocalAdress_i => s_local_adr,
  197. LocalData_i => s_local_write_data,
  198. LocalData_o => s_local_read_data,
  199. LocalAck_o => s_local_ack,
  200. LocalError_o => open
  201. );
  202. i_RaspiFpgaCtrlE : RaspiFpgaCtrlE
  203. generic map (
  204. G_ADR_WIDTH => 8,
  205. G_DATA_WIDTH => 8
  206. )
  207. port map (
  208. --+ System if
  209. Rst_n_i => s_sys_rst,
  210. Clk_i => s_sys_clk,
  211. --+ local register if
  212. LocalWen_o => s_local_wen,
  213. LocalRen_o => s_local_ren,
  214. LocalAdress_o => s_local_adr,
  215. LocalData_i => s_local_read_data,
  216. LocalData_o => s_local_write_data,
  217. LocalAck_i => s_local_ack,
  218. LocalError_i => '0',
  219. --+ EFB if
  220. EfbSpiIrq_i => s_efb_irq
  221. );
  222. RaspiIrq_o <= '0';
  223. end architecture rtl;