작성
·
628
답변 3
1
너무 오래전 글이라 너무 뒷북이긴 하지만
vivado에 있는 Templete코드
xilinx_true_dual_port_no_change_2_clock_ram으로 한번 lab12 구현해보았습니다.
테스트벤치 결과 잘 됩니다.
dual_port_2_clock_ram #
(
.RAM_WIDTH (MEM0_DATA_WIDTH ), // Specify RAM data width
.RAM_DEPTH (MEM0_MEM_DEPTH ), // Specify RAM depth (number of entries)
.RAM_PERFORMANCE ("LOW_LATENCY" ), // Select "HIGH_PERFORMANCE" or "LOW_LATENCY"
.INIT_FILE ("" ) // Specify name/location of RAM initialization file if using one (leave blank if not)
)
dual_port_2_clock_ram_inst
(
// Core
.addra ( ), // Port A address bus, width determined from RAM_DEPTH
.ena ( ), // Port A RAM Enable, for additional power savings, disable port when not in use
.regcea ( ), // Port A output register enable
.wea ( ), // Port A write enable
.douta ( ), // Port A RAM output data, width determined from RAM_WIDTH
.dina ( ), // Port A RAM input data, width determined from RAM_WIDTH
.clka ( ), // Port A clock
.rsta ( ), // Port A output reset (does not affect memory contents)
// Ctrl
.addrb (mem0_addr1), // Port B address bus, width determined from RAM_DEPTH
.enb (mem0_ce1 ), // Port B RAM Enable, for additional power savings, disable port when not in use
.regceb (mem0_ce1 ), // Port B output register enable
.web (mem0_we1 ), // Port B write enable
.doutb (mem0_q1 ), // Port B RAM output data, width determined from RAM_WIDTH
.dinb (mem0_d1 ), // Port B RAM input data, width determined from RAM_WIDTH
.clkb (mem0_clk1 ), // Port B clock
.rstb (mem0_rst1 ) // Port B output reset (does not affect memory contents)
);
이런식으로 instanciation 했구요
RAM_PERFORMANCE의 default값인 HIGH_PERFORMANCE로 하지 않고 LOW_LATENCY로 한 이유는
HIGH_PERFORMANCE로 하였을 경우에는 2클럭 더 늦게 나옵니다.
low latency일 경우에는 1클럭 딜레이지만 high performance일 경우 2클럭 딜레이라고 코드에 써 있습니다.
제 프로젝트랑 소스코드입니다. 프로젝트 들어가서 run simulation누르시면 볼 수 있습니다.
https://drive.google.com/file/d/1hljaATJFlQ2pbz08046E_j8vVR0-XFAh/view?usp=sharing
필요하신분들 참고 부탁드립니다!!
HIGH_PERFORMANCE는 주파수 높은 경우 타이밍문제 줄일려고 쓰는거 같다고 그렇게 예상하고 있었는데 진짜였네요!! 감사합니다!!
맛비님 덕에 대학교 3학년을 무사히 마치게 되었습니다. (특히 디지털 시스템 수업에서 맛비님의 덕을 많이 봤습니다.)
올해에는 더 성장할수 있도록 최선을 다하려고 합니다.
맛비님도 2023년 동안 매우 고생하셨구
새해복 많이 받으시고 올해엔 원하는 바 다 이루시길 바랍니다!!
1
0
안녕하세요 :)
제가 전달드린 코드는 vivado hls 에서 변환해서 만든게 맞아요.
직접 FPGA 에서 implementation 이 가능한 BRAM .v 코드를 만들고 싶다고 하시면..
다음 방법을 시도해 보시는 건 어떨까요?
저도 처음해보는데, 궁금해서 찾아봤습니다. 결론은 잘됩니다 :)
1. 먼저 vivado tool 에서 프로젝트 아무거나? 하나 여시구요. (저는 chapter 10 을 열었습니다.)
2. 그 상태에서 위의 돋보기에 "Language Templates" 이라고 검색해서 눌러주세요
3. Veriog -> Synthesis Constructs -> Example Modules -> RAM -> BlockRAM -> 원하시는 메모리 코드 선택
4. 원하시는 RAM 선택 후, 우측에 있는 코드를 복사해서 사용
1. 프로젝트를 하나 만듭니다.
2. template code 메모리를 .v 코드로 복 붙 했습니다.
3. synthesis 눌렀습니다.
4. 결과 확인
BRAM 0.5 로 resource 잡히신거 보이시나요? 잘되네요 ㅎ
참고로 implementation 을 통한 bitstream 은 당연히 이 예제에서 안되는건 아시죠?
여기있는 Templete 코드들을 응용하시면 원하는 답이 되지 않을까 생각합니다. (다양한 모듈들이 있네요)
음..;;; 제가 Test 했던 project 파일 첨부파일로 안올라가네요...?
링크로 걸어드립니다. 확인해보세요.
원하시는 답변 맞나요....??!
즐공하세요 :)
공기정님!! 오래간? 만이네요 ㅎ 이렇게 정리해 주셔서 감사합니다.
새해를 앞두고 이런 선물을, 복 받으실 꺼에요.
추가로 적자면
High performance == High frequency 이기 때문에, reg to reg delay 를 최소화 하기 위해서 2 cycle 이 되었고요. FPGA 상에서 제 경험상 5 cycle 이상도 해본 적이 있어요. (Routing delay 최소화)
올 한해도 고생 많으셨고요. 새해 복 많이 받으세요!!