2016-11-15 111 views
0

我是VHDL的新手。我正在做一个使用VHDL的MP3解码器,并且碰巧遇到了来自网站的这种霍夫曼编码。但是,我很难确定哪一行实际上表示输入位文件。下面是源代码:如何读取VHDL中的位文件?

use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all; 
use IEEE.std_logic_arith.all; 
use work.all_types.all;   
use work.huffman_types.all; -- this file contains all the tables of huffman decoders 

entity huffman is 
port(clk : in std_logic;  -- input clock signal 
     rst : in std_logic;  -- reset signal ('1' = reset) 
     start : in std_logic;  -- start='1' means that this component is activated 
     done : out std_logic;  -- produce a done signal when process is finished 
     gr : in std_logic;  -- granule ('0'=granule0, '1'=granule1) 
     bin : in std_logic_vector(7 downto 0); -- input main data for huffman 
     addr : out std_logic_vector(9 downto 0); -- address for main data 
     dout : out std_logic_vector(31 downto 0); -- data to memory 
     memc : out mem_control_type; -- memeory controll signal 
     sco : out scalefac_type; -- output scale factors 
     frm : in frame_type  -- contains all header and side information for the current frame 
); 
end; 

architecture behavioral of huffman is 
type state_type is 
(IDLE1,IDLE2,IDLE3,READ,READ1,READ2,READREADY,SCALE,HUFFMAN,HUFFBIGVALUE,TABLELOOKUP1,HUFFCOUNT1,TABLELOOKUP2,HUFFEND,DATAREADY,READY); 
signal cs,ns:state_type; 
type is_type is array (0 to 575) of integer; 
signal isg : is_type; 
signal addrcount1:std_logic_vector(9 downto 0); 
signal valuebuffer : std_logic_vector(0 to 8191); 

begin 

process(cs, frm, gr, start) 

variable scalefac : integer; 
variable count : integer ; 
variable memaddrcount : std_logic_vector(9 downto 0); 
variable scout : scalefac_type; 
variable bitpos:std_logic_vector(12 downto 0); 
variable region1start,region2start,bigvalues,count1s,start_bit1,start_bit2,start_bit,tempbit: integer; 
variable line,line1,region,old_region : integer; 
variable u,w,x,y,linbits:integer; 
variable level,level1,value,temp,templevel:integer; 
variable tindex:integer range 0 to 33; 
variable tempvector : std_logic_vector(7 downto 0); 
variable tempvector1 : std_logic_vector(3 downto 0); 
variable slenval0,slenval1:integer; 
variable tempval,tempdata,temphuff,temphuff1,temppos:integer; 
variable tempcount1:std_logic; 

begin 

case cs is 
    when IDLE1 => 
        addrcount1 <= (others =>'0'); 
      ns<=IDLE2; 
    when IDLE2 => 
        done <= '0'; 
        count :=0; 
      line :=0; 
      line1 :=0; 
      bigvalues:=0; 
      count1s:=0; 
      start_bit:=0; 
      linbits:=0; 
      tempvector1:=(others =>'0'); 
      tempvector:=(others =>'0'); 
      tindex:=0; 
      temp:=0; 
      value:=0; 
      isg<=(others=>0); 
       ns<=IDLE3; 
    when IDLE3 => 
       if (start = '1') then 
      memaddrcount :=(others =>'0'); 
       end if; 
       ns<=READ; 
    when READ => 

       addr <= addrcount1; 
       ns<=READ1; 

    when READ1=> 
     ns<=READREADY; 

    when READREADY => 
      valuebuffer(count to count+7) <= bin; 
      count := count +8; 
       addrcount1 <= addrcount1 +1; 

        if count=8192 then 
         if gr='0' then 
       bitpos:=conv_std_logic_vector((conv_integer(frm.sideinfo.main_data)*8),13); 
        else 
        start_bit2:=conv_integer(bitpos); 
         end if; 
          ns<= SCALE; 
        else 
         ns<= READ; 
        end if; 
        . 
        . 
        . 

我们可以看到,这条线是输入主数据

bin : in std_logic_vector(7 downto 0); -- input main data for huffman 

这是行表示位文件被送入缓冲区?

valuebuffer(count to count+7) <= bin; 

我想知道为什么不使用read_mode方法。如果需要read_mode,应该在哪里插入?

+0

此代码中没有任何文件。 'bin'是一个单字节输入。 –

+0

@BrianDrummond,谢谢澄清。我有一个从.mp3格式转换而来的二进制文件。我应该如何修改代码才能读取位文件? – Cyan

+2

*我应该如何修改代码才能读取位文件?*对于此场所来说太宽泛。硬件通常没有没有处理器的文件系统。你问如何将文件加载到(未显示的)内存中? OpenCores项目[MP3解码器](http://opencores.org/project,decoder,downloads)有一个自述文件,它描述了huffman.vhd的功能。有[FOR多媒体系统MP3解码内核的FPGA的体系架构(http://www.nsl.hcmus.edu.vn/greenstone/collect/hnkhbk/archives/HASHe1da.dir/doc.pdf)可以有助于理解所示的代码(见图19)。 – user1155120

回答

2

通常只能在测试台中读取文件。

process 
    variable status_input : file_open_status; 
begin 
    -- Open files 
    file_open(status_input, file_input, "../your_text_file.txt", read_mode); ... 

读取文件的内容后,可以将数据送入模块的I/O。

您发布的代码非常糟糕。很多问题,我永远不会引用它。

+0

谢谢@Fisher。您是否正在研究同一个项目(使用VHDL的MP3解码器)? – Cyan

+0

@青色我正在使用VHDL,但不同的项目。 – Fisher