与选项相关的VHDL错误

与选项相关的VHDL错误,vhdl,Vhdl,我正在制作一个N到2^N的解码器,并且面临一些错误。请帮帮我 Naddr-地址位数整数 addr-地址位std\u逻辑\u向量 fbd-(整数,std\u逻辑\u向量)-用于从 二进制到十进制 fpower-(整数)-提供2^N的函数 代码: 德科的建筑装饰是 开始 过程(地址,En) 变量a:整数; 开始 a:=fbd(Naddr,addr); 如果(En='1'),则 q'1',其他=>'0');--错误1 elsif(En='0')然后 q‘0’; 如果结束; 结束过程; 端装饰;

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

  • Naddr
    -地址位数整数

  • addr
    -地址位
    std\u逻辑\u向量

  • fbd
    -(整数,
    std\u逻辑\u向量
    )-用于从 二进制到十进制

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

代码:

德科的建筑装饰是
开始
过程(地址,En)
变量a:整数;
开始
a:=fbd(Naddr,addr);
如果(En='1'),则
q'1',其他=>'0');--错误1
elsif(En='0')然后
q‘0’;
如果结束;
结束过程;
端装饰;
我得到的错误是:

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

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

行中:

q <= (a => '1', others => '0'); --- error1
q'1',其他=>'0');--错误1
假设q是一个位向量,执行该语句时'a'的值为4。那么你是说把除第4位之外的所有位都设为0。使“q[4]=1”。 但是,VHDL不允许将位的位置指定为变量。它的价值必须在编译时知道。所以这可以是一个常量,或者一个通用参数,但不是一个信号或变量

你似乎正在接近VHDL一样的C编程。。。使用日志、整数等来制作简单的解码器是个坏主意。有关简单的8到256位解码器,请参见链接。这是正确的VHDL(假设Naddr为常数),将在模拟中工作。(这不是很好的VHDL,但那是另一回事)

然而,它不能被当前的合成工具转化为工作硬件:考虑到你想把一个比特线连接到“1”,但是你不知道哪个位子是直到电路完成并加电为止…这样的硬件是什么样子的?用简单的逻辑元素在纸上画出来

放弃

现在设计一个简单的电路,可以根据每个位的“如果”条件将任意位设置为“1”

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;
过程(addr,En)
变量a:整数;
开始
a:=fbd(Naddr,addr);
如果En='1',则
q‘0’;
对于q'范围循环中的i
如果i=a,那么

q(i)是的,谢谢你的解决方案………我在某种程度上做了与你的链接相同的事情……。但是感谢你让我的VHDL概念更清晰……。非常感谢……。非常感谢……)但是我为什么不能简单地写q(a)而不是做一个循环呢因为在生成进入FPGA的逻辑时,您手中没有“a”的值!除非“a”是常量,否则在这种情况下,请将其声明为常量而不是变量。
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;