Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

W03_PHJ #8

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

W03_PHJ #8

wants to merge 3 commits into from

Conversation

hyeonju0925
Copy link
Collaborator

@hyeonju0925 hyeonju0925 commented Nov 1, 2024

image

과제

  • i_fRecord 버튼 추가
  • FND 3,4,5 추가
  • i_fRecord 버튼을 누르면 FND 3,4,5에 현재 시간 값 저장
  • i_fStop 버튼을 누르면 저장된 값도 00.0으로 초기화

문제점

  • sec의 시간이 늘어나지 않음
  • tb파일에서 0,1로 신호를 주었는데 simulation에서 Record에 버튼의 신호가 없음(Start와 Stop사이에 신호 존재)

코드 설명 (StopWatch.v)

  • output에 Record의 시간 저장을 해줄 sec3, 4, 5를 추가
  • FND 3,4,5도 추가하여 Record의 버튼을 누르면 Record에 저장된 시간을 띄 울 수 있도록 함
  • c_State에 RECORD라는 케이스를 만들어서 기능을 수행
  • Record의 값을 띄우는 FND 3,4,5에 들어가는 Sec 3,4,5는 버튼을 누르는 case를 만들어 그 시점의 시간을 저장함
  • 저장 조건 또한 과제에 맞도록 변경

@hyeonju0925 hyeonju0925 self-assigned this Nov 1, 2024
Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제를 어떻게 인식하고 해결해야하는지 감을 잡은 것 같네요! 좋습니다
세세한 부분은 경험이 쌓이면 자연스럽게 좋아질 거니까 조금만 더 힘냅시다 ㅎㅎ

FND FND4(c_Sec4, o_Sec4);
FND FND5(c_Sec5, o_Sec5);

always@(posedge i_Clk or negedge i_Rst or negedge i_Rec)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

입력 신호는 크게 2가지로 나눌 수 있습니다

  1. 어떤 상황, 어떤 경우에서도 이 입력이 눌리면 강제로 정해진 대로 작동해야하는 비동기 입력
    ex) 리셋 버튼, 전원 버튼, 클락 신호
  2. 버튼이 눌리면 상황에 따라 다르게 동작하는 동기 입력
    ex) 키보드 입력, 마우스 입력, 버튼, 스위치 등등

always@(posedge i_Clk or negedge i_Rst) 의 경우 비동기 입력을 처리하는 부분입니다. 쉽게 이야기 하면 FPGA에서 리셋, 클락 신호를 제외한 비동기 입력은 거의 없다고 봐도 무방합니다. 따라서 i_Rec 입력으로 다루는 부분은 이 파트가 아닌 always@* 로 가는게 맞아요!

c_fStart = 1;
c_fStop = 1;
c_fRecord = 1;
end else if (!i_Rec) begin
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i_Rec로 state를 바꾸려는 시도는 재밌었습니다. 하지만 i_Rec는 동기 입력이고 , i_Rec, i_fRecord가 역할분담을 제대로 나뉘지 않게 되므로 i_Rec를 빼고 i_fRecord 가 역할을 수행하는게 좋아보여요

wire fStart, fStop, fRecord;

parameter LST_CLK = 100_000_000/20 - 1;
parameter IDLE = 2'b00, WORK = 2'b01, PAUSE = 2'b10, RECORD = 2'b11;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Record State를 만든 건 잘했어요! 틀린 건 아니지만 조금 아쉬운 부분이 있어 State를 다룰 때 팁을 조금만 적어볼게요

State가 필요한 경우는 다른 State와 완전히 다르게 동작하는 경우에 필요합니다.
ex) WORK 에는 Cnt를 더하고, IDLE 에는 Cnt가 0이 되고, PAUSE 에는 Cnt가 현재 값을 유지
Record 같은 경우는 현재 동작을 그대로 하면서 버튼 입력이 있을 때 작동하는 '추가 기능' 이라고 볼 수 있어요! 그래서 굳이 State를 두지 않고 버튼이 눌리면 작동하게 하는게 정배입니다.

코드 예시)

always@*
    begin
        // ...

        case(c_State)
            IDLE: begin
                // ...
            end

            WORK: begin
                // ...
                n_Sec3 = fRecord ? c_Sec0 : c_Sec3;
                // ...
            end

            PAUSE: begin
                // ...
                n_Sec3 = fRecord ? c_Sec0 : c_Sec3;
                // ...
            end

State를 만들어서 구현하는 것도 방법입니다! Record State에 추가적인 기능을 두고싶거나, 아니면 난 어떻게 해서든 State로 구현하고싶다 하면 State로 만들 수도 있어요

대신 기존의 작동(WORK, PAUSE)을 유지하면서 Record 동작을 할 수 있는 방안을 마련해야겠죠?

n_Sec5 = 0;
if(fStart) n_State = WORK;
end
WORK: begin
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 RECORD state를 구현한다면 여기서 state를 변환해야합니다.
if (fRecord) n_State = RECORD
이런 코드가 추가되어야겠죠?
PAUSE state에도 똑같이 RECORD State로 변환할 수 있어야겠죠??

reg fStart;
reg fStop;

StopWatch U0(Clk, Rst, fStart, fStop, fRecord, , );
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

StopWatch.v 의 입출력과 미묘하게 안맞다 그죠? 하나씩 나열해보면서 맞춰봐요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants