Guest User

Untitled

a guest
Apr 30th, 2012
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.13 KB | None | 0 0
  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.all;
  3. USE ieee.numeric_std.all;
  4.  
  5. -- Wishbone address decoder
  6.  
  7. ENTITY wb_dec is PORT (
  8. -- (partial) wishbone interface
  9.     clk:        IN std_logic;
  10.     rst:        IN std_logic;
  11.     wb_adr:     IN std_logic_vector(31 downto 0);
  12.     wb_cyc:     IN std_logic;
  13.  
  14.     cs_tdm_dsp0:    OUT std_logic;
  15.     cs_tdm_dsp1:    OUT std_logic;
  16.     cs_tdm_pri0:    OUT std_logic;
  17.     cs_tdm_pri1:    OUT std_logic;
  18.     cs_tdm_fourw:   OUT std_logic;
  19.     cs_tdm_fxs: OUT std_logic;
  20.     cs_tdm_fxo: OUT std_logic;
  21.     cs_dsp:     OUT std_logic;
  22.     cs_pri:     OUT std_logic;
  23.     cs_spi:     OUT std_logic;
  24.     cs_i2c:     OUT std_logic;
  25.     cs_ru:      OUT std_logic;
  26.     cs_flash:   OUT std_logic;
  27.     cs_regs:    OUT std_logic;
  28.     cs_avm:     OUT std_logic
  29.     );
  30. END wb_dec;
  31.  
  32. ARCHITECTURE a of wb_dec IS
  33.  
  34. -- wishbone peripheral address masks
  35. constant TDM_MASK_BITS: positive    := 5;
  36. constant REG_MASK_BITS: positive    := 8;
  37. constant AVM_MASK_BITS: positive    := 9;
  38. constant PRI_MASK_BITS: positive    := 12;
  39. constant SPI_MASK_BITS: positive    := 12;
  40. constant I2C_MASK_BITS: positive    := 12;
  41. constant RU_MASK_BITS: positive     := 12;
  42. constant DSP_MASK_BITS: positive    := 22;
  43. constant FLASH_MASK_BITS: positive  := 25;
  44.  
  45. -- bit positions in the cs_array slv
  46. constant CS_TDM0_BIT: natural       := 0;
  47. constant CS_TDM1_BIT: natural       := 1;
  48. constant CS_TDM2_BIT: natural       := 2;
  49. constant CS_TDM3_BIT: natural       := 3;
  50. constant CS_TDM4_BIT: natural       := 4;
  51. constant CS_TDM5_BIT: natural       := 5;
  52. constant CS_TDM6_BIT: natural       := 6;
  53. constant CS_REGS_BIT: natural       := 7;
  54. constant CS_AVM_BIT: natural        := 8;
  55. constant CS_PRI_BIT: natural        := 9;
  56. constant CS_SPI_BIT: natural        := 10;
  57. constant CS_I2C_BIT: natural        := 11;
  58. constant CS_RU_BIT: natural         := 12;
  59. constant CS_DSP_BIT: natural        := 13;
  60. constant CS_FLASH_BIT: natural      := 14;
  61.  
  62. signal cs_ary: std_logic_vector(14 downto 0);
  63.  
  64. -- there are a bunch of address areas to decode
  65. -- create a record which defines an area and a chip select bit to manipulate
  66. type decode_entry is record
  67.     base: std_logic_vector(31 downto 0);        -- base address
  68.     mask: positive;                             -- number of don't-care bits
  69.     cs: natural;                                -- which cs_bit in the cs array
  70. end record;
  71.  
  72. type decode_array is array(natural range <>) of decode_entry;
  73.  
  74. constant decode_map : decode_array := (
  75.     (x"00000000", TDM_MASK_BITS, CS_TDM0_BIT),      -- TDM0
  76.     (x"00000020", TDM_MASK_BITS, CS_TDM1_BIT),      -- TDM1
  77.     (x"00000040", TDM_MASK_BITS, CS_TDM2_BIT),      -- TDM2
  78.     (x"00000060", TDM_MASK_BITS, CS_TDM3_BIT),      -- TDM3
  79.     (x"00000080", TDM_MASK_BITS, CS_TDM4_BIT),      -- TDM4
  80.     (x"000000a0", TDM_MASK_BITS, CS_TDM5_BIT),      -- TDM5
  81.     (x"000000c0", TDM_MASK_BITS, CS_TDM6_BIT),      -- TDM6
  82.     (x"00000700", REG_MASK_BITS, CS_REGS_BIT),      -- ctm registers
  83.     (x"00000800", AVM_MASK_BITS, CS_AVM_BIT),       -- avalon master
  84.     (x"00002000", PRI_MASK_BITS, CS_PRI_BIT),       -- PRI framers
  85.     (x"00003000", SPI_MASK_BITS, CS_SPI_BIT),       -- SPI master
  86.     (x"00004000", I2C_MASK_BITS, CS_I2C_BIT),       -- I2C master
  87.     (x"00005000", RU_MASK_BITS, CS_RU_BIT),         -- remote update
  88.     (x"00400000", DSP_MASK_BITS, CS_DSP_BIT),       -- DSP
  89.     (x"02000000", FLASH_MASK_BITS, CS_FLASH_BIT)    -- flash
  90.     );
  91.    
  92. begin
  93.  
  94. -- combinatorial logic
  95.     cs_tdm_dsp0 <= cs_ary(CS_TDM0_BIT);
  96.     cs_tdm_dsp1 <= cs_ary(CS_TDM1_BIT);
  97.     cs_tdm_pri0 <= cs_ary(CS_TDM2_BIT);
  98.     cs_tdm_pri1 <= cs_ary(CS_TDM3_BIT);
  99.     cs_tdm_fourw <= cs_ary(CS_TDM4_BIT);
  100.     cs_tdm_fxs <= cs_ary(CS_TDM5_BIT);
  101.     cs_tdm_fxo <= cs_ary(CS_TDM6_BIT);
  102.     cs_dsp <= cs_ary(CS_DSP_BIT);
  103.     cs_pri <= cs_ary(CS_PRI_BIT);
  104.     cs_spi <= cs_ary(CS_SPI_BIT);
  105.     cs_i2c <= cs_ary(CS_I2C_BIT);
  106.     cs_ru <= cs_ary(CS_RU_BIT);
  107.     cs_flash <= cs_ary(CS_FLASH_BIT);
  108.     cs_regs <= cs_ary(CS_REGS_BIT);
  109.     cs_avm <= cs_ary(CS_AVM_BIT);
  110.    
  111.  
  112. wb_decode: process(wb_cyc, wb_adr)
  113.  
  114. function make_mask(addr: std_logic_vector; mbits:positive) return std_logic_vector is
  115.     variable m: std_logic_vector(addr'high downto addr'low);
  116. BEGIN
  117.     m := addr;
  118.     m(mbits - 1 downto m'low) := (others => '-');
  119.     return m;
  120. END function make_mask;
  121.  
  122. begin
  123.     cs_ary <= (OTHERS => '0');
  124.     if wb_cyc = '1' then
  125.         for i in decode_map'range loop
  126.             if std_match(wb_adr, make_mask(decode_map(i).base, decode_map(i).mask)) then
  127.                 cs_ary(decode_map(i).cs) <= '1';
  128.         end loop;
  129.     end if;
  130. end process;
  131. END ARCHITECTURE;
Advertisement
Add Comment
Please, Sign In to add comment