如何将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
重命名为result
:output
不是VHDL语言的关键字,而是std.textio
包中定义的标准输出流的名称。因此最好避免将其用作用户标识符。
具有可变和寻址位的过程(练习:学习聚合符号并理解(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;
不带中间变量的等效项(练习:研究信号分配并理解其工作原理):
process(number)
begin
result <= (others => '0');
result(to_integer(unsigned(number))) <= '1';
end process;
在 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;
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;
我从外部 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
重命名为result
:output
不是VHDL语言的关键字,而是std.textio
包中定义的标准输出流的名称。因此最好避免将其用作用户标识符。
具有可变和寻址位的过程(练习:学习聚合符号并理解
(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;
不带中间变量的等效项(练习:研究信号分配并理解其工作原理):
process(number) begin result <= (others => '0'); result(to_integer(unsigned(number))) <= '1'; end process;
在 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;
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;