我不知道为什么它显示错误,尽管语法似乎是正确的。
我正在尝试编写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”
答案 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模型。综合将lhold
和lholda
视为同一个,而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
时需要进行类型转换)。