XilinxFPGA中SRL16E的使用详解

2022-01-08 17:12:50 浏览数 (1)

FPGA开发过程中经常会使用到移位寄存器,使用移位寄存器一般是为了将某个信号进行打拍,使得时序符合我们的需求。最常见的一种打拍方法就是在process过程语句中对信号进行移位(在verilog中是在always过程中进行移位)。XilinxFPGA中提供的一个原语SRL6E,可以最大实现16位移位寄存的移位寄存器。  需要注意的是,SRL16E原语在不同的器件中表现形式可能稍有区别,下面是在Artix-7系列器件中的SRL16E原语:

代码语言:c复制
  // SRL16E: 16-bit shift register LUT with clock enable operating
   //         on posedge of clock (Mapped to a SliceM LUT6)
   //         Artix-7
   // Xilinx HDL Language Template, version 2020.1

   SRL16E #(
      .INIT(16'h0000) // Initial Value of Shift Register    对寄存器进行初始化
   ) SRL16E_inst (
      .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    寄存器输入端口
   );

example:

代码语言:javascript复制
`timescale 1ns / 1ps
module SRL16E_Test(

    input clk_in,
    output 	wResetQ,
    output 	wEnableN
    );

wire wResetQ;
wire wEnableN;


SRL16E #( .INIT( 16'hFF00 ) ) mReset
( .CLK ( clk_in ),
  .CE  ( 1'b1 ),
  .A0  ( 1'b1 ), .A1( 1'b1 ), .A2( 1'b1 ), .A3( 1'b1 ),   //选择第16位输出
  .D   ( 1'b0 ),
  .Q   ( wResetQ ) );


SRL16E #( .INIT( 16'h000F ) ) mEnable
( .CLK ( clk_in ),
  .CE  ( 1'b1 ),
  .A0  ( 1'b1 ), .A1( 1'b1 ), .A2( 1'b1 ), .A3( 1'b1 ),  //选择第16位输出
  .D   ( 1'b1 ),
  .Q   ( wEnableN ) );

endmodule

Testbench:

代码语言:javascript复制
`timescale 1ns / 1ps
module tb_SRL16E;

    reg		 clk_in;
    wire	wResetQ;
    wire	wEnableN;

    always #10 clk_in <= ~clk_in; 				//时钟信号50M
    
    initial begin
        clk_in = 1'b1;
    end

    SRL16E_Test u_SRL16E(
        .clk_in   (clk_in   ),
        .wResetQ  (wResetQ  ),
        .wEnableN (wEnableN )
    );

endmodule

Waveform

0 人点赞