2021-02-28 18:59:56 +03:00

78 lines
1.7 KiB
Systemverilog

`timescale 1ns/100ps
/**
* PLL configuration 12MHz->30MHz
*
* F_PLLOUT: 30.000 MHz (requested)
* F_PLLOUT: 30.000 MHz (achieved)
*
* FEEDBACK: SIMPLE
* F_PFD: 12.000 MHz
* F_VCO: 960.000 MHz
*
* DIVR: 0 (4'b0000)
* DIVF: 79 (7'b1001111)
* DIVQ: 5 (3'b101)
*
* FILTER_RANGE: 1 (3'b001)
*/
`ifdef VERILATOR
`define TESTBENCH
`endif
module pll
(input clock_in,
output clock_out,
output locked);
wire unused_0, unused_1;
`ifdef TESTBENCH
`ifdef VERILATOR
/* In Verilator just forward clock_in to clock_out */
assign clock_out = clock_in;
assign locked = 1'b1;
`else // !VERILATOR
/* In Icarus Verilog generate new clock and 'locked' signal */
logic clock_tb;
logic lock_tb;
assign clock_out = clock_tb;
assign locked = lock_tb;
initial begin
clock_tb = 1'b0;
lock_tb = 1'b0;
repeat (100) @(posedge clock_tb);
lock_tb = 1'b1;
end
always #(33ns/2) clock_tb <= ~clock_tb;
`endif
`else
/* In HW use PLL primitive */
SB_PLL40_PAD #(.FEEDBACK_PATH("SIMPLE"),
.DIVR(4'd0),
/* For 30 MHz: DIVF=79, DIVQ=5
* For 50 MHz: DIVF=66, DIVQ=4 */
.DIVF(7'd79),
.DIVQ(3'd5),
.FILTER_RANGE(3'd1))
uut (.PACKAGEPIN (clock_in),
.PLLOUTGLOBAL (clock_out),
.EXTFEEDBACK (1'b0),
.DYNAMICDELAY (8'b0),
.LOCK (locked),
.BYPASS (1'b0),
.RESETB (1'b1),
.LATCHINPUTVALUE(1'b0),
.PLLOUTCORE (unused_0),
.SDO (unused_1),
.SDI (1'b0),
.SCLK (1'b0));
`endif
endmodule