📄 addr_combo_rtl.vhd
字号:
------------------------------------------------------------------- Combinational address block for RTL Analyzer tutorial-- dependant on DATAPATH package------------------------------------------------------------------- Revision 1.3 1998/06/08 dannyb-- format---- Revision 1.2 1997/03/06 baldrik-- use datatypes---- Revision 1.1 1997/02/08 baldrik-- Initial revision-----------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;use work.DATAPATH.all;architecture rtl of addr_combo isconstant ADDRESS_width : natural := 32;subtype ADDRESS_TYPE is std_logic_vector(ADDRESS_width-1 downto 0);signal ADDRESS : ADDRESS_TYPE;signal TRANSFER_COUNT : CNT_TYPE;signal WORD_COUNT_read : CNT_TYPE;signal WORD_COUNT_write : CNT_TYPE;signal WORD_COUNT : CNT_TYPE;signal POINTER : POINT_TYPE;signal LOW : std_logic_vector(3 downto 0);signal DOUT_I : ADDRESS_TYPE;begin ADDR_PROC: process (BASE, INST_OFFSET, READ_OFFSET, WRITE_OFFSET, ENABLE_SELECT, LOW, WRITE_POINTER, READ_POINTER) begin case ENABLE_SELECT is when "001" => LOW <= INST_OFFSET(15 downto 12); ADDRESS(11 downto 0) <= INST_OFFSET(11 downto 0); when "101" => LOW <= WRITE_OFFSET(15 downto 12); ADDRESS(11 downto 0) <= WRITE_OFFSET(11 downto 0); when Others => LOW <= READ_OFFSET(15 downto 12); ADDRESS(11 downto 0) <= READ_OFFSET(11 downto 0); end case; ADDRESS(31 Downto 12) <= BASE + LOW; if ENABLE_SELECT="111" then POINTER <= WRITE_POINTER; else POINTER <= READ_POINTER; end if; end process ADDR_PROC; WORD_COUNT <= datapath( POINTER => POINTER, ADDR => ADDR); TCOUNT: process(WORD_COUNT, ENABLE_SELECT) begin if ((ENABLE_SELECT="001") or (ENABLE_SELECT="010") or (ENABLE_SELECT="100")) then TRANSFER_COUNT(10 downto 0) <= "00000000001"; else TRANSFER_COUNT(10 downto 0) <= WORD_COUNT; end if; end process TCOUNT; SEL_DOUT: process(ADDRESS, TRANSFER_COUNT, DOUT_SELECT ) begin if (DOUT_SELECT='1') then DOUT_I <= ADDRESS; else DOUT_I <= (others => '0'); DOUT_I(10 downto 0) <= TRANSFER_COUNT; end if; end process SEL_DOUT; -- tristate DOUT DOUT <= DOUT_I when BUS_ENABLE = '1' else (others => 'Z');end rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -