]> rtime.felk.cvut.cz Git - fpga/openmsp430.git/blob - top/top_8_32_mul_dbus/openMSP430_8_32_mul_dbus.vhd
New top module with external data bus
[fpga/openmsp430.git] / top / top_8_32_mul_dbus / openMSP430_8_32_mul_dbus.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
5
6
7 entity openMSP430_8_32_mul_dbus is
8   port (
9     -- Clocks and reset (low active)
10     dco_clk   : in  std_logic;
11     lfxt_clk  : in  std_logic;
12     reset_n   : in  std_logic;
13     -- RS232 interface
14     rxd       : in  std_logic;
15     txd       : out std_logic;
16     -- Periphery interface
17     per_addr  : out std_logic_vector (7 downto 0);
18     per_din   : out std_logic_vector (15 downto 0);
19     per_dout  : in  std_logic_vector (15 downto 0);
20     per_wen   : out std_logic_vector (1 downto 0);
21     per_en    : out std_logic;
22     nmi       : in  std_logic;
23     irq       : in  std_logic_vector (13 downto 0);
24     irq_acc   : out std_logic_vector (13 downto 0);
25     aclk_en   : out std_logic;
26     smclk_en  : out std_logic;
27     mclk      : out std_logic;
28     puc       : out std_logic;
29     -- Data bus
30     dmem_addr : out std_logic_vector (11 downto 0);
31     dmem_ce   : out std_logic;
32     dmem_we   : out std_logic;
33     dmem_din  : out std_logic_vector (15 downto 0);
34     dmem_dout : in  std_logic_vector (15 downto 0));
35 end entity openMSP430_8_32_mul_dbus;
36
37 --------------------------------------------------------------------------------
38
39 architecture rtl of openMSP430_8_32_mul_dbus is
40
41   component openMSP430 is
42     port(  
43       aclk_en       :  out std_logic;                        -- ACLK enable
44       dbg_freeze    :  out std_logic;                        -- Freeze peripherals
45       dbg_uart_txd  :  out std_logic;                        -- Debug interface: UART TXD
46       dmem_addr     :  out std_logic_vector;                 -- Data Memory address
47       dmem_cen      :  out std_logic;                        -- Data Memory chip enable (low active)
48       dmem_din      :  out std_logic_vector (15 downto 0);   -- Data Memory data input
49       dmem_wen      :  out std_logic_vector (1  downto 0);   -- Data Memory write enable (low active)
50       irq_acc       :  out std_logic_vector (13 downto 0);   -- Interrupt request accepted (one-hot signal)
51       mclk          :  out std_logic;                        -- Main system clock
52       per_addr      :  out std_logic_vector (7  downto 0);   -- Peripheral address
53       per_din       :  out std_logic_vector (15 downto 0);   -- Peripheral data input
54       per_wen       :  out std_logic_vector (1  downto 0);   -- Peripheral write enable (high active)
55       per_en        :  out std_logic;                        -- Peripheral enable (high active)
56       pmem_addr     :  out std_logic_vector;                 -- Program Memory address
57       pmem_cen      :  out std_logic;                        -- Program Memory chip enable (low active)
58       pmem_din      :  out std_logic_vector (15 downto 0);   -- Program Memory data input (optional)
59       pmem_wen      :  out std_logic_vector (1  downto 0);   -- Program Memory write enable (low active) (optional)
60       puc           :  out std_logic;                        -- Main system reset
61       smclk_en      :  out std_logic;                        -- SMCLK enable
62
63       dbg_uart_rxd  :  in  std_logic;                        -- Debug interface: UART RXD
64       dco_clk       :  in  std_logic;                        -- Fast oscillator (fast clock)
65       dmem_dout     :  in  std_logic_vector (15 downto 0);   -- Data Memory data output
66       irq           :  in  std_logic_vector (13 downto 0);   -- Maskable interrupts
67       lfxt_clk      :  in  std_logic;                        -- Low frequency oscillator (typ 32kHz)
68       nmi           :  in  std_logic;                        -- Non-maskable interrupt (asynchronous)
69       per_dout      :  in  std_logic_vector (15 downto 0);   -- Peripheral data output
70       pmem_dout     :  in  std_logic_vector (15 downto 0);   -- Program Memory data output
71       reset_n       :  in  std_logic                         -- Reset Pin (low active)
72       );
73   end component;
74
75
76   signal inner_dmem_addr : std_logic_vector (12 downto 0);
77   signal inner_dmem_cen  : std_logic;
78   signal inner_dmem_din  : std_logic_vector (15 downto 0);
79   signal inner_dmem_dout : std_logic_vector (15 downto 0);
80   signal inner_dmem_wen  : std_logic_vector (1 downto 0);
81
82   signal ram_dmem_cen  : std_logic;
83   signal mcu_dmem_dout : std_logic_vector (15 downto 0);
84   
85   signal dmem_mux : std_logic;
86   
87
88   signal pmem_addr : std_logic_vector (13 downto 0);
89   signal pmem_cen  : std_logic;
90   signal pmem_din  : std_logic_vector (15 downto 0);
91   signal pmem_dout : std_logic_vector (15 downto 0);
92   signal pmem_wen  : std_logic_vector (1 downto 0);
93
94   -- Inner signals used to connect built in components
95   signal inner_mclk : std_logic;
96   signal inner_puc  : std_logic;
97   
98   signal inner_per_addr : std_logic_vector (7 downto 0);
99   signal inner_per_din  : std_logic_vector (15 downto 0);
100   signal inner_per_dout : std_logic_vector (15 downto 0);
101   signal inner_per_wen  : std_logic_vector (1 downto 0);
102   signal inner_per_en   : std_logic;
103
104   signal inner_irq_acc : std_logic_vector (13 downto 0);
105   signal inner_irq     : std_logic_vector (13 downto 0);
106
107   -- RS232 interface
108   signal uart_dout : std_logic_vector (15 downto 0);
109   signal uart_irq  : std_logic;
110
111 --------------------------------------------------------------------------------
112
113 begin
114
115   -- Soft core
116   openMSP430_0 : openMSP430
117     port map (
118       aclk_en      => aclk_en,
119       dbg_freeze   => open,
120       dbg_uart_txd => open,
121       dmem_addr    => inner_dmem_addr,
122       dmem_cen     => inner_dmem_cen,
123       dmem_din     => inner_dmem_din,
124       dmem_wen     => inner_dmem_wen,
125       irq_acc      => inner_irq_acc,
126       mclk         => inner_mclk,
127       per_addr     => inner_per_addr,
128       per_din      => inner_per_din,
129       per_wen      => inner_per_wen,
130       per_en       => inner_per_en,
131       pmem_addr    => pmem_addr,
132       pmem_cen     => pmem_cen,
133       pmem_din     => open,
134       pmem_wen     => open,
135       puc          => inner_puc,
136       smclk_en     => smclk_en,
137
138       dbg_uart_rxd => '0',
139       dco_clk      => dco_clk,
140       dmem_dout    => mcu_dmem_dout,
141       irq          => inner_irq,
142       lfxt_clk     => lfxt_clk,
143       nmi          => nmi,
144       per_dout     => inner_per_dout,
145       pmem_dout    => pmem_dout,
146       reset_n      => reset_n);
147
148
149   -- Data memories
150   d_ram_hi : entity work.ram_generic
151     generic map (
152       BRAM_TYPE  => "RAMB16_S4",
153       SIZE       => 4*1024,
154       ADDR_WIDTH => 12,
155       DATA_WIDTH => 8,
156       NEG_EN     => true,
157       NEG_WE     => true)
158     port map (
159       clk  => inner_mclk,
160       addr => inner_dmem_addr (11 downto 0),
161       en   => ram_dmem_cen,
162       we   => inner_dmem_wen (1),
163       din  => inner_dmem_din (15 downto 8),
164       dout => inner_dmem_dout (15 downto 8));
165
166   d_ram_lo : entity work.ram_generic
167     generic map (
168       BRAM_TYPE  => "RAMB16_S4",
169       SIZE       => 4*1024,
170       ADDR_WIDTH => 12,
171       DATA_WIDTH => 8,
172       NEG_EN     => true,
173       NEG_WE     => true)
174     port map (
175       clk  => inner_mclk,
176       addr => inner_dmem_addr (11 downto 0),
177       en   => ram_dmem_cen,
178       we   => inner_dmem_wen (0),
179       din  => inner_dmem_din (7 downto 0),
180       dout => inner_dmem_dout (7 downto 0));
181
182   -- Program memories
183   p_ram_hi : entity work.ram_generic
184     generic map (
185       BRAM_TYPE  => "RAMB16_S2",
186       SIZE       => 16*1024,
187       ADDR_WIDTH => 14,
188       DATA_WIDTH => 8,
189       NEG_EN     => true)
190     port map (
191       clk  => inner_mclk,
192       addr => pmem_addr,
193       en   => pmem_cen,
194       we   => pmem_wen (1),
195       din  => pmem_din (15 downto 8),
196       dout => pmem_dout (15 downto 8));
197
198   p_ram_lo : entity work.ram_generic
199     generic map (
200       BRAM_TYPE  => "RAMB16_S2",
201       SIZE       => 16*1024,
202       ADDR_WIDTH => 14,
203       NEG_EN     => true)
204     port map (
205       clk  => inner_mclk,
206       addr => pmem_addr,
207       en   => pmem_cen,
208       we   => pmem_wen (0),
209       din  => pmem_din (7 downto 0),
210       dout => pmem_dout (7 downto 0));
211
212
213   -- RS232 periphery
214   uart_o : entity work.uart
215     port map (
216       mclk        => inner_mclk,
217       per_addr    => inner_per_addr,
218       per_din     => inner_per_din,
219       per_en      => inner_per_en,
220       per_wen     => inner_per_wen,
221       puc         => inner_puc,
222       per_irq_acc => '0',
223       per_irq     => uart_irq,
224       per_dout    => uart_dout,
225       rxd         => rxd,
226       txd         => txd);
227
228 --------------------------------------------------------------------------------
229
230   process (inner_mclk) is
231   begin
232     if rising_edge(inner_mclk) then
233       dmem_mux <= inner_dmem_addr (12);
234     end if;
235   end process;
236
237
238   mcu_dmem_dout <= inner_dmem_dout when dmem_mux = '0' else
239                    dmem_dout;
240
241   ram_dmem_cen <= inner_dmem_cen or inner_dmem_addr (12);
242
243   dmem_addr <= inner_dmem_addr (11 downto 0);
244   dmem_ce   <= (not inner_dmem_cen) and inner_dmem_addr (12);
245   dmem_we   <= '1' when inner_dmem_wen = "00" else '0';
246   dmem_din  <= inner_dmem_din;
247
248   
249   inner_per_dout <= uart_dout or per_dout;
250   
251   inner_irq <= irq;
252   --inner_irq (6) <= uart_irq;
253
254   irq_acc  <= inner_irq_acc;
255   mclk     <= inner_mclk;
256   per_addr <= inner_per_addr;
257   per_din  <= inner_per_din;
258   per_wen  <= inner_per_wen;
259   per_en   <= inner_per_en;
260   puc      <= inner_puc;
261
262 end rtl;
263