- added
git-svn-id: http://moon:8086/svn/vhdl/trunk@1258 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
@@ -0,0 +1,139 @@
|
|||||||
|
LIBRARY ieee;
|
||||||
|
use IEEE.STD_LOGIC_1164.ALL;
|
||||||
|
USE ieee.numeric_std.ALL;
|
||||||
|
|
||||||
|
LIBRARY altera_mf;
|
||||||
|
use altera_mf.altera_mf_components.sld_virtual_jtag;
|
||||||
|
|
||||||
|
LIBRARY work;
|
||||||
|
use work.utils_pkg.all;
|
||||||
|
|
||||||
|
ENTITY jtag_reg IS
|
||||||
|
GENERIC
|
||||||
|
(
|
||||||
|
INSTANCE_INDEX : natural := 0;
|
||||||
|
DATA_WIDTH : natural := 8; -- bits
|
||||||
|
ADDR_WIDTH : natural := 3 -- bits
|
||||||
|
);
|
||||||
|
PORT
|
||||||
|
(
|
||||||
|
rst : in std_logic;
|
||||||
|
clk : in std_logic;
|
||||||
|
addr_o : out unsigned (ADDR_WIDTH-1 downto 0);
|
||||||
|
reg_i : in unsigned (DATA_WIDTH-1 downto 0);
|
||||||
|
reg_o : out unsigned (DATA_WIDTH-1 downto 0);
|
||||||
|
we_o : out STD_LOGIC;
|
||||||
|
re_o : out STD_LOGIC
|
||||||
|
);
|
||||||
|
|
||||||
|
END jtag_reg;
|
||||||
|
|
||||||
|
ARCHITECTURE tech_alt OF jtag_reg IS
|
||||||
|
|
||||||
|
signal jvi_clk : STD_LOGIC;
|
||||||
|
signal jvi_tdi : STD_LOGIC;
|
||||||
|
signal jvi_tdo : STD_LOGIC;
|
||||||
|
|
||||||
|
signal jvi_ir : unsigned (ADDR_WIDTH downto 0);
|
||||||
|
signal ir_reg : unsigned (ADDR_WIDTH downto 0);
|
||||||
|
|
||||||
|
signal jvi_virtual_uir : STD_LOGIC;
|
||||||
|
signal jvi_virtual_sdr : STD_LOGIC;
|
||||||
|
signal jvi_virtual_cdr : STD_LOGIC;
|
||||||
|
signal jvi_virtual_udr : STD_LOGIC;
|
||||||
|
|
||||||
|
constant NUM_REGS : natural := 2**ADDR_WIDTH;
|
||||||
|
|
||||||
|
signal do_read : STD_LOGIC;
|
||||||
|
|
||||||
|
subtype reg_t is unsigned (DATA_WIDTH-1 downto 0);
|
||||||
|
subtype addr_t is unsigned (ADDR_WIDTH-1 downto 0);
|
||||||
|
|
||||||
|
signal addr : addr_t;
|
||||||
|
signal jvi_dr_dout_reg : reg_t;
|
||||||
|
signal jvi_dr_din_reg : reg_t;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
-- Virtual JTAG interface
|
||||||
|
inst_vjtag: component sld_virtual_jtag
|
||||||
|
generic map
|
||||||
|
(
|
||||||
|
sld_auto_instance_index => "NO",
|
||||||
|
sld_instance_index => INSTANCE_INDEX,
|
||||||
|
sld_ir_width => ADDR_WIDTH+1,
|
||||||
|
sld_sim_action => "((00000064,1,00000000,00000004))",
|
||||||
|
sld_sim_n_scan => 1,
|
||||||
|
sld_sim_total_length => 8,
|
||||||
|
lpm_type => "sld_virtual_jtag",
|
||||||
|
lpm_hint => "sld_virtual_jtag"
|
||||||
|
)
|
||||||
|
port map
|
||||||
|
(
|
||||||
|
-- JTAG signals
|
||||||
|
tck => jvi_clk,
|
||||||
|
tms => open,
|
||||||
|
tdo => jvi_tdo,
|
||||||
|
tdi => jvi_tdi,
|
||||||
|
|
||||||
|
-- Virtual instruction register
|
||||||
|
unsigned(ir_in) => jvi_ir,
|
||||||
|
ir_out => std_logic_vector(jvi_ir),
|
||||||
|
virtual_state_uir => jvi_virtual_uir,
|
||||||
|
virtual_state_cdr => jvi_virtual_cdr,
|
||||||
|
virtual_state_sdr => jvi_virtual_sdr,
|
||||||
|
virtual_state_udr => jvi_virtual_udr
|
||||||
|
);
|
||||||
|
|
||||||
|
jvi_tdo <= jvi_dr_dout_reg(0);
|
||||||
|
addr <= jvi_ir(ADDR_WIDTH-1 downto 0);
|
||||||
|
do_read <= not jvi_ir(ADDR_WIDTH);
|
||||||
|
|
||||||
|
addr_o <= addr;
|
||||||
|
reg_o <= jvi_dr_din_reg;
|
||||||
|
|
||||||
|
proc_din_shift:
|
||||||
|
process(jvi_clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(jvi_clk) then
|
||||||
|
if jvi_virtual_sdr = '1' then
|
||||||
|
jvi_dr_din_reg <= jvi_tdi & jvi_dr_din_reg(jvi_dr_din_reg'high downto 1);
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
proc_dout_shift:
|
||||||
|
process(jvi_clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(jvi_clk) then
|
||||||
|
if jvi_virtual_sdr = '1' then
|
||||||
|
jvi_dr_dout_reg <= '0' & jvi_dr_dout_reg(jvi_dr_dout_reg'high downto 1);
|
||||||
|
elsif do_read = '1' and jvi_virtual_cdr = '1' then
|
||||||
|
jvi_dr_dout_reg <= reg_i;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
proc_sync_we_o:
|
||||||
|
process(clk)
|
||||||
|
variable p : unsigned(1 downto 0);
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
we_o <= p(0) and not p(1);
|
||||||
|
p(1) := p(0);
|
||||||
|
p(0) := not do_read and jvi_virtual_udr;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
proc_sync_re_o:
|
||||||
|
process(clk)
|
||||||
|
variable p : unsigned(1 downto 0);
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
re_o <= p(0) and not p(1);
|
||||||
|
p(1) := p(0);
|
||||||
|
p(0) := do_read and jvi_virtual_udr;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
|
end tech_alt;
|
||||||
Reference in New Issue
Block a user