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.

257 lines
6.7 KiB

  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 : in std_logic;
  10. SpiSte_i : in std_logic;
  11. SpiMosi_i : in std_logic;
  12. SpiMiso_o : out 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 := "2.56"
  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. --+ Wishbone bus signals
  107. signal s_wb_clk : std_logic;
  108. signal s_wb_rst : std_logic;
  109. signal s_wb_cyc : std_logic;
  110. signal s_wb_stb : std_logic;
  111. signal s_wb_we : std_logic;
  112. signal s_wb_adr : std_logic_vector(7 downto 0);
  113. signal s_wb_master_dat : std_logic_vector(7 downto 0);
  114. signal s_wb_slave_dat : std_logic_vector(7 downto 0);
  115. signal s_wb_ack : std_logic;
  116. --+ EFB signals
  117. signal s_efb_irq : std_logic;
  118. --+ Wishbone master signals
  119. signal s_local_wen : std_logic;
  120. signal s_local_ren : std_logic;
  121. signal s_local_adr : std_logic_vector(7 downto 0);
  122. signal s_local_read_data : std_logic_vector(7 downto 0);
  123. signal s_local_write_data : std_logic_vector(7 downto 0);
  124. signal s_local_ack : std_logic;
  125. begin
  126. --+ Oscillator instance
  127. --+ It's generating our 26.6 MHz csystem lock
  128. i_OSC : OSCH
  129. -- synthesis off
  130. generic map (
  131. NOM_FREQ => "26.60"
  132. )
  133. -- syntheses on
  134. port map (
  135. STDBY => '0',
  136. OSC => s_sys_clk,
  137. SEDSTDBY => open
  138. );
  139. s_wb_clk <= s_sys_clk;
  140. s_wb_rst <= not(s_sys_rst);
  141. ResetP : process (s_sys_clk) is
  142. variable v_clk_count : natural range 0 to 15 := 15;
  143. begin
  144. if(rising_edge(s_sys_clk)) then
  145. if(v_clk_count = 0) then
  146. s_sys_rst <= '1';
  147. else
  148. s_sys_rst <= '0';
  149. v_clk_count := v_clk_count - 1;
  150. end if;
  151. end if;
  152. end process ResetP;
  153. --+ EFB SPI slave instance
  154. i_EfbSpiSlave : EfbSpiSlave
  155. port map (
  156. wb_clk_i => s_wb_clk,
  157. wb_rst_i => s_wb_rst,
  158. wb_cyc_i => s_wb_cyc,
  159. wb_stb_i => s_wb_stb,
  160. wb_we_i => s_wb_we,
  161. wb_adr_i => s_wb_adr,
  162. wb_dat_i => s_wb_master_dat,
  163. wb_dat_o => s_wb_slave_dat,
  164. wb_ack_o => s_wb_ack,
  165. spi_clk => SpiSclk_i,
  166. spi_miso => SpiMiso_o,
  167. spi_mosi => SpiMosi_i,
  168. spi_scsn => SpiSte_i,
  169. spi_irq => s_efb_irq
  170. );
  171. i_WishBoneMasterE : WishBoneMasterE
  172. generic map (
  173. G_ADR_WIDTH => 8,
  174. G_DATA_WIDTH => 8
  175. )
  176. port map (
  177. --+ wishbone system if
  178. WbRst_i => s_wb_clk,
  179. WbClk_i => s_wb_rst,
  180. --+ wishbone outputs
  181. WbCyc_o => s_wb_cyc,
  182. WbStb_o => s_wb_stb,
  183. WbWe_o => s_wb_we,
  184. WbAdr_o => s_wb_adr,
  185. WbDat_o => s_wb_master_dat,
  186. --+ wishbone inputs
  187. WbDat_i => s_wb_slave_dat,
  188. WbAck_i => s_wb_ack,
  189. WbErr_i => open,
  190. --+ local register if
  191. LocalWen_i => s_local_wen,
  192. LocalRen_i => s_local_ren,
  193. LocalAdress_i => s_local_adr,
  194. LocalData_i => s_local_write_data,
  195. LocalData_o => s_local_read_data,
  196. LocalAck_o => s_local_ack,
  197. LocalError_o => open
  198. );
  199. i_RaspiFpgaCtrlE : RaspiFpgaCtrlE
  200. generic map (
  201. G_ADR_WIDTH => 8,
  202. G_DATA_WIDTH => 8
  203. )
  204. port map (
  205. --+ System if
  206. Rst_n_i => s_sys_rst,
  207. Clk_i => s_sys_clk,
  208. --+ local register if
  209. LocalWen_o => s_local_wen,
  210. LocalRen_o => s_local_ren,
  211. LocalAdress_o => s_local_adr,
  212. LocalData_i => s_local_read_data,
  213. LocalData_o => s_local_write_data
  214. LocalAck_i => s_local_ack,
  215. LocalError_i => '0',
  216. --+ EFB if
  217. EfbSpiIrq_i => s_efb_irq
  218. );
  219. end architecture rtl;