FPGA의 디자인 아트(12)parameter를 사용하여 재사용 가능한 논리적 디자인 구축

13947 단어 #FPGA디자인 소감

전언


대부분의 프로그래밍 언어와 마찬가지로, 우리는 가능한 한 많은 코드를 다시 사용할 수 있도록 시도해야 한다.
이것은 우리로 하여금 미래 프로젝트의 개발 시간을 줄일 수 있게 한다. 왜냐하면 우리는 코드를 한 디자인에서 다른 디자인으로 쉽게 이식할 수 있기 때문이다.
우리는verilog에서 두 가지 사용 가능한 구조를 가지고 있는데, 이것은 우리가 다시 사용할 수 있는 코드인 파라메터와generate 문장을 작성하는 데 도움을 줄 수 있다.
이 두 가지 구조는 모두 우리가 더 많은 유니버설 코드를 만들 수 있도록 허용하고, 우리는 실례화된 구성 요소를 만들 때 쉽게 그것을 수정하여 자신의 수요를 만족시킬 수 있다.
기사 시작:https://www.ebaina.com/articles/140000010031

Verilog 매개 변수


verilog에서 매개 변수는 상수의 국부 형식으로 우리가 모듈을 실례화할 때 그 값을 분배할 수 있다.
매개 변수의 범위가 제한되어 있기 때문에 우리는 같은verilog 모듈을 여러 번 호출하고 이 매개 변수에 서로 다른 값을 분배할 수 있다.이것은 우리가 모듈의 행동을 동적으로 설정할 수 있게 한다.
우리는 모듈을 작성할 때 반드시 모듈의 인터페이스를 정의해야 한다는 것을 안다.그런 다음 FPGA 설계의 여러 모듈을 연결하는 인터페이스를 사용할 수 있습니다.
이 인터페이스의 일부로서, 우리는 매개 변수와 모듈의 입력과 출력을 설명할 수 있다.
다음 Verilog 코드 세그먼트는 모듈에서 매개변수를 선언하는 방법을 보여 줍니다.이런verilog 모듈에서 파라미터를 설명할 때, 우리는 그것을 파라미터화 모듈이라고 부른다.
module <module_name> #(
  parameter <parameter_name> = <default_value> )

(

  // Port declarations

);

위의 Verilog 코드의 필드는 매개변수에 식별자를 제공하는 데 사용됩니다.
구체적인 예:
모듈 카운터에는 두 개의 인자 N과 DOWN이 있는데 기본값은 각각 2와 0이라고 합니다.N은 출력의 자릿수를 제어하고 계수기의 폭을 효과적으로 제어한다.기본적으로 2비트 카운터입니다.매개변수 DOWN 제어 카운터가 증가 또는 감소인지 여부입니다.기본적으로 카운터는 0으로 설정되어 있기 때문에 감소합니다.
module counter
  #( 	parameter N = 2,
   		parameter DOWN = 0)

  ( input 							clk,
    input 							rstn,
    input 							en,
   	output 	reg [N-1:0] out);

  always @ (posedge clk) begin
    if (!rstn) begin
      out <= 0;
    end 
    else begin
      if (en)
        if (DOWN)
          out <= out - 1;
        else
          	out <= out + 1;
      else
         out <= out;
    end
  end
endmodule


우리는 일반 변수를 사용하는 것처럼 코드의 매개 변수 값을 호출하기 위해 이 식별자를 사용합니다.
위의 예시에서, 우리는 필드를 사용하여 기본값을 우리의 매개 변수에 분배할 수 있다.
이것은 매개 변수에 값을 할당할 필요가 없기 때문에, 구성 요소를 실례화할 수 있기 때문에 매우 유용하다.
예를 들어, 위의 실제 예를 예로 들면 다음과 같습니다.
module design_top (    input clk,
                input rstn,
                input en,
                output [1:0] out);

    counter #(.N(2)) u0 (	.clk(clk),
                          .rstn(rstn),
                          .en(en));
endmodule


우리는 한 파라미터에 파라미터 값을 분배했고, 다른 파라미터가 분배되지 않았으면, 컴파일 도구는 다른 파라미터에 대한 처리에 기본값을 사용합니다.즉 0.
Verilog 설계 단원에서 모듈을 실례화할 때, named 연결이나positional 연결을 사용하여 매개 변수에 값을 할당할 수 있습니다.이것은 신호를 모듈에 분배하는 입력이나 출력과 완전히 같다.
단,verilog 1995 표준을 사용하는 코드를 작성할 때, 위치 관련을 사용하여 값을 매개 변수에 분배할 수 있습니다.
다음 Verilog 코드 세그먼트는 모듈을 인스턴스화할 때 매개변수에 값을 할당하는 방법을 보여 줍니다.
// Example of named association
<module_name> # (

  // If the module uses parameters they are connected here

  .<parameter_name> (<parameter_value>)

)

<instance_name> (

  // port connections

);

 

// Example of positional association

<module_name> # (<parameter_values>)

<instance_name> (

  // port connections

);

Verilog 매개 변수 모듈의 예


우리가verilog에서 매개 변수를 어떻게 사용하는지 더 잘 이해하기 위해서 기본적인 예시를 고려합시다.
이 예시에 대해 우리는 두 개의 동기계수기가 필요한 설계를 고려할 것이다.이 계수기의 하나는 8자리 너비이고, 다른 하나는 12자리 너비이다.
이 회로를 실현하기 위해서, 우리는 두 개의 서로 다른 계수기 부품을 작성할 수 있는데, 그것들은 서로 다른 폭을 가지고 있다.그러나 이것은 우리의 회로를 인코딩하는 저효율 방식이다.
반대로, 우리는 계수기 회로를 작성하고, 출력의 위치를 바꾸는 매개 변수를 사용할 것이다.
우리가 매개 변수화 모듈을 어떻게 사용하는지 이해하는 것은 중요하지 않기 때문에 이 예시에서 기능 코드를 배제할 것이다.
반대로 우리는verilog에서 어떻게 성명하고 실례화하는 매개 변수화 모듈만 연구할 것이다.
다음 Verilog 코드 세그먼트는 패라메트릭 카운터 모듈의 인터페이스를 작성하는 방법을 보여 줍니다.
module counter #(
  parameter BITS = 8)
(
  input wire clock,
  input wire reset,
  output reg [BITS-1 : 0] count

);


endmodule

이 예에서는 Verilog의 신호 크기를 조정하기 위해 매개변수를 사용하는 방법을 보여 줍니다.
포트 폭을 고정된 숫자로 설명하는 것이 아니라, 파라미터 값을 포트 설명으로 바꿉니다.
이것은 Verilog에서 매개변수의 가장 일반적인 용례 중 하나입니다.
위의 verilog 코드에서 BITS 매개 변수의 기본값을 8로 정의했습니다.
따라서 8비트가 아닌 출력을 원할 때만 매개 변수에 값을 할당해야 한다.
다음 코드 세션은 12개의 출력이 필요할 때 이 모듈을 실례화하는 방법을 보여 줍니다.
이런 상황에서,verilog 모듈을 실례화할 때, 매개 변수의 기본값을 초과해야 합니다.
counter # (

  .BITS (12)

) count_12 (

  .clock  (clock),

  .reset  (reset),

  .count  (count_out)

);

비록 위의 예시에서 명명 관련을 사용했지만, 우리는verilog의 매개 변수 분배 값으로 위치 관련을 사용할 수 있다.
다음 코드 세그먼트는 위치 연관을 사용하여 값 12를 BITS 매개 변수에 지정하는 방법을 보여 줍니다.
counter # (12) count_12 (

  .clock  (clock),

  .reset  (reset),

  .count  (count_out)

);

localparam


매개 변수의 성명 방식은parameter와 같은 방식뿐만 아니라localparam의 문법도 있지만 이것은parameter와 당연히 다르다.
localparam 모듈에서 유효한 정의는 국부 변수로 매개 변수 전달에 사용할 수도 없고 재정의할 수도 없습니다.
이것은 순환을 생성하고 비트를 확장할 수 있는 모듈을 생성하는 데 사용되며 localparam은 국부 파라미터이지만 재정의할 수 없다. 즉, 실례화할 때 차원 인용을 통해 재정의할 수 없다. 예를 들어parameter는 #(파라미터)를 통해 재정의할 수 있지만 localparam은 할 수 없고 원본 코드로만 변경할 수 있다.
언제 시작 해요?어떤 경우에 이런 매개 변수를 사용하는 것이 비교적 좋습니까?
예를 들어 우리는 상태 변수를 설정할 때 그것을 사용할 수 있다. 상태 변수는 모듈 전속에 속하기 때문에 우리는 그것을 전달할 필요도 없고 변경할 필요도 없다. 우리는 CPU의 버스 주소 등을 사용할 수도 있다. 한 마디로 하면 매개 변수를 전달하지 않아도 되는 모든 곳에서 사용할 수 있다.
localparam의 구문:
module <module_name> 

(


  // Port declarations

);

localparam <parameter_name> = <default_value> ;

endmodule 

또는 여러 로컬 매개변수 정의에 대해 다음을 수행합니다.
module <module_name> 

(


  // Port declarations

);

  localparam <parameter_name1> = <default_value1> ,
			 <parameter_name2> = <default_value2> ,
			 <parameter_name3> = <default_value3> ,			 
								;

endmodule

좋은 웹페이지 즐겨찾기