我知道这是基本知识,但是我很难把它付诸实践。我正在从IO引脚“读取”,我想将这些位“保存”在一个简单的缓冲区中。由于某种原因,我在输出中没有得到任何东西。这是我正在运行的代码和点阵式的网表分析器,以及通过运行测试台获得的波形。我尝试应用在其他代码中看到的内容,但是没有用。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity InputBuffer is
generic( n: natural := 4 );
Port (
clk : in STD_LOGIC;
CLK65 : IN STD_LOGIC;
En : in STD_LOGIC;
STRT : OUT STD_LOGIC;
Ipin : in STD_LOGIC_VECTOR (n-1 downto 0);
Output : out STD_LOGIC_VECTOR (n-1 downto 0)
);
end InputBuffer;
architecture Behavioral of InputBuffer is
signal temp : STD_LOGIC_VECTOR(n-1 downto 0);
SIGNAL CLK2 : STD_LOGIC;
begin
-- invert the signal from the push button switch and route it to the LED
process(clk, En)
begin
if( En = '1') then
temp <= B"0000";
elsif rising_edge(clk) then
temp <= Ipin;
end if;
end process;
Output <= temp;
STRT <= CLK65;
end Behavioral;
这是我正在使用的测试平台。
-- VHDL Test Bench Created from source file InputBuffer.vhd -- Fri Jun 29 22:45:57 2018
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE behavior OF testbench IS
COMPONENT InputBuffer
PORT(
clk : IN std_logic;
CLK65 : IN std_logic;
En : IN std_logic;
Ipin : IN std_logic_vector(3 downto 0);
STRT : OUT std_logic;
Output : OUT std_logic_vector(3 downto 0)
);
END COMPONENT;
SIGNAL clk : std_logic;
SIGNAL CLK65 : std_logic;
SIGNAL En : std_logic;
SIGNAL STRT : std_logic;
SIGNAL Ipin : std_logic_vector(3 downto 0);
SIGNAL Output : std_logic_vector(3 downto 0);
constant delay : time := 10 ns;
BEGIN
-- Please check and add your generic clause manually
uut: InputBuffer PORT MAP(
clk => clk,
CLK65 => CLK65,
En => En,
STRT => STRT,
Ipin => Ipin,
Output => Output
);
En <= '0';
clk <= '0';
clk65 <= '0';
Ipin <= B"0000";
-- *** Test Bench - User Defined Section ***
tb : PROCESS
BEGIN
wait for delay;
clk <='1';
clk65 <='1';
wait for delay;
clk <='0';
wait for delay;
clk <='1';
clk65 <='0';
wait for delay;
clk <='0';
--wait; -- will wait forever
END PROCESS;
-- *** End Test Bench - User Defined Section ***
END;
答案 0 :(得分:1)
将测试平台添加到您的问题中提供了Minimal, Complete and Verifiable example。
对于我们中那些无法准确解释波形显示的人来说,将彩色版本与光标一起显示移至波形关键部分的值可能会有所帮助:
在此波形显示中,我们看到标量信号(clk等)在您的莱迪思工具链中显示为``X'',并显示为``X''的红色矩形(上面的波形由gtkwave和ghdl完成)。 / p>
时钟在“ X”和“ 0”之间变化,这告诉我们测试台中有两个clk驱动程序,而当两个驱动程序都驱动“ 0”时显示“ 0”。
通过在过程中分配信号来创建驱动程序。
并发信号分配被细化为等效过程(IEEE Std 1076-2008 11.6并发信号分配语句 “并发信号分配语句表示为信号分配值的等效过程语句。”其敏感度列表由10.2 Wait语句确定“此规则还用于在并发过程调用语句(11.4),并发断言语句(11.5)和并发信号分配语句的等效过程语句中构造wait语句的敏感性集。 (11.6)。”。
具有多个驱动器的信号值由14.7.3.2驱动值中确定:
e)如果S是基本信号:
...
—如果S是一个已分解的信号且具有一个或多个信号源,则将检查S信号源的驱动值。如果这些驱动值中的任何一个是一个组合,其中一个或多个子元素值由空事务确定(请参见10.5.2.2),而一个或多个子元素值不是由空事务确定,则这是错误的。如果S是信号种类寄存器,并且S的所有源都具有由空事务确定的值,则S的驱动值与其先前值保持不变。否则,通过执行与S关联的分辨率函数来获得S的驱动值,其中使用输入参数调用该函数,该输入参数由S来源的驱动值的级联组成,任何来源的值除外的S,其当前值由无效交易确定。
在IEEE软件包std_logic_1164中找到了std_logic类型的解析函数。
那么clk(和clk64)的两个驱动程序在哪里?
En <= '0';
clk <= '0';
clk65 <= '0';
Ipin <= B"0000";
-- *** Test Bench - User Defined Section ***
tb : PROCESS
BEGIN
wait for delay;
clk <='1';
clk65 <='1';
wait for delay;
clk <='0';
wait for delay;
clk <='1';
clk65 <='0';
wait for delay;
clk <='0';
--wait; -- will wait forever
END PROCESS;
在进程tb的紧上方,有四个并发的赋值语句。可以将引起多个驱动程序的两个注释(clk和clk64)注释掉,而无需在信号声明中使用初始值,因为您是在过程中强制使用它们的值。
如果我们注释掉clk和clk65的并发信号分配,则您的测试台可以工作: