Vhdl 在给定位号的情况下,有没有更干净的方法来设置特定的位?

Vhdl 在给定位号的情况下,有没有更干净的方法来设置特定的位?,vhdl,Vhdl,给定一个位号,我试图在std_逻辑_向量中设置该位。这是用于一次切换一个不同的时钟输出 首先,我已经完全放弃了sll,或者左移,这似乎是显而易见的方法,但完全不起作用 variable v_cmd_clk_1: std_logic_vector(11 downto 0); ... --- set bit number "s_proc_chan", plus 4, in v_cmd_clk_1 v_cmd_clk_1 := "0000" & "0000" & "0000"; v

给定一个位号,我试图在std_逻辑_向量中设置该位。这是用于一次切换一个不同的时钟输出

首先,我已经完全放弃了sll,或者左移,这似乎是显而易见的方法,但完全不起作用

variable v_cmd_clk_1: std_logic_vector(11 downto 0);

...

--- set bit number "s_proc_chan", plus 4, in v_cmd_clk_1
v_cmd_clk_1 := "0000" & "0000" & "0000";
v_cmd_clk_1( to_integer ( unsigned(s_proc_chan(2 downto 0))) + 4  ) := '1';

...
-- And then later on in the process assign it to an actual signal
cmd_clk <= v_cmd_clk_0;
是否有更好或更干净的语法来执行此操作


谢谢。

给你三条建议。第一种方法使用聚合:

v_cmd_clk_1 <= (to_integer(unsigned(s_proc_chan(2 downto 0)))+4) => '1', others => '0');

给你三个建议。第一种方法使用聚合:

v_cmd_clk_1 <= (to_integer(unsigned(s_proc_chan(2 downto 0)))+4) => '1', others => '0');

正如您已经做过的那样,设置索引给定的单个位的原理很好,它显示了代码的意图,即设置索引给定的位

可以通过使用其他std_逻辑_向量范围来消除+4偏移,但适当的合成工具会消除偏移,因此不会执行加法操作

无论如何,作为对评论的回答,如果std_逻辑_向量直接寻址到0到7,而不是寻址到4到11,那么+4可以被消除,最后的4'0可以被延迟,如:

variable v_cmd_clk_1    : std_logic_vector(11 downto 0);
variable v_cmd_clk_upper: std_logic_vector( 7 downto 0);
...
v_cmd_clk_upper := (others => '0');
v_cmd_clk_upper(to_integer(unsigned(s_proc_chan(2 downto 0)))) := '1';
v_cmd_clk_1 := v_cmd_clk_upper & "0000";
Jonathan Drolet建议的聚合看起来不错,但例如Altera Quartus II不允许这种合成,因为它需要聚合中的常量选择值。使用shift或2**将合成

请注意,初始清算更一般,包括:

v_cmd_clk_1 := (others => '0');

正如您已经做过的那样,设置索引给定的单个位的原理很好,它显示了代码的意图,即设置索引给定的位

可以通过使用其他std_逻辑_向量范围来消除+4偏移,但适当的合成工具会消除偏移,因此不会执行加法操作

无论如何,作为对评论的回答,如果std_逻辑_向量直接寻址到0到7,而不是寻址到4到11,那么+4可以被消除,最后的4'0可以被延迟,如:

variable v_cmd_clk_1    : std_logic_vector(11 downto 0);
variable v_cmd_clk_upper: std_logic_vector( 7 downto 0);
...
v_cmd_clk_upper := (others => '0');
v_cmd_clk_upper(to_integer(unsigned(s_proc_chan(2 downto 0)))) := '1';
v_cmd_clk_1 := v_cmd_clk_upper & "0000";
Jonathan Drolet建议的聚合看起来不错,但例如Altera Quartus II不允许这种合成,因为它需要聚合中的常量选择值。使用shift或2**将合成

请注意,初始清算更一般,包括:

v_cmd_clk_1 := (others => '0');

如果您经常处理难看的类型转换,那么是时候评估您是否为信号使用了正确的类型。s_proc_chan可能更适合作为无符号或整数记录元素,而不是更大向量的切片。如果您经常处理难看的类型转换,那么是时候评估您是否为信号使用了正确的类型了。s_proc_chan可能更适合作为无符号或整数记录元素,而不是更大向量的切片。谢谢。我会试试那些替代品。谢谢。我会试试那些替代品。谢谢。您将如何消除+4?@NXT:关于如何消除+4,请参阅答案中的更新。谢谢。您将如何消除+4?@NXT:请参阅答案中的更新以了解如何消除+4。