Vhdl 我的波形中有一个时钟周期的信号错误
我有这个计划 我必须为它编写结构VHDL设计 这些是我的组成部分: 多路复用器:Vhdl 我的波形中有一个时钟周期的信号错误,vhdl,fpga,xilinx,Vhdl,Fpga,Xilinx,我有这个计划 我必须为它编写结构VHDL设计 这些是我的组成部分: 多路复用器: IEEE库; 使用IEEE.STD_LOGIC_1164.all; 实体多路复用器是 港口( A:标准逻辑向量(7到0); B:标准逻辑向量(7到0); Sel:以位表示; Z:输出标准逻辑向量(7到0) ); 端多路复用器; mux的架构是 开始 Z regB_out, Sel=>S1, Z=>mux1_res ); RegA:实体注册(Beh) 港口地图 ( LD=>LDA, C=>CLK, Reg_in=>
IEEE库;
使用IEEE.STD_LOGIC_1164.all;
实体多路复用器是
港口(
A:标准逻辑向量(7到0);
B:标准逻辑向量(7到0);
Sel:以位表示;
Z:输出标准逻辑向量(7到0)
);
端多路复用器;
mux的架构是
开始
Z regB_out,
Sel=>S1,
Z=>mux1_res
);
RegA:实体注册(Beh)
港口地图
(
LD=>LDA,
C=>CLK,
Reg_in=>mux1_res,
R_out=>regA_out
);
Mux2:实体mux(Beh)
港口地图
(
A=>regA_out,
B=>Y,
Sel=>S0,
Z=>mux2_res
);
RB LDB,
C=>CLK,
Reg_in=>mux2_res,
R_out=>regB_out
);
end Beh;
我不确定我是否正确地编写了RB、regB_out和B之间的bind。在S1和S0都等于0的波形中,我得到了1个CLK周期的不存在。就像在RB上600ns'01'的屏幕截图上不应该出现的那样。有人能帮我找出错误吗
试验台:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use IEEE.numeric_std.all;
ENTITY tbt is
END tbt;
ARCHITECTURE behavior OF tbt IS
COMPONENT TOP
PORT (
CLK : in STD_LOGIC;
LDA, LDB, S1, S0 : in bit;
X, Y : in STD_LOGIC_VECTOR(7 downto 0);
RB : out STD_LOGIC_VECTOR(7 downto 0)
);
END COMPONENT;
signal CLK_sig : std_logic;
signal LDA_sig, LDB_sig, S1_sig, S0_sig : bit :='0';
signal X_sig, Y_sig, RB_sig : std_logic_vector(7 downto 0):="00000000";
constant CLK_period : time := 100 ns;
constant s_per : time := 50 ns;
begin
-------------------------------------------------------------
uut: TOP PORT MAP (
CLK => CLK_sig,
LDA => LDA_sig,
LDB => LDB_sig,
S1 => S1_sig,
S0 => S0_sig,
X => X_sig,
Y => Y_sig,
RB=> RB_sig
);
-------------------------------------------------------------
CLK_process :process
begin
CLK_sig <= '0';
wait for CLK_period/2;
CLK_sig <= '1';
wait for CLK_period/2;
end process;
-------------------------------------------------------------
stim_proc: process
variable itertion_backwards : integer := 255;
variable itertion_forward : integer := 0;
begin
wait for CLK_period;
for itertion_forward in 0 to 254 loop
X_sig <= STD_LOGIC_VECTOR(TO_SIGNED(INTEGER(itertion_forward),8));
Y_sig <= STD_LOGIC_VECTOR(TO_SIGNED(INTEGER(itertion_backwards),8));
wait for CLK_period;
S1_sig<= not S1_sig;
wait for CLK_period;
S0_sig<= not S0_sig;
wait for CLK_period;
LDA_sig<= not LDA_sig;
wait for CLK_period;
LDB_sig<= not LDB_sig;
itertion_backwards := itertion_backwards - 1;
end loop;
wait;
end process;
end;
IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.std\u logic\u signed.all;
使用IEEE.numeric_std.all;
实体技术性贸易壁垒是
末端技术性贸易壁垒;
tbt的体系结构行为是
组件顶部
港口(
CLK:标准逻辑中;
LDA、LDB、S1、S0:以位为单位;
十、 Y:标准逻辑向量(7到0);
RB:out标准逻辑向量(7到0)
);
端部元件;
信号时钟信号:标准逻辑;
信号LDA_sig、LDB_sig、S1_sig、S0_sig:位:='0';
信号X_-sig、Y_-sig、RB_-sig:std_逻辑_向量(7到0):=“00000000”;
恒定时钟周期:时间=100纳秒;
每小时的常数s_:=50纳秒;
开始
-------------------------------------------------------------
uut:顶级端口图(
时钟=>时钟信号,
LDA=>LDA_信号,
LDB=>LDB_信号,
S1=>S1_信号,
S0=>S0_信号,
X=>X_sig,
Y=>Y_sig,
RB=>RB_信号
);
-------------------------------------------------------------
CLK_流程:流程
开始
CLK_sig为什么使用bit
type?请尝试使用std_logic
。在同步系统中,LDA
、LDB
、S0
和S1
的长度应为时钟周期的倍数。注意CLK_sig
上的后缀等。您的错误似乎在于未提供的测试台。600纳秒时的转换是由于当S0变化时,LDA
有效(在相同的增量周期内,CLK
变为“1”)导致的。如果显示了
regA_out,这一点就很明显了。从寄存器活动时钟边缘偏移刺激。实体mux
和reg
在top
中不可见,而不使用work.all代码>或所选名称(例如实体工作.reg
),什么模拟器?谢谢回答。我将我的测试台添加到我的帖子中。昨晚我在测试台上修复了这个问题,在给Y_sig赋值之后,有一个等待CLK_的周期,我在LDB_sig赋值之后移动了它,去掉了那个“01”。但我的主要观点是关于这个'01'是,同时当LDA为1时,LDB也为1,所以它应该将Y_信号直接带到REG_B并在RB输出上。像这样,“01”存储在REG_A,但它不应该在输出RB上。或者它的发生是因为没有延迟,它捕捉到了这个'01',因为S0下降与CLK上升同步?你应该继续阅读。如果您不想处理它,请确保您的所有信号都在时钟边缘发生变化,并使用等待上升沿(CLK)代码>同样在你的测试台上,我甚至不知道这样的东西存在。谢谢:)
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity reg is
port(
C : STD_LOGIC;
LD : in bit;
Reg_in : in STD_LOGIC_VECTOR(7 downto 0);
R_out : out STD_LOGIC_VECTOR(7 downto 0)
);
end reg;
architecture Beh of reg is
begin
process (C)
begin
if (rising_edge (C)) then
if (LD = '1') then
R_out <= Reg_in;
end if;
end if;
end process;
end Beh;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity top is
port(
LDA, LDB, S1, S0 : in bit;
CLK : in STD_LOGIC;
X, Y : in STD_LOGIC_VECTOR(7 downto 0);
RB : out STD_LOGIC_VECTOR(7 downto 0)
);
end top;
architecture Beh of top is
signal regB_out : STD_LOGIC_VECTOR(7 downto 0);
signal regA_out : STD_LOGIC_VECTOR(7 downto 0);
signal mux1_res : STD_LOGIC_VECTOR(7 downto 0);
signal mux2_res : STD_LOGIC_VECTOR(7 downto 0);
begin
Mux1: entity mux(Beh)
port map
(
A => X,
B => regB_out,
Sel => S1,
Z => mux1_res
);
RegA: entity reg(Beh)
port map
(
LD => LDA,
C => CLK,
Reg_in => mux1_res,
R_out => regA_out
);
Mux2: entity mux(Beh)
port map
(
A => regA_out,
B => Y,
Sel => S0,
Z => mux2_res
);
RB<=regB_out;
RegB: entity reg(Beh)
port map
(
LD => LDB,
C => CLK,
Reg_in => mux2_res,
R_out => regB_out
);
end Beh;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use IEEE.numeric_std.all;
ENTITY tbt is
END tbt;
ARCHITECTURE behavior OF tbt IS
COMPONENT TOP
PORT (
CLK : in STD_LOGIC;
LDA, LDB, S1, S0 : in bit;
X, Y : in STD_LOGIC_VECTOR(7 downto 0);
RB : out STD_LOGIC_VECTOR(7 downto 0)
);
END COMPONENT;
signal CLK_sig : std_logic;
signal LDA_sig, LDB_sig, S1_sig, S0_sig : bit :='0';
signal X_sig, Y_sig, RB_sig : std_logic_vector(7 downto 0):="00000000";
constant CLK_period : time := 100 ns;
constant s_per : time := 50 ns;
begin
-------------------------------------------------------------
uut: TOP PORT MAP (
CLK => CLK_sig,
LDA => LDA_sig,
LDB => LDB_sig,
S1 => S1_sig,
S0 => S0_sig,
X => X_sig,
Y => Y_sig,
RB=> RB_sig
);
-------------------------------------------------------------
CLK_process :process
begin
CLK_sig <= '0';
wait for CLK_period/2;
CLK_sig <= '1';
wait for CLK_period/2;
end process;
-------------------------------------------------------------
stim_proc: process
variable itertion_backwards : integer := 255;
variable itertion_forward : integer := 0;
begin
wait for CLK_period;
for itertion_forward in 0 to 254 loop
X_sig <= STD_LOGIC_VECTOR(TO_SIGNED(INTEGER(itertion_forward),8));
Y_sig <= STD_LOGIC_VECTOR(TO_SIGNED(INTEGER(itertion_backwards),8));
wait for CLK_period;
S1_sig<= not S1_sig;
wait for CLK_period;
S0_sig<= not S0_sig;
wait for CLK_period;
LDA_sig<= not LDA_sig;
wait for CLK_period;
LDB_sig<= not LDB_sig;
itertion_backwards := itertion_backwards - 1;
end loop;
wait;
end process;
end;