原程序如下:library ieee;<br />use ieee.std_logic_1164.all; -- we use IEEE standard 1164 logic types.<br />use ieee.numeric_std.all; -- + and - operators<br /><br />entity encoder is ----------------------------ENTITY---------------------<br /> port(<br /> clk : in std_logic; -- everything clocks on rising edge<br /> rst : in std_logic; -- reset--'1'=clean<br /> datain : in std_logic_vector(7 downto 0); -- data bus<br />---------<br /> Kin : in std_logic; -- 特殊字符kin为1时正常编码,0时为特殊码值。<br />--------------------------------------------------------------<br /> dataout : out std_logic_vector(9 downto 0);<br /> frameout :out std_logic<br /> -- invalid_k : out std_logic--输入特殊字符时共有12个(0-11),其余均为无效值<br /> );<br />end encoder;<br /><br />architecture empty of encoder is -------- ARCHITECTURE empty --------<br />signal data_in : std_logic_vector(7 downto 0);<br />signal data6b : std_logic_vector(6 downto 0);--默认游程值为0下的5位转六位编码,第0位显示译码后码值是否平衡,0为平衡,1为不平衡。<br />signal data4b : std_logic_vector(4 downto 0);--默认游程值为0下的3位转4位编码,第0位显示译码后码值是否平衡,0为平衡,1为不平衡。<br />signal data_out : std_logic_vector(9 downto 0);<br />signal rd_initial: std_logic :='0';--初始游程值<br />signal rd_3b: std_logic; --译码8位数据后的游程值,用于下个8位译码<br />signal rd_end: std_logic :='0'; <br />begin <br /> <br /> process(kin,datain)<br /> begin<br /> data_in<=datain;<br /> case data_in(7 downto 5)is--3b/4b when rd_initial=0;<br /> when "000"=> data4b<="01001";<br /> when "001"=> data4b<="10010";<br /> when "010"=> data4b<="01010";<br /> when "011"=> data4b<="00110";<br /> when "100"=> data4b<="00101";<br /> when "101"=> data4b<="10100";<br /> when "110"=> data4b<="01100";<br /> when "111"=> if(kin='0')then<br /> data4b<="10001";<br /> else data4b<="00011";<br /> end if;<br /> end case;<br /> case data_in(4 downto 0) is--5b/1b when rd_initial=0;<br /> when "00000"=> data6b<="0110001";<br /> when "00001"=> data6b<="1000101";<br /> when "00010"=> data6b<="0100101";<br /> when "00011"=> data6b<="1100010";<br /> when "00100"=> data6b<="0010101";<br /> when "00101"=> data6b<="1010010";<br /> when "00110"=> data6b<="0110010";<br /> when "00111"=> data6b<="0001111";<br /> when "01000"=> data6b<="0001101";<br /> when "01001"=> data6b<="1001010";<br /> when "01010"=> data6b<="0101010";<br /> when "01011"=> data6b<="1101000";<br /> when "01100"=> data6b<="0011010";<br /> when "01101"=> data6b<="1011000";<br /> when "01110"=> data6b<="0111000";<br /> when "01111"=> data6b<="0101110";<br /> when "10000"=> data6b<="1001001";<br /> when "10001"=> data6b<="1000110";<br /> when "10010"=> data6b<="0100110";<br /> when "10011"=> data6b<="0011010";<br /> when "10100"=> data6b<="0010110";<br /> when "10101"=> data6b<="1010100";<br /> when "10110"=> data6b<="0110100";<br /> when "10111"=> data6b<="0001011";<br /> when "11000"=> data6b<="0011001";<br /> when "11001"=> data6b<="1001100";<br /> when "11010"=> data6b<="0101100";<br /> when "11011"=> data6b<="0010011";<br /> when "11100"=> data6b<="0011100";<br /> when "11101"=> data6b<="0100011";<br /> when "11110"=> data6b<="1000011";<br /> when "11111"=> data6b<="0101001";<br /> end case;<br />--if ((kin='0')and((data_in/="00011100")or(data_in/="00111100")or(data_in/="01011100")or(data_in/="01111100")or(data_in/="10011100")or(data_in/="10111100")or(data_in/="11011100")or(data_in/="11111100")or(data_in/="11110111")or(data_in/="11111011")<br />--or(data_in/="11111101")or(data_in/="11111110")))<br /> -- then invalid_k<='1';<br /> --else invalid_k<='0';<br /> <br /> -- end if;<br /> end process;<br />process(clk,rst)<br />begin<br /> if(rst='1')then<br /> rd_initial='0'; <br /> frameout<='0';<br /> else <br /> if(clk'event and clk='1')then<br /> if(rd_initial='0')then<br /> dataout(9 downto 4)<=data6b(6 downto 1);<br /> else if(rd_initial='1'and data6b(0)='1')then-----------------<br /> dataout(9 downto 4)<=not(data6b(6 downto 1));<br /> elsif(rd_initial='1'and data6b(0)='0')then<br /> dataout(9 downto 4)<=data6b(6 downto 1);<br /> end if;<br /> end if;<br /> if(rd_3b='0')then<br /> dataout(3 downto 0)<=data4b(4 downto 1);<br /> else if (rd_3b='1'and data4b(0)='1')<br /> then<br /> dataout(3 downto 0)<=not(data4b(4 downto 1));<br /> elsif(rd_3b='1'and data4b(0)='0')then<br /> dataout(3 downto 0)<=data4b(4 downto 1); <br /> end if;<br /> end if;<br /> frameout<='1';<br /> rd_initial<=rd_end;<br /> end if;<br /> end if;<br />end process;<br /> rd_3b<=(rd_initial) xor(data6b(0));<br />rd_end<=(rd_3b) xor (data4b(0));<br /><br />end empty;<br />现对其修改,加入count使其24个时钟解一次码仿真后却无结果,求帮忙。<br />修改后程序如下:library ieee;<br />use ieee.std_logic_1164.all; -- we use IEEE standard 1164 logic types.<br />use ieee.numeric_std.all; -- + and - operators<br /><br />entity encoder is ----------------------------ENTITY---------------------<br /> port(<br /> clk : in std_logic; -- everything clocks on rising edge<br /> rst : in std_logic; -- reset--'1'=clean<br /> datain : in std_logic_vector(7 downto 0); -- data bus<br />---------<br /> Kin : in std_logic; -- 特殊字符kin为1时正常编码,0时为特殊码值。<br />--------------------------------------------------------------<br /> dataout : out std_logic_vector(9 downto 0);<br /> frameout :out std_logic<br /> -- invalid_k : out std_logic--输入特殊字符时共有12个(0-11),其余均为无效值<br /> );<br />end encoder;<br /><br />architecture empty of encoder is -------- ARCHITECTURE empty --------<br />signal data_in : std_logic_vector(7 downto 0);<br />signal data6b : std_logic_vector(6 downto 0);--默认游程值为0下的5位转六位编码,第0位显示译码后码值是否平衡,0为平衡,1为不平衡。<br />signal data4b : std_logic_vector(4 downto 0);--默认游程值为0下的3位转4位编码,第0位显示译码后码值是否平衡,0为平衡,1为不平衡。<br />signal data_out : std_logic_vector(9 downto 0);<br />signal rd_initial: std_logic :='0';--初始游程值<br />signal rd_3b : std_logic; --译码8位数据后的游程值,用于下个8位译码<br />signal rd_end :std_logic :='0';<br />SIGNAL count :INTEGER RANGE 0 TO 2000;<br />begin <br /><br />PROCESS(clk,rst)<br />BEGIN<br /> if(rst='1')then --dataout<="0000000000";<br /> --frameout<='0';<br /> count<=0;<br /> elsif (clk'EVENT AND clk='1') THEN<br /> IF(count=24) THEN<br /> count<=0; <br /> ELSE<br /> count<=count+1; <br /> END IF;<br /> END IF;<br /> <br />END PROCESS;<br /> <br /> process(kin,count,datain)<br /> begin<br /> if(count=1)then<br /> data_in<=datain;<br /> case data_in(7 downto 5)is--3b/4b when rd_initial=0;<br /> when "000"=> data4b<="01001";<br /> when "001"=> data4b<="10010";<br /> when "010"=> data4b<="01010";<br /> when "011"=> data4b<="00110";<br /> when "100"=> data4b<="00101";<br /> when "101"=> data4b<="10100";<br /> when "110"=> data4b<="01100";<br /> when "111"=> if(kin='0')then<br /> data4b<="10001";<br /> else data4b<="00011";<br /> end if;<br /> end case;<br /> case data_in(4 downto 0) is--5b/1b when rd_initial=0;<br /> when "00000"=> data6b<="0110001";<br /> when "00001"=> data6b<="1000101";<br /> when "00010"=> data6b<="0100101";<br /> when "00011"=> data6b<="1100010";<br /> when "00100"=> data6b<="0010101";<br /> when "00101"=> data6b<="1010010";<br /> when "00110"=> data6b<="0110010";<br /> when "00111"=> data6b<="0001111";<br /> when "01000"=> data6b<="0001101";<br /> when "01001"=> data6b<="1001010";<br /> when "01010"=> data6b<="0101010";<br /> when "01011"=> data6b<="1101000";<br /> when "01100"=> data6b<="0011010";<br /> when "01101"=> data6b<="1011000";<br /> when "01110"=> data6b<="0111000";<br /> when "01111"=> data6b<="0101110";<br /> when "10000"=> data6b<="1001001";<br /> when "10001"=> data6b<="1000110";<br /> when "10010"=> data6b<="0100110";<br /> when "10011"=> data6b<="0011010";<br /> when "10100"=> data6b<="0010110";<br /> when "10101"=> data6b<="1010100";<br /> when "10110"=> data6b<="0110100";<br /> when "10111"=> data6b<="0001011";<br /> when "11000"=> data6b<="0011001";<br /> when "11001"=> data6b<="1001100";<br /> when "11010"=> data6b<="0101100";<br /> when "11011"=> data6b<="0010011";<br /> when "11100"=> data6b<="0011100";<br /> when "11101"=> data6b<="0100011";<br /> when "11110"=> data6b<="1000011";<br /> when "11111"=> data6b<="0101001";<br /> end case;<br />--if ((kin='0')and((data_in/="00011100")or(data_in/="00111100")or(data_in/="01011100")or(data_in/="01111100")or(data_in/="10011100")or(data_in/="10111100")or(data_in/="11011100")or(data_in/="11111100")or(data_in/="11110111")or(data_in/="11111011")<br />--or(data_in/="11111101")or(data_in/="11111110")))<br /> -- then invalid_k<='1';<br /> --else invalid_k<='0';<br /> <br />end if;<br /> if(count=0)then<br /> -- rd_initial<='0';<br /><br /> frameout<='0';<br /> dataout<="0000000000";<br /> else <br /> if(count=2)then<br /> if(rd_initial='0')then<br /> dataout(9 downto 4)<=data6b(6 downto 1);<br /> else if(rd_initial='1'and data6b(0)='1')then-----------------<br /> dataout(9 downto 4)<=not(data6b(6 downto 1));<br /> elsif(rd_initial='1'and data6b(0)='0')then<br /> dataout(9 downto 4)<=data6b(6 downto 1);<br /> end if;<br /> end if;<br /> if(rd_3b='0')then<br /> dataout(3 downto 0)<=data4b(4 downto 1);<br /> else if (rd_3b='1'and data4b(0)='1')<br /> then<br /> dataout(3 downto 0)<=not(data4b(4 downto 1));<br /> elsif(rd_3b='1'and data4b(0)='0')then<br /> dataout(3 downto 0)<=data4b(4 downto 1); <br /> end if;<br /> end if;<br /> frameout<='1';<br /> rd_initial<=rd_end;<br /> -- dataout<=data_out;<br /> end if;<br /> end if;<br /> end process;<br /><br /> rd_3b<=(rd_initial) xor(data6b(0));<br />rd_end<=(rd_3b) xor (data4b(0));<br />end empty; |
|