📄 h264topskeleton.vhd
字号:
DATAI => intra8x8cc_datai,
READYI => intra8x8cc_readyi,
--
-- top interface:
TOPI => intra8x8cc_topi,
XXO => intra8x8cc_xxo,
XXC => intra8x8cc_xxc,
XXINC => intra8x8cc_xxinc,
--
-- feedback interface:
FEEDBI => recon_FEEDB(31 downto 24),
FBSTROBE => recon_FBCSTROBE,
--
-- out interface:
STROBEO => intra8x8cc_strobeo,
DATAO => intra8x8cc_datao,
BASEO => intra8x8cc_baseo,
READYO => intra4x4_CHREADY,
DCSTROBEO => intra8x8cc_dcstrobeo,
DCDATAO => intra8x8cc_dcdatao,
CMODEO => intra8x8cc_cmodeo
);
intra8x8cc_TOPI <= toppixcc(conv_integer(mbxcc & intra8x8cc_XXO));
--
header : h264header
port map (
CLK => clk,
NEWSLICE => NEWSLICE,
--LASTSLICE => '1'
SINTRA => '1', --all slices are Intra in this test
--
MINTRA => '1', --ditto all mbs
LSTROBE => intra4x4_strobeo,
CSTROBE => intra4x4_strobeo, --header_cstrobe,
QP => qp,
--
PMODE => intra4x4_PMODEO,
RMODE => intra4x4_RMODEO,
CMODE => header_cmode,
--
PTYPE => b"00",
PSUBTYPE => b"00",
MVDX => x"000",
MVDY => x"000",
--
VE => header_ve,
VL => header_vl,
VALID => header_valid
);
--
coretransform : h264coretransform
port map (
CLK => clk2,
READY => coretransform_ready,
ENABLE => coretransform_enable,
XXIN => coretransform_xxin,
VALID => coretransform_valid,
YNOUT => coretransform_ynout
);
coretransform_enable <= intra4x4_strobeo or intra8x8cc_strobeo;
coretransform_xxin <= intra4x4_datao when intra4x4_strobeo='1' else intra8x8cc_datao;
recon_bstrobei <= intra4x4_strobeo or intra8x8cc_strobeo;
recon_basei <= intra4x4_baseo when intra4x4_strobeo='1' else intra8x8cc_baseo;
--
dctransform : h264dctransform
generic map ( TOGETHER => true )
port map (
CLK2 => clk2,
RESET => NEWslice,
--READYI =>
ENABLE => intra8x8cc_dcstrobeo,
XXIN => intra8x8cc_dcdatao,
VALID => dctransform_valid,
YYOUT => dctransform_yyout,
READYO => dctransform_readyo
);
dctransform_readyo <= intra4x4_CHREADY and not coretransform_valid;
--
quantise : h264quantise
port map (
CLK => clk2,
ENABLE => quantise_ENABLE,
QP => qp,
DCCI => dctransform_VALID,
YNIN => quantise_YNIN,
ZOUT => quantise_zout,
DCCO => quantise_dcco,
VALID => quantise_valid
);
quantise_YNIN <= sxt(coretransform_ynout,16) when coretransform_valid='1' else dctransform_yyout;
quantise_ENABLE <= coretransform_valid or dctransform_VALID;
--
invdctransform : h264dctransform
port map (
CLK2 => clk2,
RESET => NEWslice,
--READYI =>
ENABLE => invdctransform_enable,
XXIN => invdctransform_zin,
VALID => invdctransform_valid,
YYOUT => invdctransform_yyout,
READYO => invdctransform_ready
);
invdctransform_enable <= quantise_valid and quantise_dcco;
invdctransform_ready <= dequantise_last and xbuffer_CCIN;
invdctransform_zin <= sxt(quantise_zout,16);
--
dequantise : h264dequantise
generic map ( LASTADVANCE => 2 )
port map (
CLK => clk2,
ENABLE => dequantise_enable,
QP => qp,
ZIN => dequantise_zin,
DCCI => invdctransform_valid,
LAST => dequantise_last,
WOUT => dequantise_wout,
--DCCO => dequantise_dcco,
VALID => dequantise_valid
);
dequantise_enable <= quantise_valid and not quantise_dcco;
dequantise_zin <= quantise_zout when invdctransform_valid='0' else invdctransform_yyout(11 downto 0); --WIDTH!!
--
invtransform : h264invtransform
port map (
CLK => clk2,
ENABLE => dequantise_valid,
WIN => dequantise_wout,
--LAST => invtransform_last,
VALID => invtransform_valid,
XOUT => invtransform_xout
);
--invtransform_enable <= dequantise_valid and not dequantise_dcco;
--invtransform_win <= dequantise_wout when invdctransform_valid='0' else invdctransform_yyout;
--
recon : h264recon
port map (
CLK2 => clk2,
--
NEWSLICE => NEWSLICE,
STROBEI => invtransform_valid,
DATAI => invtransform_xout,
BSTROBEI => recon_bstrobei,
BCHROMAI => intra8x8cc_strobeo,
BASEI => recon_basei,
--
STROBEO => recon_FBSTROBE,
CSTROBEO => recon_FBCSTROBE,
DATAO => recon_FEEDB
);
--
xbuffer : h264buffer
port map (
CLK => clk2,
NEWSLICE => NEWSLICE,
NEWLINE => NEWLINE,
--
VALIDI => quantise_valid,
ZIN => quantise_zout,
READYI => xbuffer_READYI,
--DCREADYI => xbuffer_DCREADYI,
CCIN => xbuffer_CCIN,
DONE => xbuffer_DONE,
--
VOUT => cavlc_vin,
VALIDO => cavlc_enable,
--
NLOAD => xbuffer_NLOAD,
NX => xbuffer_NX,
NY => xbuffer_NY,
NV => xbuffer_NV,
NXINC => xbuffer_NXINC,
--
READYO => cavlc_ready,
TREADYO => tobytes_ready,
HVALID => header_valid
);
--
cavlc : h264cavlc
port map (
CLK => clk,
CLK2 => clk2,
ENABLE => cavlc_enable,
READY => cavlc_ready,
VIN => cavlc_vin,
NIN => cavlc_nin,
SIN => '0',
--VS => cavlc_vs,
VE => cavlc_ve,
VL => cavlc_vl,
VALID => cavlc_valid,
XSTATE => cavlc_xstate,
NOUT => cavlc_nout
);
--
tobytes: h264tobytes
port map (
CLK => clk,
VALID => tobytes_valid,
READY => tobytes_ready,
VE => tobytes_ve,
VL => tobytes_vl,
BYTE => tobytes_byte,
STROBE => tobytes_strobe,
DONE => tobytes_DONE
);
tobytes_ve <= b"00000"&header_ve when header_valid='1' else
cavlc_ve when cavlc_valid='1' else
'0'&x"030080"; --align+done pattern
tobytes_vl <= header_vl when header_valid='1' else
cavlc_vl when cavlc_valid='1' else
b"01000"; --8 bits (1 + 7 for align)
tobytes_valid <= header_valid or align_VALID or cavlc_valid;
--
process(CLK2) --nout/nin processing for CAVLC
begin
if rising_edge(CLK2) then
if xbuffer_NLOAD='1' then
ninleft(conv_integer(xbuffer_NY)) <= cavlc_NOUT;
nintop(conv_integer(ninx&xbuffer_NX)) <= cavlc_NOUT;
else
ninl <= ninleft(conv_integer(xbuffer_NY));
nint <= nintop(conv_integer(ninx&xbuffer_NX));
end if;
if NEWLINE='1' then
ninx <= (others => '0');
elsif xbuffer_NXINC='1' then
ninx <= ninx+1;
end if;
end if;
end process;
cavlc_NIN <=
ninl when xbuffer_NV=1 else
nint when xbuffer_NV=2 else
ninsum(5 downto 1) when xbuffer_NV=3 else
(others=>'0');
ninsum <= ('0'&ninl) + ('0'&nint) + 1;
--
process(CLK2) --feedback
begin
if rising_edge(CLK2) then
--feedback: set toppix
if recon_FBSTROBE='1' then
toppix(conv_integer(mbx & intra4x4_XXO)) <= recon_FEEDB;
end if;
if intra4x4_MSTROBEO='1' then
topmode(conv_integer(mbx & intra4x4_XXO)) <= intra4x4_MODEO;
end if;
if NEWLINE='1' then
mbx <= (others => '0');
elsif intra4x4_XXINC='1' then
mbx <= mbx + 1;
end if;
--
--chroma feedback: set toppixcc
if recon_FBCSTROBE='1' then
toppixcc(conv_integer(mbxcc & intra8x8cc_XXO)) <= recon_FEEDB;
end if;
if NEWLINE='1' then
mbxcc <= (others => '0');
elsif intra8x8cc_XXINC='1' then
mbxcc <= mbxcc + 1;
end if;
end if;
end process;
--
end hw;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -