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

Verilog 배열과 메모리: 다차원 데이터 구조 완벽 마스터

Verilog에서 넷이나 변수의 배열 선언은 스칼라/벡터 모두 가능하며, 식별자 뒤에 주소 범위를 추가해 여러 차원을 만들 수 있습니다. reg, wire, integer, real 타입 모두 배열 생성 가능.

배열 선언 예시

reg  y1 [11:0];           // 스칼라 reg 배열, 깊이 12, 각 1비트
wire [0:7] y2 [3:0];      // 8비트 벡터 넷 배열, 깊이 4
reg  [7:0] y3 [0:1][0:3]; // 2차원 배열: 2행 4열, 각 8비트

배열 요소 접근 및 할당

모든 차원의 인덱스를 지정해야 하며, 표현식 사용 가능. 배열 전체를 한 번에 할당 불가 (각 요소별로 해야 함).

y1 = 0;           // 불법: 전체 할당 불가
y2[0] = 8'ha2;    // 인덱스 0에 0xA2 할당
y2[2] = 8'h1c;    // 인덱스 2에 0x1C 할당
y3[1][2] = 8'hdd; // 행 1, 열 2에 0xDD 할당
y3[0][0] = 8'haa; // 행 0, 열 0에 0xAA 할당

주의: 1비트 reg 배열 n개 ≠ n비트 벡터 reg. 전자는 개별 플립플롭 배열, 후자는 단일 벡터 레지스터.

종합 예제: 1D/2D 배열 모델링

module des();
    reg [7:0] mem1;           // 8비트 벡터
    reg [7:0] mem2 [0:3];     // 8비트 벡터 배열, 깊이 4
    reg [15:0] mem3 [0:3][0:1]; // 16비트 벡터 2D 배열, 4행 2열
    int i, j;
    initial begin
        mem1 = 8'ha9;
        $display("mem1 = 0x%0h", mem1);
        mem2[0] = 8'haa; mem2[1] = 8'hbb; mem2[2] = 8'hcc; mem2[3] = 8'hdd;
        for (i = 0; i < 4; i++) $display("mem2[%0d] = 0x%0h", i, mem2[i]);
        for (i = 0; i < 4; i++) for (j = 0; j < 2; j++) begin
            mem3[i][j] = i + j;
            $display("mem3[%0d][%0d] = 0x%0h", i, j, mem3[i][j]);
        end
    end
endmodule

메모리 (Memories)

디지털 저장 요소(RAM, ROM)를 모델링할 때 1차원 reg 배열을 사용하며 이를 메모리라 부릅니다. 각 요소가 한 워드를 나타내며 단일 인덱스로 접근.

레지스터 벡터 방식 (단일 워드 저장)

module des (
    input  wire        clk,
    input  wire        rstn,
    input  wire        wr,
    input  wire        sel,
    input  wire [15:0] wdata,
    output wire [15:0] rdata
);
    reg [15:0] register;
    always @(posedge clk) begin
        if (!rstn) register <= 0;
        else if (sel && wr) register <= wdata;
    end
    assign rdata = (sel && !wr) ? register : 0;
endmodule

합성 시 16비트 플롭 1개 + 제어 로직으로 구현.

배열 방식 (멀티 워드 메모리)

module des (
    input  wire        clk,
    input  wire        rstn,
    input  wire [1:0]  addr,
    input  wire        wr,
    input  wire        sel,
    input  wire [15:0] wdata,
    output wire [15:0] rdata
);
    reg [15:0] register [0:3];
    integer i;
    always @(posedge clk) begin
        if (!rstn) for (i = 0; i < 4; i++) register[i] <= 0;
        else if (sel && wr) register[addr] <= wdata;
    end
    assign rdata = (sel && !wr) ? register[addr] : 0;
endmodule

합성 시 16비트 플롭 4개 + 주소 디코더 + 멀티플렉서로 구현. 이 방식이 실제 RAM/ROM 모델링에 적합.

핵심 차이 요약

구현 방식구조용도
단일 레지스터 벡터1개 플롭상태 레지스터, 단일 값 저장
reg 배열 (메모리)다중 플롭 + 주소 디코딩RAM, ROM, 레지스터 파일, FIFO

verilog

  1. C# 배열 마스터하기: 선언, 초기화, 조작과 LINQ 연산
  2. C 언어에서 배열과 포인터의 관계 이해하기
  3. Java 배열 복사 기법: 대입, 루프, System.arraycopy, Arrays.copyOfRange 총정리
  4. C++ 배열 완전 정복: 선언, 초기화, 포인터 기법
  5. C++ 동적 배열 할당 완벽 가이드: new, delete, 실전 코드 예제
  6. Java 배열 튜토리얼: 선언, 생성, 초기화와 예제 코드
  7. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  8. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  9. Verilog 블록 간/블록 내 지연 이해: 인터/인트라 할당 지연
  10. MATLAB: 다차원 배열과 특수 배열 마스터하기