МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Реконфигурация PLL

Реконфигурация PLL 1 год 6 мес. назад #7212

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 631
  • Спасибо получено: 51
Я обычно правлю файл, созданный мегавизардом (Квартус 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
Спасибо сказали: umarsohod

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka. Причина: Исправил {modd,m-modd};

Реконфигурация PLL 1 год 5 мес. назад #7304

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 631
  • Спасибо получено: 51
Исправил ошибку (частота не зависела от pmouse[0], заметил это, когда добавил автоматическое сканирование частоты генератора в своем осциллографе).
было: data[10]<={modd,m};
стало: data[10]<={modd,m-modd};

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.137 секунд

facebook  GitHub  YouTube  Twitter