在做FPGA的开发过程中经常会使用到移位寄存器,一般我们使用移位寄存器的目的都是为了将某个信号进行打拍,使得时序符合我们的需求。最常见的一种打拍方法就是在process过程语句中对信号进行移位(在verilog中是在always过程中进行移位)。但是这里我给大家介绍一下SRL6E,这个是Xilinx提供的一个原语,顾名思义,这是一个可以最大实现16位移位寄存的移位寄存器。
需要注意的是,SRL16E原语在不同的器件中表现形式可能稍有区别,下面是在Kintex-7系列器件中的SRL16E原语:
–使用原语时,需要加上这两句
Library UNISIM;
use UNISIM.vcomponents.all;
— SRL16E: 16-bit shift register LUT with clock enable operating on posedge of clock (Mapped to SliceM LUT6)
— Kintex-7
— Xilinx HDL Language Template, version 2017.4
–以下时=是SRL16E原语
SRL16E_inst : SRL16E
generic map (
INIT => X”0000″)–对寄存器进行初始化
port map (
Q => Q, — SRL data output–寄存器输出端口
A0 => A0, — Select[0] input–四个地址输入端口
A1 => A1, — Select[1] input
A2 => A2, — Select[2] input
A3 => A3, — Select[3] input
CE => CE, — Clock enable input–寄存器使能端口
CLK => CLK, — Clock input –时钟端口
D => D — SRL data input–寄存器输入端口
);
— End of SRL16E_inst instantiation
这里主要对地址进行一下说明。地址A3A2A1A0表明要对输入数据进行多少移位。如果是A3A2A1A0=“0000”,说明是对D端口输入数据进行1位移位,也就是说对D端口输入的数据进行一个周期的延迟。如果是A3A2A1A0=“1111”,说明是对D端口输入数据进行16位移位。
下面举一个例子来说明:
这是源程序,因为A3A2A1A0=“0011”,所以主要是对输入数据进行4个周期的延迟。
———————————————————————————-
— Company:
— Engineer:
—
— Create Date: 2018/12/10 16:15:05
— Design Name:
— Module Name: srl16e_test – Behavioral
— Project Name:
— Target Devices:
— Tool Versions:
— Description:
—
— Dependencies:
—
— Revision:
— Revision 0.01 – File Created
— Additional Comments:
—
———————————————————————————-
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Library UNISIM;
use UNISIM.vcomponents.all;
— Uncomment the following library declaration if using
— arithmetic functions with Signed or Unsigned values
–use IEEE.NUMERIC_STD.ALL;
— Uncomment the following library declaration if instantiating
— any Xilinx leaf cells in this code.
–library UNISIM;
–use UNISIM.VComponents.all;
entity srl16e_test is
Port (
clk : in std_logic;
data_in : in std_logic;
data_out: out std_logic
);
end srl16e_test;
architecture Behavioral of srl16e_test is
signal q : std_logic:=’0′;
signal d : std_logic:=’0′;
begin
SRL16E_inst : SRL16E
generic map (
INIT => X”0000″)
port map (
Q => q, — SRL data output
A0 => ‘1’, — Select[0] input
A1 => ‘1’, — Select[1] input
A2 => ‘0’, — Select[2] input
A3 => ‘0’, — Select[3] input
CE => ‘1’, — Clock enable input
CLK => clk, — Clock input
D => d — SRL data input
);
d <= data_in;
data_out <= q;
end Behavioral;
这是仿真文件:
仿真文件中的输入数据是一个周期的单脉冲。
———————————————————————————-
— Company:
— Engineer:
—
— Create Date: 2018/12/10 16:52:15
— Design Name:
— Module Name: tb_srl16e – Behavioral
— Project Name:
— Target Devices:
— Tool Versions:
— Description:
—
— Dependencies:
—
— Revision:
— Revision 0.01 – File Created
— Additional Comments:
—
———————————————————————————-
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;
— Uncomment the following library declaration if using
— arithmetic functions with Signed or Unsigned values
–use IEEE.NUMERIC_STD.ALL;
— Uncomment the following library declaration if instantiating
— any Xilinx leaf cells in this code.
library UNISIM;
use UNISIM.VComponents.all;
entity tb_srl16e is
end tb_srl16e;
architecture Behavioral of tb_srl16e is
component srl16e_test
port(
clk : in std_logic;
data_in : in std_logic;
data_out : out std_logic
);
end component;
signal clk :std_logic:=’1′;
signal in_data : std_logic:=’0′;
signal out_data: std_logic:=’0′;
begin
uut: srl16e_test
port map(
clk => clk,
data_in => in_data,
data_out => out_data
);
process
begin
wait for 10 ns;
clk <= ‘0’;
wait for 10 ns;
clk <= ‘1’;
end process;
process
begin
in_data <= ‘0’;
wait for 20 ns;
in_data <= ‘1’;
wait for 20 ns;
in_data <= ‘0’;
wait;
end process;
end Behavioral;
仿真波形:
输入数据是data_in,输出是data_out,可以看到对输入数据进行了4个周期的延迟。
没有回复内容