2016-12-20 4 views
3

AC701 kit (artix7)에 간단한 끌 3 깜박이는 디자인을 쓰고 싶습니다. 하지만 그렇게하려면 클럭 입력 차동 버퍼를 인스턴스화해야합니다.chisel3 블랙 박스로 자일링스 차동 클록 버퍼를 인스턴스화하는 방법은 무엇입니까?

IBUFDS #(
    .DIFF_TERM("TRUE"), 
    .IOSTANDARD("DEFAULT") 
) IBUFDS1_inst (
    .O(clock1), // Clock buffer 
    .I(clock1_p), // Diff_p clock 
    .IB(clock1_n) // Diff_n clock 
); 

내가 그것을 인스턴스화«블랙»클래스를 사용할 필요가 chisel documentation에서 읽을 : 자일링스는 그렇게하려면 다음을 Verilog 템플릿을 제공합니다. 그러나 나는 그것을 할 수 없다. 나는이 시도 :

class IbufdsParam extends VerilogParameters { 
    val DIFF_TERM = "TRUE" 
    val IOSTANDARD = "DEFAULT" 
} 

class IBUFDS extends BlackBox { 
    val params = new IbufdsParam() 
    val io = IO(new Bundle { 
    val O = Output(Bool()) 
    val I = Input(Bool()) 
    val IB = Input(Bool())}) 
    io.O.setName("O") 
    io.I.setName("I") 
    io.IB.setName("IB") 

    /* For simulation */ 
    io.O := io.I & ~io.IB 
} 

을하지만 그 chisel3이 VerilogParameters 클래스 모르는 것 같다 :

[error] blinking_led/blink.scala:5: not found: type VerilogParameters 
[error] class IbufdsParam extends VerilogParameters { 

그리고«말씀이 모듈 클럭을 사용하고 재설정하지 않는 방법을 모른다 ».

일단이 블랙 박스가 올바르게 선언되면 깜박이는 모듈의 메인 클럭에 출력 클럭 ('O')을 연결해야합니다. 어떻게하는지 잘 모르겠습니다. 나는 그것에 대해 생각하고있다 :

class Blink extends Module { 
    val io = IO(new Bundle { 
    val clock_p = Input(Bool()) 
    val clock_n = Input(Bool()) 
    val led = Output(Bool()) 
    }) 

    val ibufds = IBUFDS() 

    Driver.implicitClock := ibufds.io.O 
    ibufds.io.I := io.clock_p 
    ibufds.io.IB:= io.clock_n 

... 
} 

그러나 나는 그것이 옳은 길이 아닌가 생각한다. 그렇지 않습니까?

답변

3

이것은 문서 오류입니다. 잠시 후에 매개 변수화 된 블랙 박스에 chisel3 wiki 페이지를 추가 할 것입니다. 매개 변수화 된 블랙 박스는 현재 String of Strings 또는 Ints 또는 Long의 맵을 Blackox 생성자에 전달하여 사용할 수있는 Chisel3의 실험적 기능입니다.

chisel3에서
import chisel3._ 
import chisel3.experimental._ 

class IBUFDS extends BlackBox(Map("DIFF_TERM" -> "TRUE", 
            "IOSTANDARD" -> "DEFAULT")) { 
    val io = IO(new Bundle { 
    val O = Output(Clock()) 
    val I = Input(Clock()) 
    val IB = Input(Clock()) 
    }) 
} 

이 내재 된 시계가 없거나, 포트는 이름을 바꿀 수 없습니다 블랙 박스에 대한 재설정 대신 이름은 io_없이합니다 (IO 번들에 주어진 얻을 것이다 : 따라서 특정 사건에 대한 시도 추가됨). 시뮬레이션 동작은 현재 지원되지 않지만 Verilog 구현을 제공하고 Verilator로 전체 설계를 시뮬레이션 할 수 있습니다.

이제 O 출력을 IBUFDS으로하고 Blink 모듈에 연결하려고합니다. 하위 모듈을 사용하여 상위 시계를 무효화 할 수는 없지만 하위 모듈의 시계를 설정할 수는 있습니다. 따라서 Top 모듈을 제공하여 IBUFDSBlink을 인스턴스화하는 모듈을 제공 할 수 있습니다. 다음과 같이

class Blink extends Module { 
    val io = IO(new Bundle { 
    val led = Output(Bool()) 
    }) 
    val reg = Reg(init = false.B) 
    reg := !reg 
    io.led := reg 
} 

class Top extends Module { 
    val io = IO(new Bundle { 
    val clock_p = Input(Clock()) 
    val clock_n = Input(Clock()) 
    val led = Output(Bool()) 
    }) 

    val ibufds = Module(new IBUFDS) 
    ibufds.io.I := io.clock_p 
    ibufds.io.IB:= io.clock_n 

    val blink = Module(new Blink) 
    blink.clock := ibufds.io.O 
    io.led := blink.io.led 
} 

이 코드는 인스턴스화 IBUFDS에 이르게 :

당신이 원하는 일을한다고 생각
IBUFDS #(.DIFF_TERM("TRUE"), .IOSTANDARD("DEFAULT")) ibufds (
    .IB(ibufds_IB), 
    .I(ibufds_I), 
    .O(ibufds_O) 
); 

!

+0

답장을 보내 주셔서 감사합니다. 우리는 Verilog 시뮬레이션을 위해 Verilog 블랙 박스 구현을 제공 할 수 있다고 말합니다. 동일한 파일에 제공 할 수 있습니까? 그것을하는 방법을 말할 수 있습니까? – FabienM

+1

괜찮습니다! Verilog는 빌드 프로세스의 후반부에 포함 된 별도의 파일에 있어야합니다 (예 : * Chisel + Firrtl이 Verilog를 생성 한 후 *.). 기본적으로 Verilog 시뮬레이션 단계에서는 Chisel에서 생성 된 Verilog와 함께 Blackbox 구현을 포함하는 Verilog 파일을 포함하면됩니다. – jkoenig