VHDL如何用元件例化的方法设计双向移位寄存器

初学VHDL,编写程序如下
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity d is
Port(din,cp : in std_logic;
q: out std_logic
);
end d;

architecture Beh of d is
begin
process(cp)
begin
if(cp'EVENTand cp='1' ) then
q<=din;
endif;
endprocess;

end Beh;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity y1 is
Port ( q0 : out std_logic_vector(7 downto 0);
s : in std_logic;
di,clk : in std_logic);
end y1;

architecture Behavioral of y1 is
componentd
Port(din,cp : in std_logic;
q : out std_logic
);
endcomponent;

signalz: std_logic_vector(8 downto 0);

begin
process(clk)
begin

ifs='0' then
z(0)<=di;
g1:fori in 0 to 7 generate
u1:d port map(z(i),clk,z(i+1));
endgenerate g1;
q0<=z(8downto 1);

else
z(8)<=di;
g2:fori in 7 to 0 generate
u2:d port map(z(i+1),clk,z(i));
endgenerate g2;
q0<=z(7downto 0);
endif;
end process;
end Behavioral;

运行会失败,虽然知道是生成语句不能用在process下的原因 但是不知道怎么改
还是说双向寄存器这种需要选择分支的本来就不能用并行语句来做呢
求指导

VHDL规定,并行语句之间不存在因果关系,因而并行语句没有书写顺序;而顺序语句必须按照因果关系来描述,是有顺序的。
如果要用并行语句来描述硬件,则不能考虑并行语句之间的顺序问题。所以在进程体中,不能出现并行语句。
你描述的硬件想要用8个D触发器来实现是不现实的。应当使用16个D触发器,其中8个用于左移,其余8个用于右移,然后用s信号控制输入信号di进入到左移寄存器的输入端还是进入到右移寄存器的输入端,同时控制是将左移寄存器的输出送至q,还是将右移寄存器的输出送至q。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答