用VHDL生成通用延迟包
我正在寻找正确的语法来使用泛型和流程中的循环构建泛型行延迟包。我知道当与generate一起使用时,for循环用于并发语句,但肯定有一种方法可以构建它 例如:用VHDL生成通用延迟包,vhdl,Vhdl,我正在寻找正确的语法来使用泛型和流程中的循环构建泛型行延迟包。我知道当与generate一起使用时,for循环用于并发语句,但肯定有一种方法可以构建它 例如: entity Delay_Line is Generic ( CLK_DELAYS : integer := 10); Port ( CLK : in STD_LOGIC; i_Din : in STD_LOGIC; o_Q : out
entity Delay_Line is
Generic (
CLK_DELAYS : integer := 10);
Port (
CLK : in STD_LOGIC;
i_Din : in STD_LOGIC;
o_Q : out STD_LOGIC;
o_Qnot : out STD_LOGIC);
end Delay_Line;
architecture Delay_Line_arch of Delay_Line is
signal din_dly : std_logic_vector(CLK_DELAYS-1 downto 0);
begin
din_dly(0) <= i_Din;
process(CLK)
begin
if rising_edge(CLK) then
for index in 0 to CLK_DELAYS-1 generate
begin
din_dly(index+1) <= din_dly(index);
end;
end if;
end process;
o_Q <= din_dly(CLK_DELAYS);
o_Qnot <= NOT (din_dly(CLK_DELAYS));
end Delay_Line_arch;
实体延迟线为
一般的(
时钟延迟:整数:=10);
港口(
CLK:标准逻辑中;
i_Din:标准逻辑;
输出标准逻辑;
o_Qnot:输出标准逻辑);
终端延迟线;
延迟线的架构延迟线是
信号延迟:标准逻辑向量(时钟延迟-1至0);
开始
din_dly(0)实际上没有必要使用如此复杂的方法来实现移位寄存器。您可以使用数组连接和切片直接在一行中实现它们
恒定延迟\u级:正:=10;--或者使用泛型参数
信号延迟线:标准逻辑向量(1至延迟级);
...
过程(clk)是
开始
如果上升沿(clk),则
延迟线有点晚,但这是我的通用延迟组件:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY generic_delay is
generic (
bus_size : natural;
delay : natural
);
port (
i_Clock : IN STD_LOGIC;
i_reset : IN STD_LOGIC;
i_bus1 : in std_logic_vector(bus_size - 1 downto 0);
i_bus2 : in std_logic_vector(bus_size - 1 downto 0);
o_bus1 : out std_logic_vector(bus_size - 1 downto 0);
o_bus2 : out std_logic_vector(bus_size - 1 downto 0)
);
end generic_delay;
architecture a of generic_delay is
----------------------------
-- SIGNALS DECLARATION
----------------------------
signal temp_bus1 : std_logic_vector(delay*bus_size - 1 downto 0);
signal temp_bus2 : std_logic_vector(delay*bus_size - 1 downto 0);
BEGIN
-----------------------------------------
-- SYNCHRONOUS PROCESS
-----------------------------------------
process(i_Clock, i_reset)
begin
if i_reset = '1' then
temp_bus1 <= (others => '0');
temp_bus2 <= (others => '0');
elsif falling_edge(i_Clock) then
if delay > 1 then
temp_bus1 <= i_bus1 & temp_bus1(delay*bus_size - 1 downto (delay-1)*bus_size);
temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (delay-1)*bus_size);
else
temp_bus1 <= i_bus1;
temp_bus2 <= i_bus2;
end if;
elsif (RISING_EDGE(i_Clock)) then
o_bus1 <= temp_bus1(bus_size - 1 downto 0);
o_bus2 <= temp_bus2(bus_size - 1 downto 0);
end if; -- reset + rising_edge(clk)
end process logic;
-------------------------------------------------------
end a;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体通用_延迟为
一般的(
巴士大小:自然;
延迟:自然
);
港口(
i_时钟:标准逻辑;
i_重置:在标准_逻辑中;
i_bus1:in标准逻辑向量(总线大小-1到0);
i_总线2:标准逻辑向量中(总线大小-1到0);
o_总线1:输出标准逻辑向量(总线大小-1到0);
o_总线2:输出标准逻辑向量(总线大小-1到0)
);
结束一般延迟;
通用延迟的架构是
----------------------------
--信号声明
----------------------------
信号温度总线1:标准逻辑向量(延迟*总线大小-1降为0);
信号温度总线2:标准逻辑向量(延迟*总线大小-1降到0);
开始
-----------------------------------------
--同步过程
-----------------------------------------
进程(i_时钟、i_重置)
开始
如果i_reset='1',则
温度总线1“0”);
温度总线2'0');
如果下降沿(i时钟)那么
如果延迟>1,则
temp_bus1嗯,我还没有50个rep,但要让Pablo R的方法处理大型总线和延迟总线大小:=16
和延迟:=256
。我必须改变:
temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (delay-1)*bus_size);
temp_bus2不清楚您想要什么,这与您发布的内容不同。这就是说,您当前的代码有1或2个错误(编译器会告诉您)串联!我当然应该想到这一点!非常感谢@Kevin Thibedou
temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (delay-1)*bus_size);
temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (bus_size);