산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

FPGA에서 효율적인 LFSR 설계: VHDL & Verilog 구현

FPGA에서의 LFSR – VHDL & Verilog 코드

선형 피드백 시프트 레지스터가 FPGA 내부에서 작동하는 원리

LFSR은 Linear Feedback Shift Register(선형 피드백 시프트 레지스터)의 약자로, FPGA 내부에서 유용한 설계입니다. LFSR은 합성하기 간단하여 상대적으로 적은 리소스를 사용하며 FPGA 내부에서 매우 높은 클럭 속도로 실행할 수 있습니다. LFSR 사용으로 이득을 보는 애플리케이션은 많습니다:

선형 피드백 시프트 레지스터는 FPGA 내부에서 플립플롭(Flip-Flop)들이 시프트 레지스터로 연결된 시리즈로 구현됩니다. 시프트 레지스터 체인에서 여러 탭(tap)을 가져와 XOR 또는 XNOR 게이트의 입력으로 사용합니다. 이 게이트의 출력은 시프트 레지스터 체인의 시작 부분으로 피드백되어 LFSR의 'Feedback'이 됩니다.

XNOR 게이트를 사용한 5비트 LFSR

LFSR이 실행되면 개별 플립플롭이 생성하는 패턴은 유사 난수(pseudo-random)입니다. 즉, 무작위에 가깝지만 완전히 무작위는 아닙니다. LFSR 패턴의 어떤 상태에서든 다음 상태를 예측할 수 있기 때문입니다. 시프트 레지스터의 중요한 특성 몇 가지:

더 긴 LFSR은 모든 반복을 도는 데 더 오래 걸립니다. N비트 LFSR의 가능한 최장 반복 횟수는 2N-1입니다. 생각해 보면 N비트 길이의 모든 가능한 패턴은 2N개입니다. 따라서 LFSR로 표현할 수 없는 패턴은 단 하나뿐입니다. XOR 게이트를 피드백 게이트로 쓸 때는 모든 0 패턴, XNOR 게이트를 쓸 때는 모든 1 패턴입니다.

아래 VHDL과 Verilog 코드는 원하는 N비트 폭의 LFSR을 생성합니다. 다항식(LFSR 뒤의 수학)을 사용해 각 비트 폭에 대해 가능한 최대 길이의 LFSR을 만듭니다. 따라서 3비트면 23-1=7 클럭, 4비트면 24-1=15, 5비트면 25-1=31 클럭이 걸립니다. FPGA가 LFSR에서 올-제로(all-zero) 상태로 시작할 수 있게 XNOR 구현을 기반으로 했습니다. Xilinx에서 발행한 모든 LFSR 패턴 전체 표는 여기에 있습니다.

VHDL 구현:

LFSR.vhd

------------------------------------------------------------------------------- -- File downloaded from https://www.nandland.com ------------------------------------------------------------------------------- -- Description: -- A LFSR or Linear Feedback Shift Register is a quick and easy -- way to generate pseudo-random data inside of an FPGA. The LFSR can be used -- for things like counters, test patterns, scrambling of data, and others. -- This module creates an LFSR whose width gets set by a generic. The -- o_LFSR_Done will pulse once all combinations of the LFSR are complete. The -- number of clock cycles that it takes o_LFSR_Done to pulse is equal to -- 2^g_Num_Bits-1. For example, setting g_Num_Bits to 5 means that o_LFSR_Done -- will pulse every 2^5-1 = 31 clock cycles. o_LFSR_Data will change on each -- clock cycle that the module is enabled, which can be used if desired. -- -- Generics: -- g_Num_Bits - Set to the integer number of bits wide to create your LFSR. ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity LFSR is generic ( g_Num_Bits : integer := 5 ); port ( i_Clk : in std_logic; i_Enable : in std_logic; -- Optional Seed Value i_Seed_DV : in std_logic; i_Seed_Data : in std_logic_vector(g_Num_Bits-1 downto 0); o_LFSR_Data : out std_logic_vector(g_Num_Bits-1 downto 0); o_LFSR_Done : out std_logic ); end entity LFSR; architecture RTL of LFSR is signal r_LFSR : std_logic_vector(g_Num_Bits downto 1) := (others => '0'); signal w_XNOR : std_logic; begin -- Purpose: Load up LFSR with Seed if Data Valid (DV) pulse is detected. -- Othewise just run LFSR when enabled. p_LFSR : process (i_Clk) is begin if rising_edge(i_Clk) then if i_Enable = '1' then if i_Seed_DV = '1' then r_LFSR 

테스트벤치 (LFSR_TB.vhd)

------------------------------------------------------------------------------- -- File downloaded from https://www.nandland.com ------------------------------------------------------------------------------- -- Description: Simple Testbench for LFSR.vhd. Set c_NUM_BITS to different -- values to verify operation of LFSR ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity LFSR_TB is end entity LFSR_TB; architecture behave of LFSR_TB is constant c_NUM_BITS : integer := 5; constant c_CLK_PERIOD : time := 40 ns; -- 25 MHz signal r_Clk : std_logic := '0'; signal w_LFSR_Data : std_logic_vector(c_NUM_BITS-1 downto 0); signal w_LFSR_Done : std_logic; begin r_Clk c_NUM_BITS) port map ( i_Clk => r_Clk, i_Enable => '1', i_Seed_DV => '0', i_Seed_Data => (others => '0'), o_LFSR_Data => w_LFSR_Data, o_LFSR_Done => w_LFSR_Done ); end architecture behave; 

Verilog 구현:

LFSR.v

/////////////////////////////////////////////////////////////////////////////// // File downloaded from https://www.nandland.com /////////////////////////////////////////////////////////////////////////////// // Description: // A LFSR or Linear Feedback Shift Register is a quick and easy way to generate // pseudo-random data inside of an FPGA. The LFSR can be used for things like // counters, test patterns, scrambling of data, and others. This module // creates an LFSR whose width gets set by a parameter. The o_LFSR_Done will // pulse once all combinations of the LFSR are complete. The number of clock // cycles that it takes o_LFSR_Done to pulse is equal to 2^g_Num_Bits-1. For // example setting g_Num_Bits to 5 means that o_LFSR_Done will pulse every // 2^5-1 = 31 clock cycles. o_LFSR_Data will change on each clock cycle that // the module is enabled, which can be used if desired. // // Parameters: // NUM_BITS - Set to the integer number of bits wide to create your LFSR. /////////////////////////////////////////////////////////////////////////////// module LFSR #(parameter NUM_BITS) ( input i_Clk, input i_Enable, // Optional Seed Value input i_Seed_DV, input [NUM_BITS-1:0] i_Seed_Data, output [NUM_BITS-1:0] o_LFSR_Data, output o_LFSR_Done ); reg [NUM_BITS:1] r_LFSR = 0; reg r_XNOR; // Purpose: Load up LFSR with Seed if Data Valid (DV) pulse is detected. // Othewise just run LFSR when enabled. always @(posedge i_Clk) begin if (i_Enable == 1'b1) begin if (i_Seed_DV == 1'b1) r_LFSR 

테스트벤치 (LFSR_TB.v)

/////////////////////////////////////////////////////////////////////////////// // File downloaded from https://www.nandland.com /////////////////////////////////////////////////////////////////////////////// // Description: Simple Testbench for LFSR.v. Set c_NUM_BITS to different // values to verify operation of LFSR /////////////////////////////////////////////////////////////////////////////// module LFSR_TB (); parameter c_NUM_BITS = 4; reg r_Clk = 1'b0; wire [c_NUM_BITS-1:0] w_LFSR_Data; wire w_LFSR_Done; LFSR #(.NUM_BITS(c_NUM_BITS)) LFSR_inst (.i_Clk(r_Clk), .i_Enable(1'b1), .i_Seed_DV(1'b0), .i_Seed_Data(}), // Replication .o_LFSR_Data(w_LFSR_Data), .o_LFSR_Done(w_LFSR_Done) ); always @(*) #10 r_Clk 

verilog

  1. Verilog Generate 블록 마스터: 동적 인스턴스화와 조건부 설계
  2. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법
  3. 4비트 존슨 카운터 Verilog 구현: 설계, 테스트벤치, 시뮬레이션
  4. Verilog 파라미터 마스터하기: 재사용 가능하고 확장 가능한 모듈 구축
  5. Verilog $timeformat 마스터하기: 정밀도 및 표시 제어
  6. Verilog T 플립플롭 설계: RTL 구현 및 테스트벤치
  7. D 래치 마스터하기: 설계, 동작, 주요 차이점
  8. 게이트 레벨 모델링: 하드웨어 회로도에서 Verilog 코드로
  9. Verilog 데이터 타입 완벽 해설: 비트, 와이어, 레지스터, 4값 논리
  10. Verilog assign 문 완전 해설: 연속 할당으로 조합 논리 구현하기