- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
dat_mover_bram.v 파일에서
1.
// Shift Delay
always @(posedge clk or negedge reset_n) begin
if(!reset_n) begin
r_core_delay <= 0;
end else begin
r_core_delay <= {r_core_delay[CORE_DELAY-2:0], r_valid}; // read data
end
end
해당 구문이 shift register가 된다는 사실은 알겠습니다.
허나 이 구문이 왜 딜레이 되는 타이밍과 관계 있는지 모르 겠습니다.
assign ce_b1 = r_core_delay[CORE_DELAY-1];
assign we_b1 = r_core_delay[CORE_DELAY-1];
결국 chip enable과 write enable을 r_core_delay[4]->행렬의 MSB의 값으로 입력된다는 의미인거 같은데요.
여기서 r_valid 값은 LSB인거 같은데요. 어떤 메커니즘으로 최상위 비트가 되는 건지 모르겠습니다.
2.
// Shift Data
genvar idx;
generate
for (idx = 0; idx < CORE_DELAY-1; idx = idx + 1) begin : gen_core_delay
always @(posedge clk or negedge reset_n) begin
if(!reset_n) begin
r_core_data[idx+1] <= {DWIDTH{1'b0}};
end else if(|r_core_delay) begin
r_core_data[idx+1] <= r_core_data[idx];
end
end
end
endgenerate
// first one
always @(posedge clk or negedge reset_n) begin
if(!reset_n) begin
r_core_data[0] <= {DWIDTH{1'b0}};
end else if(|r_core_delay) begin
r_core_data[0] <= mem_data; // read data
end
end
해당 구문에서 결국 의미 하는 것은
r_core_data[0] <= mem_data;
r_core_data[1] <= r_core_data[0];
r_core_data[2] <= r_core_data[1];
r_core_data[3] <= r_core_data[2];
r_core_data[4] <= r_core_data[3];
일 텐데요.
말씀하시는 내용은 결국 알맞은 타이밍에 mem_data가 최상위 비트까지 올라가서 해당 테이터가 결국
assign d_b1 = r_core_data[CORE_DELAY-1]; // core value
에 출력될 것이라는 의미 같은데요.
역시 이것도 왜 그렇게 되는지 이해가 안갑니다. ㅠㅠ
(추천해 주신 책은 열심히 읽고 있습니다 ㅠㅠ, 아직 내공이 부족하네요.)