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.

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