我有一个8位逻辑向量,应该转移到输出。
constant CR:std_logic_vector:(7 downto 0):="11000000";
我正在尝试使用CR的索引和属于指定索引的每个值...
Q<=CR(i);
我通过if语句将i计数为0到7以实现移位。但我对此有些怀疑。我正确的方式吗?或者有更好的方法来做这个,如移动功能。 (当然thiş操作应该与时钟同步,以便能够合成。)
我是VHDL的新手,所以感谢您的回复。
答案 0 :(得分:1)
不,真的,我对你的问题的评论并不是对你接受答案的征求,对于声誉点我并不是那么难,诚实。
我的意思是潜在的问题回答者很难为你的问题付出任何努力,而且你的声誉也不会增加。
将一个时钟条件置于循环语句中(与生成语句相反,似乎有点尴尬,所以让我们尝试一个单独的计数器:
library ieee;
use ieee.std_logic_1164.all;
entity shft_log_vec is
port (
rst: in std_logic;
clk: in std_logic;
Q: out std_logic
);
end entity;
architecture foo of shft_log_vec is
constant CR: std_logic_vector (7 downto 0) := "11000000";
signal bit_ctr: natural range CR'REVERSE_RANGE;
begin
Q <= CR(bit_ctr);
INDEX_CTR:
process (clk, rst)
-- uninitialized default value is 0
begin
if rst = '1' then -- will only run after a rst after the first time, use reset
bit_ctr <= 0;
elsif bit_ctr < CR'HIGH and rising_edge(clk) then -- you could add an enable
bit_ctr <= bit_ctr + 1; -- integer arithmetic and comparison.
else
end if;
-- because you need clock evaluation for sequential operation in there, no loop
-- statement. Reverse the bit order by using 'RANGE instead.
end process;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
entity tb_shft_log_vec is
end entity;
architecture foo of tb_shft_log_vec is
signal rst: std_logic := '0';
signal clk: std_logic := '0';
signal Q: std_logic;
begin
DUT:
entity work.shft_log_vec
port map (
rst => rst,
clk => clk,
Q => Q
);
CLOCK:
process
begin
wait for 20 ns;
clk <= not clk;
if Now > 360 ns then
wait;
end if;
end process;
STIMULUS:
process
begin
wait for 1 ns;
rst <= '1';
wait for 20 ns;
rst <= '0';
wait;
end process;
end architecture;
请注意CR
的指针是bit_ctr
,这是一个约束整数,从0到7然后停止。
如果您希望CR
以相反的顺序出现(7先出现),请使用'RANGE
和'LOW
代替'REVERSE_RANGE
和'HIGH.
当模拟测试平台时,我们看到Q的值在每个时钟上升沿CR(0)
到CR(7)
并且停止等待复位。
使用重置,这意味着生成器和接收者都知道要采样Q
的时钟边缘。根据信号Q的路由距离(跨越时钟树边界),切换到发生器和接收器之间的同步复位共享可能是谨慎的。
请注意评论链接中与上一个问题的答案的相似点和不同点。这种使用属性的方式允许您轻松更改CR的大小。