📄 jtag_uart.vhd
字号:
-- lpm_hint => "RAM_BLOCK_TYPE=AUTO",
-- lpm_numwords => 64,
-- lpm_showahead => "OFF",
-- lpm_type => "scfifo",
-- lpm_width => 8,
-- lpm_widthu => 6,
-- overflow_checking => "OFF",
-- underflow_checking => "OFF",
-- use_eab => "ON"
-- )
-- port map(
-- clock => clk,
-- data => t_dat,
-- empty => internal_fifo_EF,
-- full => internal_rfifo_full,
-- q => internal_fifo_rdata,
-- rdreq => fifo_rd,
-- usedw => internal_rfifo_used,
-- wrreq => wr_rfifo
-- );
--
--synthesis read_comments_as_HDL off
end europa;
library altera_mf;
use altera_mf.all;
library altera_vhdl_support;
use altera_vhdl_support.altera_vhdl_support_lib.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library lpm;
use lpm.all;
entity jtag_uart is
port (
-- inputs:
signal av_address : IN STD_LOGIC;
signal av_chipselect : IN STD_LOGIC;
signal av_read_n : IN STD_LOGIC;
signal av_write_n : IN STD_LOGIC;
signal av_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
signal clk : IN STD_LOGIC;
signal rst_n : IN STD_LOGIC;
-- outputs:
signal av_irq : OUT STD_LOGIC;
signal av_readdata : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
signal av_waitrequest : OUT STD_LOGIC;
signal dataavailable : OUT STD_LOGIC;
signal readyfordata : OUT STD_LOGIC
);
end entity jtag_uart;
architecture europa of jtag_uart is
component jtag_uart_scfifo_w is
port (
-- inputs:
signal clk : IN STD_LOGIC;
signal fifo_wdata : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
signal fifo_wr : IN STD_LOGIC;
signal rd_wfifo : IN STD_LOGIC;
-- outputs:
signal fifo_FF : OUT STD_LOGIC;
signal r_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
signal wfifo_empty : OUT STD_LOGIC;
signal wfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0)
);
end component jtag_uart_scfifo_w;
component jtag_uart_scfifo_r is
port (
-- inputs:
signal clk : IN STD_LOGIC;
signal fifo_rd : IN STD_LOGIC;
signal rst_n : IN STD_LOGIC;
signal t_dat : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
signal wr_rfifo : IN STD_LOGIC;
-- outputs:
signal fifo_EF : OUT STD_LOGIC;
signal fifo_rdata : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
signal rfifo_full : OUT STD_LOGIC;
signal rfifo_used : OUT STD_LOGIC_VECTOR (5 DOWNTO 0)
);
end component jtag_uart_scfifo_r;
--synthesis read_comments_as_HDL on
-- component alt_jtag_atlantic is
--GENERIC (
-- INSTANCE_ID : NATURAL;
-- LOG2_RXFIFO_DEPTH : NATURAL;
-- LOG2_TXFIFO_DEPTH : NATURAL
-- );
-- PORT (
-- signal r_ena : OUT STD_LOGIC;
-- signal t_dat : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
-- signal t_ena : OUT STD_LOGIC;
-- signal t_pause : OUT STD_LOGIC;
-- signal clk : IN STD_LOGIC;
-- signal r_dat : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
-- signal r_val : IN STD_LOGIC;
-- signal rst_n : IN STD_LOGIC;
-- signal t_dav : IN STD_LOGIC
-- );
-- end component alt_jtag_atlantic;
--synthesis read_comments_as_HDL off
signal ac : STD_LOGIC;
signal activity : STD_LOGIC;
signal fifo_AE : STD_LOGIC;
signal fifo_AF : STD_LOGIC;
signal fifo_EF : STD_LOGIC;
signal fifo_FF : STD_LOGIC;
signal fifo_rd : STD_LOGIC;
signal fifo_rdata : STD_LOGIC_VECTOR (7 DOWNTO 0);
signal fifo_wdata : STD_LOGIC_VECTOR (7 DOWNTO 0);
signal fifo_wr : STD_LOGIC;
signal ien_AE : STD_LOGIC;
signal ien_AF : STD_LOGIC;
signal internal_av_waitrequest : STD_LOGIC;
signal ipen_AE : STD_LOGIC;
signal ipen_AF : STD_LOGIC;
signal pause_irq : STD_LOGIC;
signal r_dat : STD_LOGIC_VECTOR (7 DOWNTO 0);
signal r_ena : STD_LOGIC;
signal r_val : STD_LOGIC;
signal rd_wfifo : STD_LOGIC;
signal read_0 : STD_LOGIC;
signal rfifo_full : STD_LOGIC;
signal rfifo_used : STD_LOGIC_VECTOR (5 DOWNTO 0);
signal rvalid : STD_LOGIC;
signal t_dat : STD_LOGIC_VECTOR (7 DOWNTO 0);
signal t_dav : STD_LOGIC;
signal t_ena : STD_LOGIC;
signal t_pause : STD_LOGIC;
signal wfifo_empty : STD_LOGIC;
signal wfifo_used : STD_LOGIC_VECTOR (5 DOWNTO 0);
signal woverflow : STD_LOGIC;
signal wr_rfifo : STD_LOGIC;
begin
rd_wfifo <= r_ena AND NOT wfifo_empty;
wr_rfifo <= t_ena AND NOT rfifo_full;
the_jtag_uart_scfifo_w : jtag_uart_scfifo_w
port map(
fifo_FF => fifo_FF,
r_dat => r_dat,
wfifo_empty => wfifo_empty,
wfifo_used => wfifo_used,
clk => clk,
fifo_wdata => fifo_wdata,
fifo_wr => fifo_wr,
rd_wfifo => rd_wfifo
);
the_jtag_uart_scfifo_r : jtag_uart_scfifo_r
port map(
fifo_EF => fifo_EF,
fifo_rdata => fifo_rdata,
rfifo_full => rfifo_full,
rfifo_used => rfifo_used,
clk => clk,
fifo_rd => fifo_rd,
rst_n => rst_n,
t_dat => t_dat,
wr_rfifo => wr_rfifo
);
ipen_AE <= ien_AE AND fifo_AE;
ipen_AF <= ien_AF AND ((pause_irq OR fifo_AF));
av_irq <= ipen_AE OR ipen_AF;
activity <= t_pause OR t_ena;
process (clk, rst_n)
begin
if rst_n = '0' then
pause_irq <= std_logic'('0');
elsif clk'event and clk = '1' then
-- only if fifo is not empty...
if std_logic'((t_pause AND NOT fifo_EF)) = '1' then
pause_irq <= std_logic'('1');
elsif std_logic'(read_0) = '1' then
pause_irq <= std_logic'('0');
end if;
end if;
end process;
process (clk, rst_n)
begin
if rst_n = '0' then
r_val <= std_logic'('0');
t_dav <= std_logic'('1');
elsif clk'event and clk = '1' then
r_val <= r_ena AND NOT wfifo_empty;
t_dav <= NOT rfifo_full;
end if;
end process;
process (clk, rst_n)
begin
if rst_n = '0' then
fifo_AE <= std_logic'('0');
fifo_AF <= std_logic'('0');
fifo_wr <= std_logic'('0');
rvalid <= std_logic'('0');
read_0 <= std_logic'('0');
ien_AE <= std_logic'('0');
ien_AF <= std_logic'('0');
ac <= std_logic'('0');
woverflow <= std_logic'('0');
internal_av_waitrequest <= std_logic'('1');
elsif clk'event and clk = '1' then
fifo_AE <= to_std_logic(((std_logic_vector'("0000000000000000000000000") & (Std_Logic_Vector'(A_ToStdLogicVector(fifo_FF) & wfifo_used)))<=std_logic_vector'("00000000000000000000000000001000")));
fifo_AF <= to_std_logic(((std_logic_vector'("000000000000000000000000") & (((std_logic_vector'("01000000") - (std_logic_vector'("0") & (Std_Logic_Vector'(A_ToStdLogicVector(rfifo_full) & rfifo_used)))))))<=std_logic_vector'("00000000000000000000000000001000")));
fifo_wr <= std_logic'('0');
read_0 <= std_logic'('0');
internal_av_waitrequest <= NOT (((av_chipselect AND ((NOT av_write_n OR NOT av_read_n))) AND internal_av_waitrequest));
if std_logic'(activity) = '1' then
ac <= std_logic'('1');
end if;
-- write
if std_logic'(((av_chipselect AND NOT av_write_n) AND internal_av_waitrequest)) = '1' then
-- addr 1 is control; addr 0 is data
if std_logic'(av_address) = '1' then
ien_AF <= av_writedata(0);
ien_AE <= av_writedata(1);
if std_logic'((av_writedata(10) AND NOT activity)) = '1' then
ac <= std_logic'('0');
end if;
else
fifo_wr <= NOT fifo_FF;
woverflow <= fifo_FF;
end if;
end if;
-- read
if std_logic'(((av_chipselect AND NOT av_read_n) AND internal_av_waitrequest)) = '1' then
-- addr 1 is interrupt; addr 0 is data
if std_logic'(NOT av_address) = '1' then
rvalid <= NOT fifo_EF;
end if;
read_0 <= NOT av_address;
end if;
end if;
end process;
fifo_wdata <= av_writedata(7 DOWNTO 0);
fifo_rd <= A_WE_StdLogic((std_logic'(((((av_chipselect AND NOT av_read_n) AND internal_av_waitrequest) AND NOT av_address))) = '1'), NOT fifo_EF, std_logic'('0'));
av_readdata <= A_EXT (A_WE_StdLogicVector((std_logic'(read_0) = '1'), (std_logic_vector'("0") & ((A_REP(std_logic'('0'), 9) & A_ToStdLogicVector(rfifo_full) & rfifo_used & A_ToStdLogicVector(rvalid) & A_ToStdLogicVector(woverflow) & A_ToStdLogicVector(NOT fifo_FF) & A_ToStdLogicVector(NOT fifo_EF) & A_ToStdLogicVector(std_logic'('0')) & A_ToStdLogicVector(ac) & A_ToStdLogicVector(ipen_AE) & A_ToStdLogicVector(ipen_AF) & fifo_rdata))), (A_REP(std_logic'('0'), 9) & ((std_logic_vector'("01000000") - (std_logic_vector'("0") & (Std_Logic_Vector'(A_ToStdLogicVector(fifo_FF) & wfifo_used))))) & A_ToStdLogicVector(rvalid) & A_ToStdLogicVector(woverflow) & A_ToStdLogicVector(NOT fifo_FF) & A_ToStdLogicVector(NOT fifo_EF) & A_ToStdLogicVector(std_logic'('0')) & A_ToStdLogicVector(ac) & A_ToStdLogicVector(ipen_AE) & A_ToStdLogicVector(ipen_AF) & A_REP(std_logic'('0'), 6) & A_ToStdLogicVector(ien_AE) & A_ToStdLogicVector(ien_AF))), 32);
process (clk, rst_n)
begin
if rst_n = '0' then
readyfordata <= std_logic'('0');
elsif clk'event and clk = '1' then
if (std_logic_vector'("00000000000000000000000000000001")) /= std_logic_vector'("00000000000000000000000000000000") then
readyfordata <= NOT fifo_FF;
end if;
end if;
end process;
--vhdl renameroo for output signals
av_waitrequest <= internal_av_waitrequest;
--exemplar translate_off
-- Tie off Atlantic Interface signals not used for simulation
process (clk)
begin
if clk'event and clk = '1' then
t_pause <= std_logic'('0');
t_ena <= std_logic'('0');
t_dat <= A_WE_StdLogicVector((std_logic'(t_dav) = '1'), r_dat, A_REP(r_val, 8));
r_ena <= std_logic'('0');
end if;
end process;
process (fifo_EF)
begin
if (std_logic_vector'("00000000000000000000000000000001")) /= std_logic_vector'("00000000000000000000000000000000") then
dataavailable <= NOT fifo_EF;
end if;
end process;
--exemplar translate_on
--synthesis read_comments_as_HDL on
-- jtag_uart_alt_jtag_atlantic : alt_jtag_atlantic
-- generic map(
-- INSTANCE_ID => 0,
-- LOG2_RXFIFO_DEPTH => 6,
-- LOG2_TXFIFO_DEPTH => 6
-- )
-- port map(
-- clk => clk,
-- r_dat => r_dat,
-- r_ena => r_ena,
-- r_val => r_val,
-- rst_n => rst_n,
-- t_dat => t_dat,
-- t_dav => t_dav,
-- t_ena => t_ena,
-- t_pause => t_pause
-- );
--
-- process (clk, rst_n)
-- begin
-- if rst_n = '0' then
-- dataavailable <= std_logic'('0');
-- elsif clk'event and clk = '1' then
-- if (std_logic_vector'("00000000000000000000000000000001")) /= std_logic_vector'("00000000000000000000000000000000") then
-- dataavailable <= NOT fifo_EF;
-- end if;
-- end if;
--
-- end process;
--
--synthesis read_comments_as_HDL off
end europa;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -