blob: 9cc5c0444dda9a429df4360cb8781bf1cfd14ba1 [file] [log] [blame] [edit]
//Legal Notice: (C)2010 Altera Corporation. All rights reserved. Your
//use of Altera Corporation's design tools, logic functions and other
//software and tools, and its AMPP partner logic functions, and any
//output files any of the foregoing (including device programming or
//simulation files), and any associated documentation or information are
//expressly subject to the terms and conditions of the Altera Program
//License Subscription Agreement or other applicable license agreement,
//including, without limitation, that your use is for the sole purpose
//of programming logic devices manufactured by Altera and sold by Altera
//or its authorized distributors. Please refer to the applicable
//agreement for further details.
// synthesis translate_off
`timescale 1ns / 1ps
// synthesis translate_on
// turn off superfluous verilog processor warnings
// altera message_level Level1
// altera message_off 10034 10035 10036 10037 10230 10240 10030
module pll (
// inputs:
address,
chipselect,
clk,
read,
reset_n,
write,
writedata,
// outputs:
c0,
c1,
c2,
readdata,
resetrequest
)
;
output c0;
output c1;
output c2;
output [ 15: 0] readdata;
output resetrequest;
input [ 2: 0] address;
input chipselect;
input clk;
input read;
input reset_n;
input write;
input [ 15: 0] writedata;
wire always_one;
wire areset_n;
wire c0;
wire c1;
wire c2;
wire control_reg_en;
wire [ 15: 0] control_reg_in;
reg [ 15: 0] control_reg_out;
reg count_done;
reg [ 5: 0] countup;
wire inclk0;
reg not_areset /* synthesis ALTERA_ATTRIBUTE = "PRESERVE_REGISTER=ON" */;
wire [ 15: 0] readdata;
wire resetrequest;
wire [ 15: 0] status_reg_in;
reg [ 15: 0] status_reg_out;
initial
begin
countup = 1'b0;
count_done = 1'b0;
not_areset = 1'b0;
end
assign status_reg_in[15 : 1] = 15'b000000000000000;
assign resetrequest = ~count_done;
//Up counter that stops counting when it reaches max value
always @(posedge clk or negedge areset_n)
begin
if (areset_n == 0)
countup <= 0;
else if (count_done != 1'b1)
countup <= countup + 1;
end
//Count_done signal, which is also the resetrequest_n
always @(posedge clk or negedge areset_n)
begin
if (areset_n == 0)
count_done <= 0;
else if (countup == 6'b111111)
count_done <= 1'b1;
end
//Creates a reset generator that will reset internal counters that are independent of global system reset
always @(posedge clk or negedge 1'b1)
begin
if (1'b1 == 0)
not_areset <= 0;
else
not_areset <= always_one;
end
assign always_one = 1'b1;
assign status_reg_in[0] = 1'b0;
assign areset_n = not_areset;
assign inclk0 = clk;
//Mux status and control registers to the readdata output using address as select
assign readdata = (address[0] == 0)? status_reg_out :
({control_reg_out[15 : 2], ~control_reg_out[1], control_reg_out[0]} );
//Status register - Read-Only
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
status_reg_out <= 0;
else
status_reg_out <= status_reg_in;
end
//Control register - R/W
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 0)
control_reg_out <= 0;
else if (control_reg_en)
control_reg_out <= {control_reg_in[15 : 2], ~control_reg_in[1], control_reg_in[0]};
end
assign control_reg_in = writedata;
assign control_reg_en = (address == 3'b001) && write && chipselect;
//s1, which is an e_avalon_slave
altpllpll the_pll
(
.c0 (c0),
.c1 (c1),
.c2 (c2),
.inclk0 (inclk0)
);
endmodule