⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lzw_beh.vhd

📁 vhdl code for GIF Image Viewer
💻 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 + -