VHDL代码运行但时序图没有显示任何内容

时间:2014-12-01 02:47:52

标签: caching vhdl ram timing-diagram

我正在尝试在DesignWorks 5中用VHDL实现高速缓存16 * 37.代码如下。 代码运行但是当我从IO面板更改值或甚至模拟时,时序图都没有显示任何内容,基本上代码由于某种原因没有运行。任何建议都会非常有用。

代码:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity Cache is
port(cs, r, clr : in std_logic;
    data : in std_logic_vector(31 downto 0);
    addr : in std_logic_vector(7 downto 0);
    cline : out std_logic_vector(31 downto 0);
    ctag: out std_logic_vector(3 downto 0);
    v : out std_logic);
end Cache;

architecture behav of Cache is
type RAM is array (0 to 15) of std_logic_vector(36 downto 0); 
begin 
 process is
 variable M : RAM; 
 variable locn : natural; 
 variable temp_val : std_logic_vector(36 downto 0); 
 variable cline_val : std_logic_vector(31 downto 0);
 variable ctag_val : std_logic_vector(3 downto 0);
 variable v_val : std_logic;
    begin

        if cs = '1' then
            locn := to_integer(addr); 
            if r = '1' then 
                temp_val := M(locn); 
                cline_val := temp_val(31 downto 0);
                ctag_val := temp_val(35 downto 32);
                v_val := temp_val(36);
            else
                temp_val(31 downto 0) := data;
                temp_val(35 downto 32) := addr(3 downto 0);
                temp_val(36) := '1';
                M(locn) := temp_val;
                v_val := 'Z'; 
                ctag_val:= "ZZZZ"; 
                cline_val:= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
            end if; 
        end if; 
        if clr ='1' then
            locn := 0;
            while(locn<16) loop
                M(locn) := X"000000000" + "0";
                locn:=locn+1;
            end loop;
        end if;
    cline <= cline_val; 
    ctag <= ctag_val;
    v <= v_val;
    wait on cs; 
end process;

end behav;

1 个答案:

答案 0 :(得分:0)

这一行:

M(locn) := X"000000000" + "0"; 

似乎不正确。

M是你的ram数组类型,元素长度为37. 36位零添加到零仍然是36位(它看起来不像你达到这个语句,它将是一个运行时错误)。

制作长度为37的&#39; 0&#39;值使用`(其他=&gt;&#39; 0&#39;)。

你也可以使用for循环for ram clear,你不需要使用16的索引,它超出范围,这告诉我们你也没有达到清晰。

我认为你应该向我们展示你的刺激,否则你的问题就无法再现。

您遗失的dataaddr作为敏感元素(ya,你的情况是cs环绕,但你想在这里建立一个硬件模型)。

切换到敏感度列表(cs, data, addr)

locn是一个无约束的自然,应该具有与数组类型ram(0到15)匹配的范围。注意你的while循环达到16.真的,使用for循环(如下所示)。约束locn的原因是为了防止在访问ram(locn)时出现绑定错误。

请注意将addr转换为自然(locn)并使用长度为4的&#39; 1来掩饰addr以防止范围正常的RAM操作错误。

包numeric_std是一种做法,比在分析和详细说明期间将几个命令行选项传递给ghdl(ieee=synopsys -fexplict)更容易。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity cache is
    port (
        cs, r, clr: in  std_logic;
        data:       in  std_logic_vector(31 downto 0);
        addr:       in  std_logic_vector(7 downto 0);
        cline:      out std_logic_vector(31 downto 0);
        ctag:       out std_logic_vector(3 downto 0);
        v:          out std_logic
    );
end entity;

architecture behav of cache is
    type ram is array (0 to 15) of std_logic_vector(36 downto 0);    
begin 

    process (cs, data, addr)
        variable m : ram; 
        variable locn : natural range (ram'range); 
        variable temp_val : std_logic_vector(36 downto 0); 
        variable cline_val : std_logic_vector(31 downto 0);
        variable ctag_val : std_logic_vector(3 downto 0);
        variable v_val : std_logic;
    begin
        if cs = '1' then
            locn := to_integer(unsigned(addr and x"0F")); 
            if r = '1' then 
                temp_val := m(locn); 
                cline_val := temp_val(31 downto 0);
                ctag_val := temp_val(35 downto 32);
                v_val := temp_val(36);
            else
                temp_val(31 downto 0) := data;
                temp_val(35 downto 32) := addr(3 downto 0);
                temp_val(36) := '1';
                m(locn) := temp_val;
                v_val := 'Z'; 
                ctag_val:= "ZZZZ"; 
                cline_val:= (others => 'Z');
            end if; 
        end if; 
        if clr ='1' then
            for i in ram'range loop
                m(i) := (others => '0');
            end loop;
        end if;
        cline <= cline_val; 
        ctag <= ctag_val;
        v <= v_val;
    end process;
end architecture;

这段代码分析和阐述,你可能会在我没有提到的地方出现错误,绑定(范围)错误会在运行时出现在赋值中(表达式无关紧要)。

最后一点:

            temp_val(31 downto 0) := data;
            temp_val(35 downto 32) := addr(3 downto 0);
            temp_val(36) := '1';

可以表达:

            temp_val:= '1' & addr(3 downto 0) & data;

以及:

            locn := to_integer(addr);

表示为:

            locn := to_integer(addr(3 downto 0));

如果您使用泛型设置ram大小,也可以从ram'range创建一个具有算法定义长度的AND掩码。

如果没有看到您的刺激,有几个地方可能会导致运行时错误。检查你的控制台输出。