• 카테고리

    질문 & 답변
  • 세부 분야

    반도체

  • 해결 여부

    미해결

lab9 LED 점등 시간 제어 실습 관련하여 질문 있습니다.

23.04.18 18:29 작성 23.04.18 18:40 수정 조회수 315

1

안녕하세요 맛비님!

lab9 실습에서 FPGA에 bitstream을 올리고 나서 register에 값을 쓰고/읽고 하며 LED 점등시간을 제어하는 과정을 따라해 보았는데, 처음에는 제가 작성한 code로 해보았습니다.

그런데, write, read는 문제없이 동작을 하는 것을 확인을 하였는데, 아무 값도 write하지 않고 가만히 있었을 때 약 35~45초 간격으로 LED가 저절로 켜지고/꺼지고를 반복하는 문제를 발견했습니다. Read를 통해 register에 쓰인 data값을 읽어보면 모두 0으로 나옵니다..

그래서 맛비님께서 제공해주신 코드로 다시 ip생성~ bitstream upload까지 전 과정을 다시 해보았는데도 같은 문제가 발생합니다.

  1. 혹시 어떤 이유 때문에 이런 문제가 발생 하는 건지 궁금합니다.

  2. 또, data를 0~3까지의 4개의 register에 쓰는데 0~3이외의 다른 주소에도 써보면 어떨까 궁금해서 5, 10등 다른 주소에도 값을 써보았는데, 5번지에 값을 썼을 때는 2번 register에 Write가 되고, 10번지에 값을 썼을 때는 3번 register에 write 되는 식으로 동작하던데, 0x4C00 0000부터 64k의 memory를 할당했기 때문에 4byte*4의 메모리를 제외하고 나머지는 이 4byte*4의 주소가 계속 반복되는 식으로 할당된 것이라 이런 것인지 궁금합니다.

  3. lab 9의 counter_toggle_out module에서 always문의 sensitivity list에 posedge clk만 들어가 있는데, lab 5에는 negedge reset_n도 들어 있었는데, 어떤 이유에서 이런 변화가 있는건지 궁금합니다.

    module counter_toggle_out
    (
    ~	
    );
    	always @(posedge clk) begin
    	    if(!reset_n) begin	 // (lab9) used sync reset_n		 
    	      ~
    	end
    
    endmodule

또 이와 관련해서 reset_n 이 이번 lab에서 구현한 system에서는 언제 어떻게 인가가 되는지 궁금합니다..

(아무것도 찾아보지 않고 질문 드리는 것은 아니고, Behavioral simulation을 해봐도 전부 Z값으로 나오고, PS Reset이라는 module이 어떻게 동작하는지를 어디서 어떻게 보는지 잘 모르겠네요 ㅜㅜ)

 

긴 글 읽어주셔서 감사합니다. 좋은 저녁 되세요 :)

답변 1

답변을 작성해보세요.

0

안녕하세요 :)

먼저 답변에 들어가기 전에 한가지 확인을 부탁드리고 싶은 사항은 다음과 같습니다.

제가 제공해드린 코드와 프로젝트 압축파일은, 영상제작시 정상동작을 하였던 파일들 입니다.

Q1. 혹시 어떤 이유 때문에 이런 문제가 발생 하는 건지 궁금합니다.

A1. Vivado tool version 이 질문자님과 서로 다르다. 이 변수 말고는 생각나는 이슈는 없습니다. Board 내의 FPGA Chip 이 변수가 되는 순간.. 이거는 해결방안이 없기 때문에 아니기를 바래야죠ㅎ

그렇기 때문에, 정말 제가 제공해드린 프로젝트와 어느 부분이 다른지 비교를 부탁드립니다. (Vitis 이야기는 안하시는 것으로 보아, SW c code 도 동일하게 쓰셨겠죠? 여기서 문제가 되었을 수 있습니다. SW 에서 엉뚱한 Reg 를 접근하면 문제가 될 수 있을 것 같아요. Reg address 의 미스로 인해서요.)

완벽하게 같다. 차이점을 못찾겠다 하시면, 문제가 되었던 아래 프로젝트 (vivado, vitis 폴더 압축) 를 공유드라이브에 올려주시고 링크주세요. 주말중에 확인해보겠습니다. (저는 기존 프로젝트와, 제공해주시면 프로젝트의 차이점을 확인해볼 예정입니다. 혹시 전달 해주시게 된다면 꼭 확인 부탁드릴께요)

그래서 맛비님께서 제공해주신 코드로 다시 ip생성~ bitstream upload까지 전 과정을 다시 해보았는데도 같은 문제가 발생합니다.

 

Q2. 또, data를 0~3까지의 4개의 register에 쓰는데 0~3이외의 다른 주소에도 써보면 어떨까 궁금해서 5, 10등 다른 주소에도 값을 써보았는데, 5번지에 값을 썼을 때는 2번 register에 Write가 되고, 10번지에 값을 썼을 때는 3번 register에 write 되는 식으로 동작하던데, 0x4C00 0000부터 64k의 memory를 할당했기 때문에 4byte*4의 메모리를 제외하고 나머지는 이 4byte*4의 주소가 계속 반복되는 식으로 할당된 것이라 이런 것인지 궁금합니다.

A2. 다른 주소에 썼을때, 동작이 어떻게 될지는 설계자인 저도 보장을 해드릴 수 없습니다. 가장 확실한건, ILA 를 달아보시고요. 실제 다른 주소에 썼을때, 어떤 주소가 물리적으로 나가는지 확인해보시고, 원인을 찾아보셔요.

방법은 알려드렸고, 스스로 할 수 있다는 판단이 되어서, 이정도로 마무리 하겠습니다.

Q3. lab 9의 counter_toggle_out module에서 always문의 sensitivity list에 posedge clk만 들어가 있는데, lab 5에는 negedge reset_n도 들어 있었는데, 어떤 이유에서 이런 변화가 있는건지 궁금합니다.

A3. reset 을 sync 로 하느냐, async 로 하느냐의 차이를 여쭤보시는 것 같고요. 강의를 만들 당시에 이 부분에 대해서 고민을 해보지 않았어서 혼용사용이 되었을 수 있습니다.

해드리고 싶은 이야기는 "FPGA 를 Target 으로 하는 Verilog 설계다" 하시면, Sync reset 을 사용하시는 것이 util, timing 관점에서 좋고요. "ASIC 을 Target 으로 하는 Verilog 설계다" async reset 을 사용하시는 것을 추천 드립니다. clock 이 인가되지 않았을때, reset 을 하기 위함. 다음링크 참고 부탁드립니다.

https://aifpga.tistory.com/entry/Verilog-HDL-QA-021-reset%EC%9D%84-negative%EB%A1%9C-%EC%A3%BC%EC%8B%9C%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%AD%90%EC%A3%A0-positive%EC%97%90%EB%8A%94%EC%9D%B4%EB%AF%B8-clk%EC%9D%B4-%ED%95%A0%EB%8B%B9%EB%90%98%EC%9E%88%EC%96%B4%EC%84%9C%EA%B7%B8%EB%9F%B0%EA%B0%80%EC%9A%94

 

Q4. 또 이와 관련해서 reset_n 이 이번 lab에서 구현한 system에서는 언제 어떻게 인가가 되는지 궁금합니다..

A4. PS 에서 출력되는 reset 을 연결했고요. PS 에서 발생하는 FCLK_RESET0_N 은 bit stream 이 올라가면 최초로 reset 을 걸도록 되어 있습니다. (Arm processor 의 부팅 과정 중 하나입니다.) 다음 링크 참고 부탁드립니다.

https://aifpga.tistory.com/entry/FPGA-QA-008-FCLKReset-%EC%9D%84-PS-%EC%97%90%EC%84%9C-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0

Q5. (아무것도 찾아보지 않고 질문 드리는 것은 아니고, Behavioral simulation을 해봐도 전부 Z값으로 나오고, PS Reset이라는 module이 어떻게 동작하는지를 어디서 어떻게 보는지 잘 모르겠네요 ㅜㅜ)

A5. Behavioral simulation 을 어떻게 돌리셨다는건지는 잘 모르겠습니다. testbench 는 당연히 코딩하셨겠죠? testbench 내에 reset 을 주는 부분이 기술되어 있지 않다면 (이건 당연히 보고싶어하시는 질문자님께서 해야하는 일입니다.) Z 가 나올 수 밖에 없을 것 같습니다. 적절한 Testbench 기술이 필요해보입니다.

즐공하세요 :)

채널톡 아이콘