? ? ?在做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 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
? ? ? ? ?);
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 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;
仿真波形:
輸入數據是data_in,輸出是data_out,可以看到對輸入數據進行了4個周期的延遲。
評論
查看更多