2011-10-03 28 views
17

RAM을 쓰는 것이 더 나은 코드는 무엇입니까?Verilog에서 RAM을 더 잘 코딩하는 방법

  1. always 블록 내부에 data_out을 할당 :

    module memory(
        output [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
        end 
    
        assign data_out = memory[address]; 
    
    endmodule 
    

모든 권고 :

module memory(
    output reg [7:0] data_out, 
    input [7:0] address, 
    input [7:0] data_in, 
    input write_enable, 
    input clk 
); 
    reg [7:0] memory [0:255]; 

    always @(posedge clk) begin 
     if (write_enable) begin 
      memory[address] <= data_in; 
     end 
     data_out <= memory[address]; 
    end 

endmodule 
  • assign 문을 사용하여 data_out을 할당?

  • +4

    256 개의 메모리 위치에 액세스하는 데 16 개의 주소 비트가 필요하지 않습니다. 'input [7 : 0] address; '를 사용해야합니다. – toolic

    답변

    8

    요구 사항에 따라 다릅니다.

    1. 메모리 출력을 등록합니다. 이것을 게이트에 합성하는 경우 케이스 2보다 플립 플롭이 16 개 많습니다. 즉, 조금 더 많은 영역을 사용한다는 의미입니다. 또한 출력이 케이스 2보다 클럭에 비해 전파 지연이 적음을 의미합니다. 또한 출력 데이터는 다음 클럭 사이클까지 사용할 수 없습니다.

    2. 출력 데이터는 시계와 비교하여 전파 지연이 길지만 작성된 시간과 동일한 클록주기 내에서 사용할 수 있습니다.

    요구 사항에 따라 사용할 것인지 결정해야합니다.

    세 번째 옵션은 하드 매크로 인 생성 된 RAM을 사용하는 것입니다. 이것은 영역 1, 2 모두에 비해 면적, 전력 및 타이밍상의 이점을 가져야합니다.

    5

    비동기 판독 방법 (사례 2)을 사용하는 경우 툴팁의 답변에 추가하면 FPGA, 내가 알고있는 모든 주요 아키텍처의 RAM 블록은 동기식 읽기가있다.

    -1

    두 번째 프로그램에서는 'Reg'에 값을 '할당'할 수 없으므로 컴파일 오류가 발생합니다. 그것은 말하는 오류를 줄 것이다 :

    1

    두 형태 원하는 파이프 라이닝의 종류에 따라, 유효 '등록 연속 할당의 왼쪽에서 불법이다'. Xilinx RAM 코딩 가이드 라인을 따르는 것이 좋습니다. 코드가 적절한 FGPA 구조로 합성되는지 확인하는 좋은 방법입니다.

    예를 들어, 동기 읽기이기 때문에 예제 1은 자일링스 BRAM (즉, 전용 블록 램)에 합성되며 예제 2는 자일링스 분산 RAM (비동기 읽기이기 때문에)으로 합성된다.

    자일링스 문서 UG901 (Vivado Design Suite 사용자 가이드)의 RAM HDL 코딩 기술 섹션의 코딩 가이드 라인을 참조하십시오. 또한 RAM의 동기 읽기와 비동기 읽기의 차이점에 대해서도 잘 설명되어 있습니다.