git-svn-id: http://moon:8086/svn/vhdl/trunk@1258 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2015-05-29 19:16:53 +00:00
parent 9b65c9429e
commit ae98d5f2d3
+139
View File
@@ -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;