F
floatgrass
Guest
하기 위해서는 타이밍 시뮬레이션을 수행하려면 올바른 funtion이 내 디자인의 모듈입니다, 거기에 메모리를 선언합니다, 지금, 그래서 내가 어떻게 그것을 syntheze이 코드와 디자인 분석기와 함께합니까?
고마워, 내가 새로운 ASIC을 designer.i 오전 도움이 필요 해요!
모듈 regfile (
reset_s1,
Write_Mem_q1,
wrapout_s1,
pixel_s1,
Mem_Pointer_s1,
Pix_Mux_s1,
Word_Line_q1 [8시]
Kernel_Bus_b_v1,
pixel_bit0_v1, pixel_bit1_v1, pixel_bit2_v1,
phi1, phi2);
////////////////////////////////////////////////// //////////////////////////
/ / 포트 선언
////////////////////////////////////////////////// //////////////////////////
입력 phi1, phi2; / / - 2 차 클럭
입력 reset_s1; / / - 언제 리셋이 높은 경우, 카운터
/ / 그리고 다시 낮은 초기화
/ / 커널과 얽힘 수익금로드됩니다.
입력 Write_Mem_q1; / / - 읽기 / 쓰기 표 1에 대한 설정 :
/ / 0 만약에, 만약 읽기 쓰기 1.
입력 [7시] pixel_s1; / / - 픽셀 입력 칩
counters.v에서 입력 [8시] wrapout_s1; / / - 제어 신호
/ / 해당 wordline 올립니다.
입력 [2시] Mem_Pointer_s1; / 메모리 포인터 / - 제어 신호
입력 [7시] Pix_Mux_s1; / / - 우리는 현재 픽셀의 비트를 선택합니다
/ pixel_bit *로 DataPath /에
출력 [8시] Word_Line_q1; / / - SRAM을 워드 라인 () 자격이있다
/ / DP는에 Kernel_Latch 최대한 전달
/ / 시계.
출력 [7시] Kernel_Bus_b_v1; / SRAM은 데이터 / - 1 행
출력 pixel_bit0_v1, / 3 행에 값을 픽셀 / - 비트
pixel_bit1_v1, / / 메모리, DataPath에서 커널 ANDed
pixel_bit2_v1; / / 곱셈에 대한////////////////////////////////////////////////// ///////////////////////////
/ / 내부 변수 선언
////////////////////////////////////////////////// ///////////////////////////
철사 [8시] wordnum_s1; / / - wordlines 메모리 (주소)를 선택합니다
[23시] pixelcol_v1 reg; /의 SRAM / - 출력
, pixtmp0_v1, pixtmp1_v1 reg / Pix_Mux의 / - 출력 () 픽셀 비트 선택
pixtmp2_v1;
, pixel_bit0_v1 reg / reordering의 / - 출력, (mem_pointer)
pixel_bit1_v1, / / 그리고 pix_mux
pixel_bit2_v1;
/ / SRAM을 변수 선언
/ / 다음과 같은 선언은 데이터를 SRAM에 서면 기간 동안 개최
/ / 초기화.
[23시] memory_v1 [8시] reg;
[4시] decodenum_s1 reg;
철사 [23시] memtemp_v1;
wordnum_s1 = wrapout_s1 할당; SRAM을 위해 / / 자격 저장 이루어집니다
Word_Line_q1 할당 [0] = wrapout_s1 [0] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [1] = wrapout_s1 [1] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [2] = wrapout_s1 [2] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 지정 [3] = wrapout_s1 [3] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [4] = wrapout_s1 [4] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [5] = wrapout_s1 [5] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 지정 [6] = wrapout_s1 [6] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [7] = wrapout_s1 [7] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [8] = wrapout_s1 [8] & phi1; / / 커널에 대한 공인 래치
/ / 10 진수로 변환 가치를 다시 wordline 선별 정말 그렇게 될 수있습니다
/ / 배열에 사용됩니다.이것은 논리에만 Verilog에서 필요하지 않습니다
/ / 레이아웃을 구현했습니다.
항상 (wordnum_s1) @
시작
케이스 (wordnum_s1)
9'b000000001 : decodenum_s1 = 8;
9'b000000010 : decodenum_s1 = 7;
9'b000000100 : decodenum_s1 = 6;
9'b000001000 : decodenum_s1 = 5;
9'b000010000 : decodenum_s1 = 4;
9'b000100000 : decodenum_s1 = 3;
9'b001000000 : decodenum_s1 = 2;
9'b010000000 : decodenum_s1 = 1;
9'b100000000 : decodenum_s1 = 0;
/ / 기본 케이스가 없을 때 wordline 선택한 경우에 발생합니다.
기본값 : decodenum_s1 = 16;
endcase
끝
항상 @ (phi1 또는 decodenum_s1 또는 pixelcol_v1 또는 Write_Mem_q1)
(phi1 경우)
시작
/ / SRAM과 픽셀의 값을 쓰기
/ / 참고 :이 라인 엄격한 2 단계 클러킹에 위배
만약 (Write_Mem_q1 == 1'b1)
시작
memory_v1 [decodenum_s1] = pixelcol_v1;
끝
끝
/ / 읽기 SRAM과 (자료)에서
//------------------------------------------------ ----------------
할당 memtemp_v1 = ~ Write_Mem_q1?memory_v1 [decodenum_s1] : 24'bz;
Kernel_Bus_b_v1 = ~ memtemp_v1 [23시 16분] 할당;/ / 루트 입력 메모리의 적절한 행을 위해, 우리는 오직 덮어
/ / 어떤 Mem_Pointer 가장 오래된 우리에게 말해줍니다 행.(이되지 않습니다
/ / 모델의 레이아웃을 정확하게,하지만 아이디어와 같은) 즉 : 레이아웃
/ / 때문에 하나의 높이가 쓰여지고있는 제외한 모든 행
/ 그들은 그들의 옛 가치를 보유 / 임피던스 입력.
/ 감도를 목록에 포함 / Pix_Mux_s1 pixelcol_v1로드 단지
/ / 전에 매일 쓰기에 상관없이, 또는 경우 pixel_s1 들어 mem에
/ / Mem_Pointer_s1이나 변한 게있다.
//------------------------------------------------ ----------------
(Mem_Pointer_s1 또는 pixel_s1 또는 Pix_Mux_s1) 항상 @
시작
만약 (Pix_Mux_s1 [7])
시작
케이스 (Mem_Pointer_s1)
3'b001 : 시작
pixelcol_v1 [23시 16분] = pixel_s1;
pixelcol_v1 [15시 8분] = memtemp_v1 [15시 8분];
pixelcol_v1 [7시] = memtemp_v1 [7시];
끝
3'b010 : 시작
pixelcol_v1 [23시 16분] = memtemp_v1 [23시 16분];
pixelcol_v1 [15시 8분] = pixel_s1;
pixelcol_v1 [7시] = memtemp_v1 [7시];
끝
3'b100 : 시작
pixelcol_v1 [23시 16분] = memtemp_v1 [23시 16분];
pixelcol_v1 [15시 8분] = memtemp_v1 [15시 8분];
pixelcol_v1 [7시] = pixel_s1;
끝
기본값 : pixelcol_v1 = memtemp_v1; / / 전혀 새로운 작성된 것입니다
endcase
끝
끝/ / Mux 출력, 그래서 우리는 한 줄에 하나만 비트 읽기 복구
/ / ------------------------------------------------ ------------
(Pix_Mux_s1 또는 memtemp_v1) 항상 @
시작
케이스 (Pix_Mux_s1)
8'b00000001 : 시작
pixtmp0_v1 = memtemp_v1 [16];
pixtmp1_v1 = memtemp_v1 [8];
pixtmp2_v1 = memtemp_v1 [0];
끝
8'b00000010 : 시작
pixtmp0_v1 = memtemp_v1 [17];
pixtmp1_v1 = memtemp_v1 [9];
pixtmp2_v1 = memtemp_v1 [1];
끝
8'b00000100 : 시작
pixtmp0_v1 = memtemp_v1 [18];
pixtmp1_v1 = memtemp_v1 [10];
pixtmp2_v1 = memtemp_v1 [2];
끝
8'b00001000 : 시작
pixtmp0_v1 = memtemp_v1 [19];
pixtmp1_v1 = memtemp_v1 [11];
pixtmp2_v1 = memtemp_v1 [3];
끝
8'b00010000 : 시작
pixtmp0_v1 = memtemp_v1 [20];
pixtmp1_v1 = memtemp_v1 [12];
pixtmp2_v1 = memtemp_v1 [4];
끝
8'b00100000 : 시작
pixtmp0_v1 = memtemp_v1 [21];
pixtmp1_v1 = memtemp_v1 [13];
pixtmp2_v1 = memtemp_v1 [5];
끝
8'b01000000 : 시작
pixtmp0_v1 = memtemp_v1 [22];
pixtmp1_v1 = memtemp_v1 [14];
pixtmp2_v1 = memtemp_v1 [6];
끝
8'b10000000 : 시작
pixtmp0_v1 = memtemp_v1 [23];
pixtmp1_v1 = memtemp_v1 [15];
pixtmp2_v1 = memtemp_v1 [7];
끝
기본값 : 시작
pixtmp0_v1 = 1'bz;
pixtmp1_v1 = 1'bz;
pixtmp2_v1 = 1'bz;
끝
endcase
끝
/ / 정렬 임시 픽셀 비트 그렇게 행이 다시 - 주문
/ / 메모리 포인터의 값을 기반으로
(Mem_Pointer_s1 또는 pixtmp0_v1 또는 항상 @ pixtmp1_v1 또는 pixtmp2_v1)
시작
케이스 (Mem_Pointer_s1)
3'b001 : 시작
pixel_bit0_v1 = pixtmp0_v1; / / 일반 주문.
pixel_bit1_v1 = pixtmp1_v1;
pixel_bit2_v1 = pixtmp2_v1;
끝
3'b010 : 시작
pixel_bit0_v1 = pixtmp1_v1; / / 2 행 가득 찼다.
pixel_bit1_v1 = pixtmp2_v1;
pixel_bit2_v1 = pixtmp0_v1;
끝
3'b100 : 시작
pixel_bit0_v1 = pixtmp2_v1; / / 3 행 가득 찼다.
pixel_bit1_v1 = pixtmp0_v1;
pixel_bit2_v1 = pixtmp1_v1;
끝
기본값 : 시작
pixel_bit0_v1 = 1'bz;
pixel_bit1_v1 = 1'bz;
pixel_bit2_v1 = 1'bz;
끝
endcase
끝
/ / 참고 :이 명령이 이제 괜찮지만, 큰 그림에,
/ / 그것을 시각화하는 혼란이다.그것은 만약 pixel_bit0 분명있을 것이라고
/ /에 커널의 하단에 행, pixel_bit1에 대응
/ / 중간 pixel_bit2 가기.그럼 우리가 상상할 수있는 우리는
/ / 값 이미지의 하단에 행, 그리고 먹이를했다
/ / 그 값을 누른 다음 최대 옮겨 있어요./ / SRAM과 끝 메모리
endmodule / / 메모리
고마워, 내가 새로운 ASIC을 designer.i 오전 도움이 필요 해요!
모듈 regfile (
reset_s1,
Write_Mem_q1,
wrapout_s1,
pixel_s1,
Mem_Pointer_s1,
Pix_Mux_s1,
Word_Line_q1 [8시]
Kernel_Bus_b_v1,
pixel_bit0_v1, pixel_bit1_v1, pixel_bit2_v1,
phi1, phi2);
////////////////////////////////////////////////// //////////////////////////
/ / 포트 선언
////////////////////////////////////////////////// //////////////////////////
입력 phi1, phi2; / / - 2 차 클럭
입력 reset_s1; / / - 언제 리셋이 높은 경우, 카운터
/ / 그리고 다시 낮은 초기화
/ / 커널과 얽힘 수익금로드됩니다.
입력 Write_Mem_q1; / / - 읽기 / 쓰기 표 1에 대한 설정 :
/ / 0 만약에, 만약 읽기 쓰기 1.
입력 [7시] pixel_s1; / / - 픽셀 입력 칩
counters.v에서 입력 [8시] wrapout_s1; / / - 제어 신호
/ / 해당 wordline 올립니다.
입력 [2시] Mem_Pointer_s1; / 메모리 포인터 / - 제어 신호
입력 [7시] Pix_Mux_s1; / / - 우리는 현재 픽셀의 비트를 선택합니다
/ pixel_bit *로 DataPath /에
출력 [8시] Word_Line_q1; / / - SRAM을 워드 라인 () 자격이있다
/ / DP는에 Kernel_Latch 최대한 전달
/ / 시계.
출력 [7시] Kernel_Bus_b_v1; / SRAM은 데이터 / - 1 행
출력 pixel_bit0_v1, / 3 행에 값을 픽셀 / - 비트
pixel_bit1_v1, / / 메모리, DataPath에서 커널 ANDed
pixel_bit2_v1; / / 곱셈에 대한////////////////////////////////////////////////// ///////////////////////////
/ / 내부 변수 선언
////////////////////////////////////////////////// ///////////////////////////
철사 [8시] wordnum_s1; / / - wordlines 메모리 (주소)를 선택합니다
[23시] pixelcol_v1 reg; /의 SRAM / - 출력
, pixtmp0_v1, pixtmp1_v1 reg / Pix_Mux의 / - 출력 () 픽셀 비트 선택
pixtmp2_v1;
, pixel_bit0_v1 reg / reordering의 / - 출력, (mem_pointer)
pixel_bit1_v1, / / 그리고 pix_mux
pixel_bit2_v1;
/ / SRAM을 변수 선언
/ / 다음과 같은 선언은 데이터를 SRAM에 서면 기간 동안 개최
/ / 초기화.
[23시] memory_v1 [8시] reg;
[4시] decodenum_s1 reg;
철사 [23시] memtemp_v1;
wordnum_s1 = wrapout_s1 할당; SRAM을 위해 / / 자격 저장 이루어집니다
Word_Line_q1 할당 [0] = wrapout_s1 [0] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [1] = wrapout_s1 [1] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [2] = wrapout_s1 [2] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 지정 [3] = wrapout_s1 [3] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [4] = wrapout_s1 [4] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [5] = wrapout_s1 [5] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 지정 [6] = wrapout_s1 [6] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [7] = wrapout_s1 [7] & phi1; / / 커널에 대한 공인 래치
Word_Line_q1 할당 [8] = wrapout_s1 [8] & phi1; / / 커널에 대한 공인 래치
/ / 10 진수로 변환 가치를 다시 wordline 선별 정말 그렇게 될 수있습니다
/ / 배열에 사용됩니다.이것은 논리에만 Verilog에서 필요하지 않습니다
/ / 레이아웃을 구현했습니다.
항상 (wordnum_s1) @
시작
케이스 (wordnum_s1)
9'b000000001 : decodenum_s1 = 8;
9'b000000010 : decodenum_s1 = 7;
9'b000000100 : decodenum_s1 = 6;
9'b000001000 : decodenum_s1 = 5;
9'b000010000 : decodenum_s1 = 4;
9'b000100000 : decodenum_s1 = 3;
9'b001000000 : decodenum_s1 = 2;
9'b010000000 : decodenum_s1 = 1;
9'b100000000 : decodenum_s1 = 0;
/ / 기본 케이스가 없을 때 wordline 선택한 경우에 발생합니다.
기본값 : decodenum_s1 = 16;
endcase
끝
항상 @ (phi1 또는 decodenum_s1 또는 pixelcol_v1 또는 Write_Mem_q1)
(phi1 경우)
시작
/ / SRAM과 픽셀의 값을 쓰기
/ / 참고 :이 라인 엄격한 2 단계 클러킹에 위배
만약 (Write_Mem_q1 == 1'b1)
시작
memory_v1 [decodenum_s1] = pixelcol_v1;
끝
끝
/ / 읽기 SRAM과 (자료)에서
//------------------------------------------------ ----------------
할당 memtemp_v1 = ~ Write_Mem_q1?memory_v1 [decodenum_s1] : 24'bz;
Kernel_Bus_b_v1 = ~ memtemp_v1 [23시 16분] 할당;/ / 루트 입력 메모리의 적절한 행을 위해, 우리는 오직 덮어
/ / 어떤 Mem_Pointer 가장 오래된 우리에게 말해줍니다 행.(이되지 않습니다
/ / 모델의 레이아웃을 정확하게,하지만 아이디어와 같은) 즉 : 레이아웃
/ / 때문에 하나의 높이가 쓰여지고있는 제외한 모든 행
/ 그들은 그들의 옛 가치를 보유 / 임피던스 입력.
/ 감도를 목록에 포함 / Pix_Mux_s1 pixelcol_v1로드 단지
/ / 전에 매일 쓰기에 상관없이, 또는 경우 pixel_s1 들어 mem에
/ / Mem_Pointer_s1이나 변한 게있다.
//------------------------------------------------ ----------------
(Mem_Pointer_s1 또는 pixel_s1 또는 Pix_Mux_s1) 항상 @
시작
만약 (Pix_Mux_s1 [7])
시작
케이스 (Mem_Pointer_s1)
3'b001 : 시작
pixelcol_v1 [23시 16분] = pixel_s1;
pixelcol_v1 [15시 8분] = memtemp_v1 [15시 8분];
pixelcol_v1 [7시] = memtemp_v1 [7시];
끝
3'b010 : 시작
pixelcol_v1 [23시 16분] = memtemp_v1 [23시 16분];
pixelcol_v1 [15시 8분] = pixel_s1;
pixelcol_v1 [7시] = memtemp_v1 [7시];
끝
3'b100 : 시작
pixelcol_v1 [23시 16분] = memtemp_v1 [23시 16분];
pixelcol_v1 [15시 8분] = memtemp_v1 [15시 8분];
pixelcol_v1 [7시] = pixel_s1;
끝
기본값 : pixelcol_v1 = memtemp_v1; / / 전혀 새로운 작성된 것입니다
endcase
끝
끝/ / Mux 출력, 그래서 우리는 한 줄에 하나만 비트 읽기 복구
/ / ------------------------------------------------ ------------
(Pix_Mux_s1 또는 memtemp_v1) 항상 @
시작
케이스 (Pix_Mux_s1)
8'b00000001 : 시작
pixtmp0_v1 = memtemp_v1 [16];
pixtmp1_v1 = memtemp_v1 [8];
pixtmp2_v1 = memtemp_v1 [0];
끝
8'b00000010 : 시작
pixtmp0_v1 = memtemp_v1 [17];
pixtmp1_v1 = memtemp_v1 [9];
pixtmp2_v1 = memtemp_v1 [1];
끝
8'b00000100 : 시작
pixtmp0_v1 = memtemp_v1 [18];
pixtmp1_v1 = memtemp_v1 [10];
pixtmp2_v1 = memtemp_v1 [2];
끝
8'b00001000 : 시작
pixtmp0_v1 = memtemp_v1 [19];
pixtmp1_v1 = memtemp_v1 [11];
pixtmp2_v1 = memtemp_v1 [3];
끝
8'b00010000 : 시작
pixtmp0_v1 = memtemp_v1 [20];
pixtmp1_v1 = memtemp_v1 [12];
pixtmp2_v1 = memtemp_v1 [4];
끝
8'b00100000 : 시작
pixtmp0_v1 = memtemp_v1 [21];
pixtmp1_v1 = memtemp_v1 [13];
pixtmp2_v1 = memtemp_v1 [5];
끝
8'b01000000 : 시작
pixtmp0_v1 = memtemp_v1 [22];
pixtmp1_v1 = memtemp_v1 [14];
pixtmp2_v1 = memtemp_v1 [6];
끝
8'b10000000 : 시작
pixtmp0_v1 = memtemp_v1 [23];
pixtmp1_v1 = memtemp_v1 [15];
pixtmp2_v1 = memtemp_v1 [7];
끝
기본값 : 시작
pixtmp0_v1 = 1'bz;
pixtmp1_v1 = 1'bz;
pixtmp2_v1 = 1'bz;
끝
endcase
끝
/ / 정렬 임시 픽셀 비트 그렇게 행이 다시 - 주문
/ / 메모리 포인터의 값을 기반으로
(Mem_Pointer_s1 또는 pixtmp0_v1 또는 항상 @ pixtmp1_v1 또는 pixtmp2_v1)
시작
케이스 (Mem_Pointer_s1)
3'b001 : 시작
pixel_bit0_v1 = pixtmp0_v1; / / 일반 주문.
pixel_bit1_v1 = pixtmp1_v1;
pixel_bit2_v1 = pixtmp2_v1;
끝
3'b010 : 시작
pixel_bit0_v1 = pixtmp1_v1; / / 2 행 가득 찼다.
pixel_bit1_v1 = pixtmp2_v1;
pixel_bit2_v1 = pixtmp0_v1;
끝
3'b100 : 시작
pixel_bit0_v1 = pixtmp2_v1; / / 3 행 가득 찼다.
pixel_bit1_v1 = pixtmp0_v1;
pixel_bit2_v1 = pixtmp1_v1;
끝
기본값 : 시작
pixel_bit0_v1 = 1'bz;
pixel_bit1_v1 = 1'bz;
pixel_bit2_v1 = 1'bz;
끝
endcase
끝
/ / 참고 :이 명령이 이제 괜찮지만, 큰 그림에,
/ / 그것을 시각화하는 혼란이다.그것은 만약 pixel_bit0 분명있을 것이라고
/ /에 커널의 하단에 행, pixel_bit1에 대응
/ / 중간 pixel_bit2 가기.그럼 우리가 상상할 수있는 우리는
/ / 값 이미지의 하단에 행, 그리고 먹이를했다
/ / 그 값을 누른 다음 최대 옮겨 있어요./ / SRAM과 끝 메모리
endmodule / / 메모리