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

Verilog 어레이 및 메모리

배열 net 또는 변수의 선언은 스칼라 또는 벡터가 될 수 있습니다. 식별자 이름 뒤에 주소 범위를 지정하여 여러 차원을 만들 수 있으며 이를 다차원 배열이라고 합니다. reg에 대해 Verilog에서 배열이 허용됩니다. , wire , integerreal 데이터 유형.

  
  
	reg        y1 [11:0];        // y is an scalar reg array of depth=12, each 1-bit wide
	wire [0:7] y2 [3:0]          // y is an 8-bit vector net with a depth of 4
	reg  [7:0] y3 [0:1][0:3];    // y is a 2D array rows=2,cols=4 each 8-bit wide

  

배열의 특정 요소에 액세스하려면 모든 차원에 대한 인덱스를 지정해야 하며 다른 변수의 표현식이 될 수 있습니다. Verilog에서 지원되는 다양한 데이터 유형에 대해 어레이를 구성할 수 있습니다.

n 1비트 reg의 메모리는 n비트 벡터 reg와 동일하지 않습니다.

과제

  
  
	y1 = 0; 						// Illegal - All elements can't be assigned in a single go
	
	y2[0] = 8'ha2; 			// Assign 0xa2 to index=0 
	y2[2] = 8'h1c; 			// Assign 0x1c to index=2
	y3[1][2] = 8'hdd; 	// Assign 0xdd to rows=1 cols=2
	y3[0][0] = 8'haa; 	// Assign 0xaa to rows=0 cols=0

  

아래에 표시된 코드는 서로 다른 배열을 어떻게 모델링, 할당 및 액세스할 수 있는지 보여줍니다. mem1은 8비트 벡터이고, mem2는 깊이가 4인 8비트 배열(범위 [0:3]으로 지정)이며, mem3은 4행과 2열이 있는 16비트 벡터 2D 배열입니다. 이러한 변수에는 다른 값이 할당되어 인쇄됩니다.

  
  
module des ();
  reg [7:0]  mem1; 							// reg vector 8-bit wide
  reg [7:0]  mem2 [0:3]; 				// 8-bit wide vector array with depth=4
  reg [15:0] mem3 [0:3][0:1]; 	// 16-bit wide vector 2D array with rows=4,cols=2
  
  initial begin
    int i;
    
    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 = i+1) begin
      $display("mem2[%0d] = 0x%0h", i, mem2[i]);
    end
    
    for(int i = 0; i < 4; i += 1) begin
      for(int j = 0; j < 2; j += 1) begin
        mem3[i][j] = i + j;
        $display("mem3[%0d][%0d] = 0x%0h", i, j, mem3[i][j]);
      end
    end
  end
endmodule

  
시뮬레이션 로그
ncsim> run
mem1 = 0xa9
mem2[0] = 0xaa
mem2[1] = 0xbb
mem2[2] = 0xcc
mem2[3] = 0xdd
mem3[0][0] = 0x0
mem3[0][1] = 0x1
mem3[1][0] = 0x1
mem3[1][1] = 0x2
mem3[2][0] = 0x2
mem3[2][1] = 0x3
mem3[3][0] = 0x3
mem3[3][1] = 0x4
ncsim: *W,RNQUIE: Simulation is complete.

추억

메모리는 디지털 회로에 데이터와 정보를 저장하는 데 도움이 되는 디지털 저장 요소입니다. RAM 및 ROM은 이러한 메모리 요소의 좋은 예입니다. 스토리지 요소는 reg 유형의 1차원 배열을 사용하여 모델링할 수 있습니다. 메모리라고 합니다. . 메모리의 각 요소는 단어를 나타낼 수 있으며 단일 배열 인덱스를 사용하여 참조됩니다.

<노스크립트> memory array in verilog

벡터 등록

Verilog 벡터는 변수 이름의 왼쪽에 있는 크기 범위를 사용하여 선언되며 변수 크기와 일치하는 플롭으로 실현됩니다. 아래 표시된 코드에서 설계 모듈은 클록, 리셋 및 일부 제어 신호를 받아 블록에 읽고 쓸 수 있습니다.

여기에는 레지스터라고 하는 16비트 저장 요소가 포함되어 있어 쓰기 중에 단순히 업데이트되고 읽기 중에 현재 값을 반환합니다. 레지스터는 sel 및 wr이 동일한 클록 에지에서 하이일 때 기록됩니다. sel이 높고 wr이 낮을 때 현재 데이터를 반환합니다.

  
  
module des (    input           clk,
                input           rstn,
                input           wr,
                input           sel,
                input [15:0]    wdata,
                output [15:0]   rdata);

	reg [15:0] register;

	always @ (posedge clk) begin
    if (!rstn)
    	register <= 0;
    else begin
    	if (sel & wr) 
      	register <= wdata;
    	else
      	register <= register;
    end
	end

	assign rdata = (sel & ~wr) ? register : 0;
endmodule

  

하드웨어 회로도는 쓰기를 위한 제어 로직이 활성화될 때 16비트 플롭이 업데이트되고 읽기를 위해 제어 로직이 구성될 때 현재 값이 반환됨을 보여줍니다.

<노스크립트>

배열

이 예에서 레지스터는 각각 너비가 16비트인 4개의 위치가 있는 배열입니다. 디자인 모듈은 배열의 특정 인덱스에 액세스하기 위해 addr이라고 하는 추가 입력 신호를 받습니다.

  
  
module des (    input           clk,
                input           rstn,
                input  [1:0]    addr,
                input           wr,
                input           sel,
                input [15:0]    wdata,
                output [15:0]   rdata);

reg [15:0] register [0:3];
integer i;

always @ (posedge clk) begin
    if (!rstn) begin
        for (i = 0; i < 4; i = i+1) begin 
            register[i] <= 0;
        end
    end else begin
        if (sel & wr) 
            register[addr] <= wdata;
        else
            register[addr] <= register[addr];
    end
end
 
assign rdata = (sel & ~wr) ? register[addr] : 0;
endmodule

  

어레이의 각 인덱스가 16비트 플롭이고 입력 주소가 특정 플롭 세트에 액세스하는 데 사용된다는 하드웨어 회로도를 볼 수 있습니다.

<노스크립트>

verilog

  1. C# 배열
  2. 배열과 포인터의 관계
  3. 자바 복사 배열
  4. C++의 배열 | 선언 | 초기화 | 배열 예제에 대한 포인터
  5. 예제를 사용한 C++ 배열 동적 할당
  6. Java Arrays Tutorial:선언, 생성, 초기화 [예시]
  7. Verilog 튜토리얼
  8. Verilog 연결
  9. Verilog Inter 및 Intra 할당 지연
  10. MATLAB - 배열