在做FPGA的開發(fā)過程中經(jīng)常會使用到移位寄存器,,一般我們使用移位寄存器的目的都是為了將某個信號進行打拍,,使得時序符合我們的需求,。最常見的一種打拍方法就是在process過程語句中對信號進行移位(在verilog中是在always過程中進行移位)。但是這里我給大家介紹一下SRL6E,,這個是Xilinx提供的一個原語,,顧名思義,這是一個可以最大實現(xiàn)16位移位寄存的移位寄存器,。
需要注意的是,,SRL16E原語在不同的器件中表現(xiàn)形式可能稍有區(qū)別,下面是在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--寄存器輸入端口
?。?/p>
-- End of SRL16E_inst instanTIaTIon
這里主要對地址進行一下說明,。地址A3A2A1A0表明要對輸入數(shù)據(jù)進行多少移位,。如果是A3A2A1A0=“0000”,說明是對D端口輸入數(shù)據(jù)進行1位移位,,也就是說對D端口輸入的數(shù)據(jù)進行一個周期的延遲,。如果是A3A2A1A0=“1111”,說明是對D端口輸入數(shù)據(jù)進行16位移位,。
下面舉一個例子來說明:
這是源程序,,因為A3A2A1A0=“0011”,所以主要是對輸入數(shù)據(jù)進行4個周期的延遲,。
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 2018/12/10 1605
-- 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
?。?/p>
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;
這是仿真文件:
仿真文件中的輸入數(shù)據(jù)是一個周期的單脈沖。
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 2018/12/10 1615
-- 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 ='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;
仿真波形:
輸入數(shù)據(jù)是data_in,,輸出是data_out,可以看到對輸入數(shù)據(jù)進行了4個周期的延遲。
更多信息可以來這里獲取==>>電子技術應用-AET<<