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.

265 lines
6.9 KiB

10 years ago
10 years ago
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 : 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. 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. -- syntheses 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. s_spi_sclk <= SpiSclk_i;
  157. s_spi_miso <= SpiSte_i;
  158. s_spi_mosi <= SpiMosi_i;
  159. --+ EFB SPI slave instance
  160. i_EfbSpiSlave : EfbSpiSlave
  161. port map (
  162. wb_clk_i => s_wb_clk,
  163. wb_rst_i => s_wb_rst,
  164. wb_cyc_i => s_wb_cyc,
  165. wb_stb_i => s_wb_stb,
  166. wb_we_i => s_wb_we,
  167. wb_adr_i => s_wb_adr,
  168. wb_dat_i => s_wb_master_dat,
  169. wb_dat_o => s_wb_slave_dat,
  170. wb_ack_o => s_wb_ack,
  171. spi_clk => s_spi_sclk,
  172. spi_miso => s_spi_miso,
  173. spi_mosi => s_spi_mosi,
  174. spi_scsn => SpiSte_i,
  175. spi_irq => s_efb_irq
  176. );
  177. i_WishBoneMasterE : WishBoneMasterE
  178. generic map (
  179. G_ADR_WIDTH => 8,
  180. G_DATA_WIDTH => 8
  181. )
  182. port map (
  183. --+ wishbone system if
  184. WbRst_i => s_wb_clk,
  185. WbClk_i => s_wb_rst,
  186. --+ wishbone outputs
  187. WbCyc_o => s_wb_cyc,
  188. WbStb_o => s_wb_stb,
  189. WbWe_o => s_wb_we,
  190. WbAdr_o => s_wb_adr,
  191. WbDat_o => s_wb_master_dat,
  192. --+ wishbone inputs
  193. WbDat_i => s_wb_slave_dat,
  194. WbAck_i => s_wb_ack,
  195. WbErr_i => open,
  196. --+ local register if
  197. LocalWen_i => s_local_wen,
  198. LocalRen_i => s_local_ren,
  199. LocalAdress_i => s_local_adr,
  200. LocalData_i => s_local_write_data,
  201. LocalData_o => s_local_read_data,
  202. LocalAck_o => s_local_ack,
  203. LocalError_o => open
  204. );
  205. i_RaspiFpgaCtrlE : RaspiFpgaCtrlE
  206. generic map (
  207. G_ADR_WIDTH => 8,
  208. G_DATA_WIDTH => 8
  209. )
  210. port map (
  211. --+ System if
  212. Rst_n_i => s_sys_rst,
  213. Clk_i => s_sys_clk,
  214. --+ local register if
  215. LocalWen_o => s_local_wen,
  216. LocalRen_o => s_local_ren,
  217. LocalAdress_o => s_local_adr,
  218. LocalData_i => s_local_read_data,
  219. LocalData_o => s_local_write_data,
  220. LocalAck_i => s_local_ack,
  221. LocalError_i => '0',
  222. --+ EFB if
  223. EfbSpiIrq_i => s_efb_irq
  224. );
  225. end architecture rtl;