我正在制作一个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)错误:无法详细说明顶级用户层次结构
答案 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链接