如何将std_logic_vector的一位赋值给1,其他赋值给0

How to assign one bit of std_logic_vector to 1 and others to 0

我从外部 std_logic_vector 接收到二进制值,表示应设置为 1 的位,其他位应设置为 0。据我所知,它是解码器,但用 [=17 解决了这个问题=] 语句将占用大量代码行,而且它不可重新配置。

示例:

signal number : std_logic_vector(7 downto 0); 
signal output : std_logic_vector(255 downto 0);

output <= output(to_integer(unsigned(number))) and (others=>'0');

有很多方法可以做到这一点。可以模拟所有(句法和语义上有效的)方式。有些可以合成,有些则不能,但因为这取决于你的合成器,所以很难说。首先,我们将output重命名为resultoutput不是VHDL语言的关键字,而是std.textio包中定义的标准输出流的名称。因此最好避免将其用作用户标识符。

  1. 具有可变和寻址位的过程(练习:学习聚合符号并理解(others => '0')):

    process(number)
        variable tmp: std_logic_vector(255 downto 0);
    begin
        tmp := (others => '0');
        tmp(to_integer(unsigned(number))) := '1';
        result <= tmp;
    end process;
    
  2. 不带中间变量的等效项(练习:研究信号分配并理解其工作原理):

    process(number)
    begin
        result <= (others => '0');
        result(to_integer(unsigned(number))) <= '1';
    end process;
    
  3. 在 VHDL 2002 中使用桶形移位器进行处理(您的工具可能仍不支持):

    architecture foo of bar is
        ...
        constant one: std_logic_vector(255 downto 0) := (0 => '1', others => '0');
        ...
    begin
        ...
        process(number)
        begin
            result <= one sll to_integer(unsigned(number));
        end process;
        ...
    end architecture foo;
    
  4. VHDL 2002中桶形移位器的并发信号分配(练习:理解并发信号分配是进程,想象一下等效的进程):

    architecture foo of bar is
        ...
        constant one: std_logic_vector(255 downto 0) := (0 => '1', others => '0');
        ...
    begin
        ...
        result <= one sll to_integer(unsigned(number));
        ...
    end architecture foo;