VHDL有没有更清晰的方法来设置特定位,给定位数?

时间:2015-04-06 04:11:14

标签: vhdl

给定一个位数,我试图在std_logic_vector中设置该位。这是为了一次切换一个时钟输出。

首先,我完全放弃了sll,或SHIFT_LEFT,这似乎是显而易见的方法,但完全不起作用。

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;

这样做有更好或更清晰的语法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

第二个使用整数来无符号转换:

v_cmd_clk_1 <= std_logic_vector(to_unsigned(2**(to_integer(unsigned(s_proc_chan(2 downto 0)))+4)); -- No guarantee on parentheses matching

第三个,使用shift_left

v_cmd_clk_1 <= std_logic_vector(shift_left(resize(unsigned'("1"), v_cmd_clk_1'length), to_integer(unsigned(s_proc_chan(2 downto 0)))+4));

答案 1 :(得分:2)

设置索引给出的单个位的原理,就像你已经做的那样,很好,它显示了代码的意图,它设置了索引给出的位。

通过使用其他+ 4范围可以消除std_logic_vector偏移,但是一个不错的综合工具可以消除偏移,因此不会实现添加操作。

无论如何,作为评论的答案,+ 4可以被消除,如果std_logic_vector直接被解决到0到7,而不是4到11,最后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不允许这用于合成,因为它需要聚合中的常量选择值。使用shift2**将合成。

请注意,初始清算更为通用:

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