Thông báo

Collapse
No announcement yet.

Giúp mình sửa lỗi khi gán tín hiệu giữa 2 entity khác nhau, ngôn ngữ VHDL

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp mình sửa lỗi khi gán tín hiệu giữa 2 entity khác nhau, ngôn ngữ VHDL

    Mình đang code 2 block. Và mình muốn gán tín hiệu giữa 2 block này (2 entity trong VHDL) nhưng nó báo lỗi xảy ra chỗ lệnh gán (w_data.entity work.fifo_8x32) <= Mdata; như dưới đây chưa biết sửa thế nào, bác nào biết chỉ mình với, thanks.
    Lỗi:
    # Model Technology ModelSim SE vcom 6.5b Compiler 2009.05 May 21 2009
    # -- Loading package standard
    # -- Loading package std_logic_1164
    # -- Loading package numeric_std
    # -- Compiling entity fifo_8x32
    # -- Compiling architecture enlarged_bin_arch of fifo_8x32
    # -- Compiling architecture beh_arch of fifo_8x32
    # -- Loading entity fifo_8x32
    # -- Compiling entity controlfifo
    # -- Compiling architecture controlfifo_arch of controlfifo
    # ** Error: ControlFIFO.vhd(111): near "entity": expecting "CHARACTER" or "STRING" or "IDENTIFIER" or "ALL"
    # ** Error: ControlFIFO.vhd(117): VHDL Compiler exiting
    # D:/VHDL implementation/win32/vcom failed.
    Code:
    Code:
    -- Control FIFO Block
    -- FIFO buffer 8x32
    -- Synchronous FIFO buffer
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    -- Entity for FIFO buffer 8x34
    entity fifo_8x32 is
        port(
            clk, reset: in std_logic;
            -- FIFO controller
            wr, rd: in std_logic;
            full, empty: out std_logic;
            -- FIFO register file
            wr_en: in std_logic;
            w_data: inout std_logic_vector(31 downto 0);
            r_data: out std_logic_vector(31 downto 0);
            -- Address signal: 2**N = Number of words, N=3
            w_addr, r_addr: inout std_logic_vector(2 downto 0)
        );
    end fifo_8x32;
    architecture enlarged_bin_arch of fifo_8x32 is
        constant N: natural:=3;
        signal w_ptr_reg, w_ptr_next: unsigned(N downto 0);
        signal r_ptr_reg, r_ptr_next: unsigned(N downto 0);
        signal full_flag, empty_flag: std_logic;
    begin
        -- Register
        process(clk,reset)
        begin
          if (reset='1') then 
            w_ptr_reg <= (others=>'0'); -- w_ptr_reg<='00';
            r_ptr_reg <= (others=>'0'); -- r_ptr_reg<='00';
          elsif (clk'event and clk='1') then
            w_ptr_reg <= w_ptr_next;
            r_ptr_reg <= r_ptr_next;
          end if;    
        end process;
        -- Write pointer next-stage logic
        w_ptr_next <=
          w_ptr_reg+1 when (wr='1' and full_flag='0') else
          w_ptr_reg;
        full_flag <=
          '1' when (r_ptr_reg(N)/=w_ptr_reg(N)and
                 r_ptr_reg(N-1 downto 0)=w_ptr_reg(N-1 downto 0))
              else
          '0';
        -- Write port output
        w_addr <= std_logic_vector(w_ptr_reg(N-1 downto 0));
        full<= full_flag;
        -- Read pointer next-stage logic 
        r_ptr_next <=
          r_ptr_reg+1 when (rd='1' and empty_flag='0') else
          r_ptr_reg;
        empty_flag <= '1' when r_ptr_reg=w_ptr_reg else
                      '0';
        -- Write port output
        r_addr <= std_logic_vector(r_ptr_reg(N-1 downto 0));
        empty <= empty_flag;
    end enlarged_bin_arch;
    architecture beh_arch of fifo_8x32 is
      type reg_file_type is array (2**3-1 downto 0) of
           std_logic_vector(31 downto 0);
      signal array_reg: reg_file_type;
      signal array_next: reg_file_type;
    begin
      -- Register array
      process(clk,reset)
      begin 
        if (reset='1') then 
          array_reg <= (others=>(others=>'0'));
        elsif (clk'event and clk='1') then 
          array_reg <= array_next;
        end if;
      end process;
      -- Next-state logic for register array
      process(array_reg,wr_en,w_addr,w_data)
      begin
          array_next <= array_reg;
          if wr_en='1' then
            array_next(to_integer(unsigned(r_addr))) <= w_data;
          end if;
      end process;
      -- Read port
      r_data <= array_reg(to_integer(unsigned(r_addr)));
    end beh_arch;
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    entity ControlFIFO is 
    	port(
    	clk, reset: in std_logic;
    	MdataLast, MreqLast, full: in std_logic;
    	Mcmd: in std_logic_vector(2 downto 0);
    	MBurstLength: in std_logic_vector(7 downto 0);
    	ScmdAccept, wr: out std_logic);
    end ControlFIFO;
    architecture ControlFIFO_arch of ControlFIFO is
    signal Mdata: std_logic_vector(31 downto 0);
    begin
    	process(clk, reset)
    	begin
    		if (reset='1') then
    		-- default value
    		wr <= '0';
    		ScmdAccept <= '0';
    		elsif (clk'event and clk = '1') then
    			if ((Mcmd = "001" and MreqLast ='0') and MdataLast = '0') then
    				wr <= '1';
    				if (full = '0') then
    					(w_data.entity work.fifo_8x32) <= Mdata;
    					ScmdAccept <= '1';
    				end if;
    			end if;
    		end if;
    	end process;
    end ControlFIFO_arch;

  • #2
    Tôi tạm sửa code của bạn như sau. Bạn cần hoàn túc phần nối những port khác của fifo_8x32.

    Code:
    -- Control FIFO Block
    -- FIFO buffer 8x32
    -- Synchronous FIFO buffer
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    -- Entity for FIFO buffer 8x34
    entity fifo_8x32 is
        port(
            clk, reset: in std_logic;
            -- FIFO controller
            wr, rd: in std_logic;
            full, empty: out std_logic;
            -- FIFO register file
            wr_en: in std_logic;
            w_data: inout std_logic_vector(31 downto 0);
            r_data: out std_logic_vector(31 downto 0);
            -- Address signal: 2**N = Number of words, N=3
            w_addr, r_addr: inout std_logic_vector(2 downto 0)
        );
    end fifo_8x32;
    architecture enlarged_bin_arch of fifo_8x32 is
        constant N: natural:=3;
        signal w_ptr_reg, w_ptr_next: unsigned(N downto 0);
        signal r_ptr_reg, r_ptr_next: unsigned(N downto 0);
        signal full_flag, empty_flag: std_logic;
    begin
        -- Register
        process(clk,reset)
        begin
          if (reset='1') then 
            w_ptr_reg <= (others=>'0'); -- w_ptr_reg<='00';
            r_ptr_reg <= (others=>'0'); -- r_ptr_reg<='00';
          elsif (clk'event and clk='1') then
            w_ptr_reg <= w_ptr_next;
            r_ptr_reg <= r_ptr_next;
          end if;    
        end process;
        -- Write pointer next-stage logic
        w_ptr_next <=
          w_ptr_reg+1 when (wr='1' and full_flag='0') else
          w_ptr_reg;
        full_flag <=
          '1' when (r_ptr_reg(N)/=w_ptr_reg(N)and
                 r_ptr_reg(N-1 downto 0)=w_ptr_reg(N-1 downto 0))
              else
          '0';
        -- Write port output
        w_addr <= std_logic_vector(w_ptr_reg(N-1 downto 0));
        full<= full_flag;
        -- Read pointer next-stage logic 
        r_ptr_next <=
          r_ptr_reg+1 when (rd='1' and empty_flag='0') else
          r_ptr_reg;
        empty_flag <= '1' when r_ptr_reg=w_ptr_reg else
                      '0';
        -- Write port output
        r_addr <= std_logic_vector(r_ptr_reg(N-1 downto 0));
        empty <= empty_flag;
    end enlarged_bin_arch;
    architecture beh_arch of fifo_8x32 is
      type reg_file_type is array (2**3-1 downto 0) of
           std_logic_vector(31 downto 0);
      signal array_reg: reg_file_type;
      signal array_next: reg_file_type;
    begin
      -- Register array
      process(clk,reset)
      begin 
        if (reset='1') then 
          array_reg <= (others=>(others=>'0'));
        elsif (clk'event and clk='1') then 
          array_reg <= array_next;
        end if;
      end process;
      -- Next-state logic for register array
      process(array_reg,wr_en,w_addr,w_data)
      begin
          array_next <= array_reg;
          if wr_en='1' then
            array_next(to_integer(unsigned(r_addr))) <= w_data;
          end if;
      end process;
      -- Read port
      r_data <= array_reg(to_integer(unsigned(r_addr)));
    end beh_arch;
    
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    entity ControlFIFO is 
    	port(
    	clk, reset: in std_logic;
    	MdataLast, MreqLast, full: in std_logic;
    	Mcmd: in std_logic_vector(2 downto 0);
    	MBurstLength: in std_logic_vector(7 downto 0);
    	ScmdAccept, wr: out std_logic);
    end ControlFIFO;
    architecture ControlFIFO_arch of ControlFIFO is
    component fifo_8x32 is
        port(
            clk, reset: in std_logic;
            -- FIFO controller
            wr, rd: in std_logic;
            full, empty: out std_logic;
            -- FIFO register file
            wr_en: in std_logic;
            w_data: inout std_logic_vector(31 downto 0);
            r_data: out std_logic_vector(31 downto 0);
            -- Address signal: 2**N = Number of words, N=3
            w_addr, r_addr: inout std_logic_vector(2 downto 0)
        );
    end component;
    signal Mdata: std_logic_vector(31 downto 0);
    signal fifo_8x32_w_data: std_logic_vector(31 downto 0);
    begin
            fifo_I: fifo_8x32 port map (w_data => fifo_8x32_w_data, ...);
    	process(clk, reset)
    	begin
    		if (reset='1') then
    		-- default value
    		wr <= '0';
    		ScmdAccept <= '0';
    		elsif (clk'event and clk = '1') then
    			if ((Mcmd = "001" and MreqLast ='0') and MdataLast = '0') then
    				wr <= '1';
    				if (full = '0') then
    					fifo_8x32_w_data <= Mdata;
    					ScmdAccept <= '1';
    				end if;
    			end if;
    		end if;
    	end process;
    end ControlFIFO_arch;
    Chúc một ngày vui vẻ
    Tony
    email : dientu_vip@yahoo.com

    Comment

    Về tác giả

    Collapse

    Edimark Tìm hiểu thêm về Edimark

    Bài viết mới nhất

    Collapse

    Đang tải...
    X