您好,我是VHDL编程的新手,请帮我解决这些错误

时间:2015-03-12 08:41:57

标签: if-statement vhdl state-machine

我不知道为什么它显示错误,尽管语法似乎是正确的。

我正在尝试编写sramctl,其中地址adds_in是输入地址和sram_adds输出地址我只是映射地址而没有考虑数据总线。

library IEEE;
use IEEE.std_logic_1164.all;

entity sramctrl is
port(clk,adsn,blastn,lwdrn,lhold:in std_logic;
 adds_in :in std_logic_vector(9 downto 2);          

 adds_4msb:in std_logic_vector(31 downto 28);
 readyn,btermn,sramcsn,sramoen,lholda :out std_logic;
 sram_adds:out std_logic_vector(9 downto 2));
 end sramctrl;
architecture behavioral of sramctrl is
type state_type is(s0,s1,s2);
signal state:state_type;
begin
process(clk,adsn,blastn,lwdrn,lhold,adds_in,adds_4msb)
begin
    variable sa:std_logic:='0';
    variable a31_a28 :std_logic_vector(3 downto 0):="0000";
    variable temp:std_logic_vector(9 downto 2):="00000000";
    if(rising_edge(clk))then
        if ((not adsn) and (adds_4msb="0000"))then         
        a31_28 := adds_4msb; 
        end if;
        if (lhold='1')then
            lholda<='1';
        else
             lholda<='0';
        end if;
        sa:=lhold and lholda ;
        case state is
            when s0=>sramoen<='1';
                    sramcsn<='1';
                    readyn<='1';
                    btermn<='1';
                    if((not adsn) and (not adds_4msb) and sa)then
                        temp:=adds_in;
                            if(lwdrn='1')then
                                state<=s1;
                                ready<='0';
                            else
                                state<=s2;
                            end if;
                    else
                        state<=s0;
                    end if;
                when s1=>sramoen<='1';
                        sramcsn<='0';
                        if(lwdrn and (not blastn) and sa)then
                            sram_adds<=temp;
                            readyn<='1';
                            btermn<='1';
                            state<=s0;
                        elsif(lwdrn and blastn and sa)then
                            if(temp=X"fe")then
                                sram_adds<=temp;
                                temp:=temp+1;
                                btermn<='0';
                                readyn<='0';
                                state<=s1;
                            elsif(temp=X"ff")then
                                sram_adds<=temp;
                                btermn<='1';
                                readyn<='1';
                                state<=s0;
                            else
                                sram_adds<=temp;
                                temp:=temp+1;
                                btermn<='1';
                                readyn<='0';
                                state<=s1;
                            end if;
                        else
                            state<=s2;
                        end if;
             when s2=>sramoen<='0';
                      sramcsn<='0';
                     if((not lwdrn) and (not blastn) and sa)then
                        sram_adds<=temp;
                        readyn<='1';
                        btermn<='1';
                        state<=s0;
                    elsif((not lwdrn) and blastn and sa)then
                        if(temp=X"fe")then
                            sram_adds<=temp;
                            temp:=temp+1;
                            btermn<='0';
                            readyn<='0';
                            state<=s2;
                        elsif(temp=X"ff")then
                            sram_adds<=temp;
                            btermn<='1';
                            readyn<='1';
                            state<=s0;
                        else
                            sram_adds<=temp;
                            temp:=temp+1;
                            btermn<='1';
                            readyn<='0';
                            state<=s2;
                        end if;
                    else
                     state<=s2;
                    end if;
       when others =>state<=s0;
      end case;
      end if;
      end process;
      end behavioral ;

我找不到解决方案请帮帮我。弹出的错误:

  

COMP96编译体系结构“行为”的实体“sramctrl”
   COMP96 ERROR COMP96_0019:“预期关键字'结束'。” “design.vhd”18 9
  COMP96 ERROR COMP96_0019:“预期关键字'结束'。” “design.vhd”19 3
  COMP96 ERROR COMP96_0016:“设计单位声明预期。” “design.vhd”

1 个答案:

答案 0 :(得分:1)

没有你的语法不正确。

Amir指出:

process(clk,adsn,blastn,lwdrn,lhold,adds_in,adds_4msb)
begin
    variable sa:std_logic:='0';
    variable a31_a28 :std_logic_vector(3 downto 0):="0000";
    variable temp:std_logic_vector(9 downto 2):="00000000";

应该是:

process(clk,adsn,blastn,lwdrn,lhold,adds_in,adds_4msb)
    variable sa:std_logic:='0';
    variable a31_a28 :std_logic_vector(3 downto 0):="0000";
    variable temp:std_logic_vector(9 downto 2):="00000000";
begin

begin将流程声明部分与流程声明部分分开。

另外,这里:

        if ((not adsn) and (adds_4msb="0000"))then    

没有and运算符ANDs std_logic和boolean(右表达式的结果)。not不是逻辑简化运算符,在这种情况下返回std_logic。 / p>

应该是:

        if adsn = '0' and adds_4msb = "0000" then

哪两个和两个布尔结果。请注意更正的adds_4msb拼写。

下一行:

        a31_28 := adds_4msb; 

有拼写错误,应该是a31_a28。

在这里::

        if lhold = '1' then
            lholda <= '1';
        else
             lholda <= '0';
        end if;
        sa := lhold and lholda ;

lholda是一个输出,在某些工具中,无法读取符合IEEE Std 1076-2008标准的工具。它还会产生一个sa,它只是延迟了一个delta模拟周期(没有时间推进),并且没有任何意义可以在holda结束sa或者关闭{delta}周期lhold的开头。如果你指望那个三角形循环保持不在那里你有一个有缺陷的设计。 Delta周期模拟并行性,并且不应计算变量的时序关系。这意味着您没有合成符合条件的sram_ctl模型。综合将lholdlholda视为同一个,而sa则视为同一事物的不同名称。

下面:

                                ready<='0';

您的设计中没有信号ready

                        if(lwdrn and (not blastn) and sa)then

以及:

                        elsif(lwdrn and blastn and sa)then

您正在尝试使用逻辑运算符生成布尔条件。 (所有这些括号也是冗余的)尝试将两个表达式条件测试为std_logic值。

这两个条件各显示两个地方。

                                temp:=temp+1;

没有添加运算符“+”直接可见(两个地方)。您应该使用包std_logic_unsigned或temp应该是无符号的,您应该使用包numeric_std(在分配给sram_adds时需要进行类型转换)。