📄 lzw_beh.vhd
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.std_logic_misc.all;
use IEEE.numeric_std.all;
entity lzw_beh is
Port ( clk : in std_logic;
start : in std_logic;
readData : in std_logic_vector(15 downto 0);
codesize : in std_logic_vector(7 downto 0);
addr : out std_logic_vector(19 downto 0);
writeData : out std_logic_vector(15 downto 0);
oen : out std_logic;
wen : out std_logic;
done : out std_logic);
end lzw_beh;
architecture Behavioral of lzw_beh is
begin
process
variable outaddr, inaddr, stackbase, database, linkbase : std_logic_vector(19 downto 0);
variable memdata : std_logic_vector(7 downto 0);
variable token, data, link, maxchar : std_logic_vector(11 downto 0);
variable nBits, nextphrase, mem_validbits, stacksize : integer;
begin
oen <= '0';
wen <= '1';
done <= '0';
loop
wait until start = '1';
outaddr := x"80000";
inaddr := x"03000";
database := x"01000";
linkbase := x"00000";
stackbase := x"02000";
stacksize := 0;
mem_validbits := 0;
maxchar := SHL("000000000001", codesize - 1);
outer : loop
nBits := conv_integer(codesize);
nextphrase := conv_integer(maxchar + 2);
inner : loop
for k in 1 to nBits loop
if mem_validbits = 0 then
addr <= inaddr;
wait for 20 ns;
memdata := readData(7 downto 0);
mem_validbits := 8;
inaddr := inaddr + 1;
end if;
token := memdata(0) & token(11 downto 1);
memdata := SHR(memdata, "001");
mem_validbits := mem_validbits - 1;
end loop;
token := SHR(token, conv_std_logic_vector(12 - nBits, 4));
if token < maxchar then
addr <= database + nextphrase;
writeData <= "0000" & token;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
addr <= linkbase + nextphrase;
writeData <= x"0000";
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
addr <= outaddr;
writeData <= "0000" & token;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
outaddr := outaddr + 1;
elsif token = maxchar then
exit inner;
elsif token = maxchar + 1 then
exit outer;
else
link := token;
while link /= 0 loop
addr <= database + link;
wait for 20 ns;
data := readData(11 downto 0);
addr <= stackbase + stacksize;
writeData <= "0000" & data;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
stacksize := stacksize + 1;
addr <= linkbase + link;
wait for 20 ns;
link := readData(11 downto 0);
end loop;
while stacksize /= 0 loop
addr <= stackbase + stacksize - 1;
wait for 20 ns;
data := readData(11 downto 0);
addr <= outaddr;
writeData <= "0000" & data;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
outaddr := outaddr + 1;
stacksize := stacksize - 1;
end loop;
addr <= linkbase + nextphrase;
writeData <= "0000" & token;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
link := token + 1;
gogo : loop
addr <= linkbase + link;
wait for 20 ns;
data := readData(11 downto 0);
if data = 0 then
exit gogo;
else
link := data;
end if;
end loop;
addr <= database + link;
wait for 20 ns;
data := readData(11 downto 0);
addr <= database + nextphrase;
writeData <= "0000" & data;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
addr <= outaddr;
writeData <= "0000" & data;
wen <= '0';
wait for 20 ns;
wen <= '1';
wait for 20 ns;
outaddr := outaddr + 1;
end if;
nextphrase := nextphrase + 1;
if nextphrase = 2 or nextphrase = 4 or nextphrase = 8 or
nextphrase = 16 or nextphrase = 32 or nextphrase = 64 or
nextphrase = 128 or nextphrase = 256 or nextphrase = 512 or
nextphrase = 1024 or nextphrase = 2048 then
nBits := nBits + 1;
end if;
end loop;
end loop;
done <= '1';
wait for 20 ns;
done <= '0';
end loop;
end process;
end Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -