与选择相关的VHDL错误

时间:2013-03-24 12:47:53

标签: vhdl

我正在制作一个N到2 ^ N的解码器并面临一些错误。请帮帮我。

  • Naddr - 地址位数整数

  • addr - 地址位std_logic_vector

  • fbd - (整数,std_logic_vector) - 转换函数 二进制到十进制

  • fpower - (整数) - 提供2 ^ N的函数

代码:

Architecture deco of Deco is   
begin  

process(addr, En)  
  variable a : integer;  
begin  
  a := fbd(Naddr, addr);  
  if(En = '1') then  
    q <= (a => '1', others => '0'); --- error1           
  elsif(En = '0') then  
    q <= (fpower(Naddr)-1 downto 0 => '0');  
  end if;  
end process;  

end deco;

我得到的错误是:

  

1)错误(10318):Deco.vhd(33)处的VHDL聚合错误:必须选择   常量(error1)

     

2)错误:无法详细说明顶级用户层次结构

2 个答案:

答案 0 :(得分:1)

这是正确的VHDL(假设Naddr是常数)并且将在模拟中工作。 (它不是好的 VHDL,但这是另一回事)

然而,它无法通过当前的综合工具转换为工作硬件:考虑您想要将一位连接到'1',但是在电路完成并通电之前您不知道哪个位...这样的硬件看起来像什么?使用简单的逻辑元素在纸上画出来。

放弃?

现在设计一个简单的电路,可以将ANY位设置为'1',具体取决于每个位的“if”条件......

process(addr, En)
variable a : integer;
begin
    a := fbd(Naddr, addr);  
    if En = '1' then  
       q <= (others => '0');
       for i in q'range loop
          if i = a then
             q(i) <= '1';
          end if;
       end loop;
    end if;
end process;

由于这一切都发生在一个进程中,因此这里只有一个Q驱动程序,尽管Q有多个赋值。

您还必须了解时钟进程的好处,但不在此答案中。

答案 1 :(得分:0)

在行中:

q <= (a => '1', others => '0'); --- error1

假设q是位向量,并且在执行该语句时'a'的值是4.然后你说除了第4位以外的所有位都是0.使'q [4] = 1' 。 但是,VHDL不允许将位的位置指定为变量。它的价值必须在编译时知道。因此,这可以是常量或通用参数,但不是信号或变量。

你似乎正在接近像C编程这样的VHDL ......使用日志,整数等制作一个简单的解码器是一个坏主意。有关简单的8到256位解码器,请参阅this链接