2015-04-06 54 views
1

给定一个位数,我试图在std_logic_vector中设置该位。这是为了一次切换一个时钟输出。VHDL给定位数,是否有更清晰的方法来设置特定位?

首先,我已经完全放弃了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; 

是否有更好或更干净的语法来做到这一点?

谢谢。

+0

如果你经常处理难看的类型转换那么现在是时候,如果你使用的是正确类型的信号进行评估。 's_proc_chan'可能更适合作为'无符号'或整数记录元素,而不是更大矢量的片段。 – 2015-04-06 16:45:57

回答

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)); 
+0

谢谢。我会给这些候补者一个尝试。 – NXT 2015-04-07 14:55:09

2

设置单个比特给出的原理通过索引,就像你已经做的那样,没问题,并且它显示了代码的意图,这是由索引给定的。

通过使用其他std_logic_vector范围可以消除+ 4偏移量,但是一个体面的综合工具消除了偏移量,所以不执行加法操作。

无论如何,正如答案的评论,所述+ 4可以如果std_logic_vector被直接寻址到0到7,而不是寻址4至11消除,并且最后4个'0' S可只被postpended,如:

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'); 
+0

谢谢。你会如何消除+4? – NXT 2015-04-07 14:55:56

+0

@NXT:有关如何消除“+ 4”的更多信息,请参阅更新。 – 2015-04-07 15:10:01

+0

我明白了,谢谢。 – NXT 2015-04-07 22:31:34

相关问题