해결된 질문
작성
·
273
·
수정됨
2
40번째 ~ 46번째 라인인 시프트 레지스터 구현을 Concat syntax 사용해서 구현하셨는데 매 cycle 마다 shift left 된다고 하셨습니다.
그런데 구현하신 시프트 레지스터는 Right shift register로 보이는것 같아서요.
벡터값이 3 2 1 0 이런식으로 가서 shift left 된다고 표현하신건가요 ??
물리적인 배치와 시뮬레이션 값이랑 잘 매칭이 안되고 있습니다 ㅠㅠ
해당 사진의 출처는 HDLBits Exams/m2014 q4k 이고 문제의 솔루션도 맛비님이 제공해주신 14강 실습 파일과 동일한 로직을 가지고 있습니다.
즉 질문하고 싶은것은 Shift left가 아니라 Shift right가 맞지 않나요 ??레지스터를 어떻게 배치하냐에 따라서 Right left 다르게 할 수 있나요?? 라고 조심스럽게 질문드려봅니다..
답변 2
1
안녕하세요 🙂
reg [2:0] r_valid;
// flow of valid
always @(posedge clk or negedge reset_n) begin
if(!reset_n) begin
r_valid <= 3'd0;
end else begin
r_valid <= {r_valid[1:0], i_valid};
end
end
먼저 현재 코드를 보시면, 하위 index 에서 상위 index 로 shifting 이 되고 있고요.
[2:0] 을 갖는 bit indexing 선언에서,
<< (shift left) 를 사용해야 하위 index 에서 상위 index 로 shifting 이 되는 것이기 때문에 shift left 라는 워딩을 사용했습니다.
[2:0] 을 갖는 bit indexing 선언에서,
만약에 >> (shift right) 를 했다면, 상위 index 에서 하위 index 로 shifting 이 될 것 같아요. 이는 코드와 반대되는 거라고 생각합니다.
올려주신 HDL bits 는
상위 index 에 input 이 들어가죠. (Q[2] <= in;)
즉, 해당 코드는 shift right 가 맞습니다. 헷갈리실 법 한대요. shifting 되는 방향을 index 를 기준으로 생각해보시면 이해가 되실꺼에요.
//四级移位寄存器
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output reg out);
reg [2:0] Q;
always @(posedge clk)begin
if(~resetn)begin
{Q,out} <= 4'b0;
end
else begin
Q[2] <= in;
Q[1] <= Q[2];
Q[0] <= Q[1];
out <= Q[0];
end
end
endmodule
정리하면 제가 예제로 드린 코드는 Shift left, HDL Bits 코드는 Shift Right
즐공하세요 🙂
질문 하나만 더해도 되겠습니까..
맛비님 설명은 이제 이해가 가는데
해당 HDLBits 문제를
);module top_module (
input clk,
input resetn,
input in,
output out
);
reg [3:0] r_out;
always @(posedge clk)begin
if(!resetn)begin
r_out <= 4'b0;
end else begin
r_out[0] <= in;
r_out[1] <= r_out[0];
r_out[2] <= r_out[1];
r_out[3] <= r_out[2];
end
end
assign out = r_out[3];
endmodule
이렇게 하위 Index -> 상위 Index로 가는 left shift register로 표현해도 정답이 되더라구요 문제의 솔루션도
module top_module (
input clk,
input resetn,
input in,
output out
);
reg [3:0] sr;
// Create a shift register named sr. It shifts in "in".
always @(posedge clk) begin
if (~resetn) // Synchronous active-low reset
sr <= 0;
else
sr <= {sr[2:0], in};
end
assign out = sr[3]; // Output the final bit (sr[3])
endmodule
저렇게 맛비님의 14장 pipeline 코드 솔루션과 똑같은 베릴로그 코드 로직을 가지고 있구요.
처음 질문의 HDLBits Logic 그림은 Right Shift Register가 맞는거죠??
HDLBits그림으로 인해 자꾸 헷갈려서 질문 드립니다 ㅠㅠㅠ
해당 그림에서는 ff 의 indexing 숫자가 기재되어 있지 않아서, shift right 인지 left 인지 명확해보이지 않아요. 숫자를 기입해줘야 답변이 가능해보이네요 ㅋ
지식은 동등해졌으니, 판단은 각자의 영역 같아요. (제 답변은 적어드린 것과 같아서 해당 원칙내에서 저라면! 판단하겠습니다 ㅋ)
즐공하세요 :)
0
아하 이해했습니다 감사합니다~!