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

W02_PHJ #6

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

W02_PHJ #6

wants to merge 3 commits into from

Conversation

hyeonju0925
Copy link
Collaborator

image

코드의 목적과 바꾼점

먼저 이 코드의 목적은 UP 버튼을 누르면 숫자가 올라가고 DOWN 버튼을 누르면 내려간다. 초기화 버튼을 누르면 초기화가 되고
내가 바꾼 코드는 먼저 LED를 먼저 하나 더 만들어서 10의 자리까지 표현하였다 c_Cnt의 값을 10으로 나누어 몫값을 나타내고 10으로 나눈 나머지를 일의 자리에 놔두었다 그리고 기존의 UP버튼을 누르면 2씩 곱해지고 DOWN 버튼을 누르면 2씩 나누어진다.

코드 분석(Counter.v)

사용할 변수들을 맨 처음 선언을 한다
i_Clk : 클릭신호인걸까..? , i_Rst : 리셋 , i_Push : 버튼을 누를때 , o_LED : LED관련 , o_FND : 디스플레이로 생각된다
always@안에는 i_Rst의 신호가 들어오면 c_Cnt를 초기화하고 2'b11은 잘 모르겠다,,,,,,,,,,,,, 그 밑에는 버튼을 누르면 값이 올라가고 내려가는 부분인데 그 부분을 바꾸었다.

코드분석(FND.v)

이 파일의 코드는 숫자를 나타낼때 사용하는 코드인 듯하다
i_Num을 4비트로 선언하여 0~9까지만 사용할 수 있도록 하였고 디스플레이의 각 세그먼트이다..? 그 밑에는 각 숫자를 나타낼 때 사용하는 코드들이다 0일때는 0을 나타내고 그런 코드들

코드분석(tb_Counter.v)

똑같이 사용할 변수들을 비트와 같이 선언해주었다 그리고 각 변수들에게 기본 값으로 초기화하였고 Push를 눌렀다가 때고를 반복한다 누르면 0 누르지 않으면 1

@hyeonju0925 hyeonju0925 self-assigned this Oct 9, 2024
@yuyu0830
Copy link
Collaborator

yuyu0830 commented Oct 9, 2024

아이디어는 좋았지만 FND랑 LED, Cnt의 역할을 조금 헷갈린 것 같아요.. 그래도 좋은 시도였습니다
그리고 어떻게 시간 안에 맞춰서 업로드 했네요 ㅋㅋㅋㅋ 고생했습니다 ㅎㅎ

PHJu/Counter.v Outdated

assign {fUp, fDn} = ~i_Push & c_UpDn;
assign o_LED1 = c_Cnt >= 10 ? c_Cnt / 10 : 0;
assign o_LED2 = c_Cnt >= 10 ? c_Cnt % 10 : c_Cnt;
Copy link
Collaborator

Choose a reason for hiding this comment

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

새로운 해결방법! o_LED에 대한 값을 10 처리를 했네요 ㅎㅎ
아쉬운건 어차피 값은 c_Cnt에 저장이 되니 c_Cnt에 저장되는 부분을 손봤으면 어땠을까 싶네요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

그 때 설명을 들었을때 한 세그먼트에 0~9까지 표현이 된다고 기억을 했습니다 그래서 저는 1의 자리와 10의 자리도 표현하고 싶어서 세그먼트를 하나 더 만들려고 했고 그거를 10으로 나누어서 몫과 나머지로 표현,,,하고자 했습니다

PHJu/Counter.v Outdated
begin
n_UpDn = i_Push;
n_Cnt = fUp ? c_Cnt * 2 :
fDn ? c_Cnt / 2 : c_Cnt + 2;
Copy link
Collaborator

Choose a reason for hiding this comment

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

여긴 일부러 손본건가요? 여기 있는 코드 대로라면

  1. fUp가 1인 경우 : 현재 값에 2를 곱한다
  2. fDown가 1인 경우 : 현재 값을 2로 나눈다
  3. 둘 다 아닌 경우 : c_Cnt에 2를 더한다
    이렇게 되는데 의도한 부분이 맞나요? 매 클락마다 2씩 더해질텐데..!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

일부러 손댄 것이 맞습니다 원래 1씩 더해지고 빼는 식이었는데 저는 2가 계속 곱해도보고 나누고 싶었고 둘 다 아니라면 2를 더하고 싶었숨다

Copy link
Collaborator

Choose a reason for hiding this comment

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

1번 버튼은 * 2
2번 버튼은 / 2 일 때
언제 +2가 되는 걸 의도한건가요?? 만약 이대로라면 1초에 5,000,000번 2가 더해지게 돼서 그냥 FND가 반짝반짝 거리는 걸로 보일 것 같은데 ㅋㅋㅋㅋ

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ㅋㅎㅋㅎㅋㅎㅋㅎㅋㅎ 이때 왜 그랬는지는 모르겠는데 지금 다시 보니까 +2가 없고 그냥 c_Cnt로 했었어야 했는데 그래서 고쳐서 올릴려고 해요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@yuyu0830 LED지우고 코드 FND를 추가했는데 맞는지 확인 부탁드려도 될까요..?🥺

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.

아직 조금 헷갈리는 것 같지만 그래도 점차 이해를 하는 것 같아서 너무너무 뿌듯합니다. 진짜 조금만 손보면 될듯

begin
n_UpDn = i_Push;
n_Cnt1 = fUp ? c_Cnt * 2 :
fDn ? c_Cnt / 2 : c_Cnt + 1;
Copy link
Collaborator

Choose a reason for hiding this comment

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

image

이 부분은 아직 안고쳐진 것 같아요... 이 코드를 풀어쓰면 아래와 같아요!

if (fUp) {
   c_Cnt *= 2;
}
else if (fDn) {
   c_Cnt /= 2;
}
else {
   c_Cnt += 1;
}

이 부분이 매 클럭 실행되다보니까 조건에 부합하지 않아도 c_Cnt += 1 가 매번 실행되게 됩니다

아마 c_Cnt + 1c_Cnt 를 의도한 것 같은데 맞나요??

Copy link
Collaborator

Choose a reason for hiding this comment

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

어 그러고보니까 c_Cnt 랑 c_Cnt1 이랑 c_Cnt2랑 혼용되는 것 같아요

fDn ? c_Cnt / 2 : c_Cnt + 1;
if(n_Cnt1>=10){
n_Cnt2=n_Cnt1/10;
n_Cnt1-n_Cnt1%10;
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 부분은 제가 생각하는 대로라면

n_Cnt1(1의 자리 숫자) 가 10보다 같거나 크면

  1. n_Cnt2(10의 자리 숫자) 를 n_Cnt1의 10의 자리 수 만큼 더한다
  2. n_Cnt1를 다시 10 보다 작게 만든다

인 것 같은데 여기서 생길 수 있는 문제점이 몇 개 있습니다. n_Cnt1의 최대치는 15인데 9를 *2 한 경우 최대치를 넘어 18을 저장해야하는 오류, n_Cnt2 는 *2 연산에 포함되지 않는 오류 가 있을 수 있습니다.

이 부분은 로직이 조금 복잡할 것 같아서 조금 힌트를 드릴게요 (저도 생각하느라 시간이 좀 걸렸네요 ㅎㅎ..)

조건

  • FND 2개를 써서 0~99 까지 카운터 표현
  • 1번 버튼을 누르면 현재 값 * 2
  • 2번 버튼을 누르면 현재 값 / 2
  • 99를 넘어가면 99에서 멈춤

변수

reg [6:0] c_Cnt, n_Cnt (0 ~ 99까지 저장)
output wire [4:0] o_LED1, o_LED2 (각각 1의 자리, 10의 자리 출력값)

assign o_LED1 = c_Cnt % 10; // c_Cnt 의 1의 자리
assign o_LED2 = c_Cnt / 10; // c_Cnt 의 10의 자리

n_Cnt는 1번 버튼을 누르면 현재값 * 2 (혹시 99보다 크면 99로 고정), 2번 버튼을 누르면 현재 값 / 2, 둘 다 아니면 현재값 유지

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