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