-
Leka
-
Автор темы
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Я обычно правлю файл, созданный мегавизардом (Квартус 13.1) - удаляю лишнее, добавляю параметры, иногда меняю логику. Но это совсем не обязательно. // megafunction wizard: %ALTPLL%
module pllreconf (
input areset,
input configupdate,
input scanclk,
input scanclkena,
input scandata,
output scandone,
input inclk0,
output c0
);
altpll altpll_component (
.areset (areset),
.configupdate (configupdate),
.inclk ({1'h0, inclk0}),
.scanclk (scanclk),
.scanclkena (scanclkena),
.scandata (scandata),
.clk ({3'b0,c0}),
.scandone (scandone),
.clkena ({6{1'b1}}),
.clkswitch (1'b0),
.extclkena ({4{1'b1}}),
.fbin (1'b1),
.pfdena (1'b1),
.pllena (1'b1),
.scanaclr (1'b0),
.scanread (1'b0),
.scanwrite (1'b0)
);
defparam
altpll_component.bandwidth_type = "AUTO",
altpll_component.clk0_divide_by = 5,
altpll_component.clk0_duty_cycle = 50,
altpll_component.clk0_multiply_by = 8,
altpll_component.clk0_phase_shift = "0",
altpll_component.compensate_clock = "CLK0",
altpll_component.inclk0_input_frequency = 40000,
altpll_component.intended_device_family = "Cyclone IV E",
altpll_component.lpm_type = "altpll",
altpll_component.operation_mode = "NORMAL",
altpll_component.pll_type = "AUTO",
altpll_component.port_areset = "PORT_USED",
altpll_component.port_configupdate = "PORT_USED",
altpll_component.port_inclk0 = "PORT_USED",
altpll_component.port_scanclk = "PORT_USED",
altpll_component.port_scanclkena = "PORT_USED",
altpll_component.port_scandata = "PORT_USED",
altpll_component.port_scandone = "PORT_USED",
altpll_component.port_clk0 = "PORT_USED",
altpll_component.self_reset_on_loss_lock = "OFF",
altpll_component.vco_frequency_control = "MANUAL_PHASE",
altpll_component.vco_phase_shift_step = 100,
altpll_component.width_clock = 5,
altpll_component.width_phasecounterselect = 3;
endmodule
Мой модуль, использующий ALTPLL.
pmouse - 9-разрядный код частоты, получаемый с мышки (ползунок на экране, 512 пикселей).
Кварцевый генератор у меня 25МГц, делится на 5 (N=5).
5МГц умножаются на 128...256 (М=128...256, VCO=640...1280МГц).
VCO делится на 2,4,8,16 (С0), получаем 4 диапазона 40МГц...80МГц...160МГц...320МГц...640МГц (по 128 частот в каждом диапазоне). module pllcfg (
input inclk, scanclk,
input [8:0] pmouse,
output c0
);
reg areset;
reg configupdate;
reg scanclkena;
wire scandata;
wire scandone;
reg [15:0][8:0] rom={
9'b0000_01000, 9'b1_00000_001, // LFcap, LFres, VCOpostscale, CPcurrent
9'b0_00000011, 9'b1_00000010, // Nbypass, Nhigh, Nodd, Nlow
9'b0_01000000, 9'b0_01000000, // M
9'b0_00010000, 9'b0_00010000, // C0
9'b1_10000000, 9'b0_00000000, // C1
9'b1_10000000, 9'b0_00000000, // C2
9'b1_10000000, 9'b0_00000000, // C3
9'b1_10000000, 9'b0_00000000 // C4
};
reg [8:0] p;
var [8:0] pm;
var [7:0] m;
var modd;
var [8:0] c;
reg [15:0][8:0] data;
reg [7:0] cnt;
reg rst0, rst1;
always@(posedge scanclk)begin
if(cnt != 0) cnt<=cnt+1;
if(cnt == 144) scanclkena<=0;
configupdate<=0;
if(cnt == 146) configupdate<=1;
if(cnt == 147) cnt<=0;
rst0<=rst1;
rst1<=scandone;
areset<=0;
if(rst0&~rst1) areset<=1;
if(scanclkena) data<=data>>1;
if((p!=pmouse)&(cnt==0)) begin
p<=pmouse;
pm=pmouse+1;
modd=pmouse[0];
m={2'b01,pm[6:1]};
c=pm[8:7]==0?8:
pm[8:7]==1?4:
pm[8:7]==2?2:
1;
data<=rom;
data[11]<={1'b0,m};
data[10]<={modd,m-modd};
data[9]<=c;
data[8]<=c;
scanclkena<=1;
cnt<=1;
end
end
assign scandata=data[0];
pllreconf (
areset,
configupdate,
scanclk,
scanclkena,
scandata,
scandone,
inclk,
c0
);
endmodule
|