-1

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

  • Naddr- 地址位数整数

  • addr- 地址位std_logic_vector

  • fbd- (integer, 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) 错误:无法详细说明顶级用户层次结构

4

2 回答 2

1

这是正确的 VHDL(假设 Naddr 是常数)并且可以在仿真中工作。(这不是好的VHDL,但那是另一回事)

但是,当前的综合工具无法将其转换为工作硬件:考虑您想将一位连接到“1”,但在电路完成并通电之前您不知道那是哪一位……这样的一块硬件长什么样?使用简单的逻辑元素在纸上画出来。

放弃?

现在设计一个简单的电路,可以根据每个位的“if”条件将任何位设置为“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;

由于这一切都发生在一个进程中,因此这里只有一个用于 Q 的驱动程序,尽管事实上有多个分配给 Q。

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

于 2013-03-24T13:37:03.190 回答
0

在行中:

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

假设 q 是一个位向量,并且在执行此语句时“a”的值为 4。那么您说的是使除第 4 位之外的所有位为 0。使“q[4] =1”。但是,VHDL 不允许将位的位置指定为变量。在编译时必须知道它的值。所以这可以是一个常数,也可以是一个通用参数,但不能是一个信号或变量。

您似乎正在像 C 编程一样接近 VHDL……使用日志、整数等来制作简单的解码器是个坏主意。请参阅链接以获取简单的 8 至 256 位解码器

于 2013-03-24T13:34:39.123 回答