• 카테고리

    질문 & 답변
  • 세부 분야

    반도체

  • 해결 여부

    해결됨

14장 Pipeline 실습 질문있습니다.

23.12.14 14:13 작성 23.12.14 14:31 수정 조회수 180

2

40번째 ~ 46번째 라인인 시프트 레지스터 구현을 Concat syntax 사용해서 구현하셨는데 매 cycle 마다 shift left 된다고 하셨습니다.

그런데 구현하신 시프트 레지스터는 Right shift register로 보이는것 같아서요.

벡터값이 3 2 1 0 이런식으로 가서 shift left 된다고 표현하신건가요 ??

물리적인 배치와 시뮬레이션 값이랑 잘 매칭이 안되고 있습니다 ㅠㅠ

스크린샷 2023-12-14 오후 2.12.00.png

해당 사진의 출처는 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

 

즐공하세요 🙂

eunsekkang님의 프로필

eunsekkang

질문자

2023.12.15

아하 이해했습니다 감사합니다~!

eunsekkang님의 프로필

eunsekkang

질문자

2023.12.15

질문 하나만 더해도 되겠습니까..
맛비님 설명은 이제 이해가 가는데
해당 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
eunsekkang님의 프로필

eunsekkang

질문자

2023.12.15

저렇게 맛비님의 14장 pipeline 코드 솔루션과 똑같은 베릴로그 코드 로직을 가지고 있구요.

처음 질문의 HDLBits Logic 그림은 Right Shift Register가 맞는거죠??

HDLBits그림으로 인해 자꾸 헷갈려서 질문 드립니다 ㅠㅠㅠ

해당 그림에서는 ff 의 indexing 숫자가 기재되어 있지 않아서, shift right 인지 left 인지 명확해보이지 않아요. 숫자를 기입해줘야 답변이 가능해보이네요 ㅋ

지식은 동등해졌으니, 판단은 각자의 영역 같아요. (제 답변은 적어드린 것과 같아서 해당 원칙내에서 저라면! 판단하겠습니다 ㅋ)

즐공하세요 :)

0

eunsekkang님의 프로필

eunsekkang

질문자

2023.12.15

아 그러네요. 인덱싱 표현이 위 그림엔 없군요 ! 감사합니다 ! 이제 좀 명확해진 것 같습니다