📄 altera_primitives.v
字号:
end
end
end
else
violation = 0;
end
pll_last_falling_edge = $realtime;
end
else if (pll_lock == 1)
begin
if (inclk == 1'b1)
expected_next_clk_edge = pll_last_rising_edge + (inclk_period+clk_per_tolerance)/2;
else if (inclk == 'b0)
expected_next_clk_edge = pll_last_falling_edge + (inclk_period+clk_per_tolerance)/2;
else
expected_next_clk_edge = 0;
violation = 0;
if ($realtime < expected_next_clk_edge)
next_clk_check = 2;
else if ($realtime == expected_next_clk_edge)
next_clk_check = 1;
else
begin
$display($realtime, "ps Warning: Inclock_Period Violation");
violation = 1;
if (pll_lock == 1'b1)
begin
stop_lock_count = stop_lock_count + 1;
expected_next_clk_edge = $realtime + (inclk_period/2);
if (stop_lock_count == invalid_lock_cycles)
begin
pll_lock = 0;
$display ($realtime, "ps Warning: altclklock out of lock.");
start_lock_count = 1;
stop_lock_count = 0;
outclk_tmp = 1'bx;
end
else
next_clk_check = 2;
end
end
end
clk_last_value = inclk;
end
// outclk output
always @(posedge schedule_outclk)
begin
// initialise variables
inc0 = 1;
cycle_to_adjust0 = 0;
output_value0 = 1'b1;
sched_time0 = 0;
rem0 = outclk_synchronizing_period % outclk_cycles_per_sync_period;
ori_per0 = outclk_synchronizing_period / outclk_cycles_per_sync_period;
// schedule <outclk_cycles_per_sync_period> number of outclk cycles in this
// loop - in order to synchronize the output clock always to the input clock
// to get rid of clock drift for cases where the input clock period is
// not evenly divisible
for (clk_cnt0 = 1; clk_cnt0 <= outclk_cycles_per_sync_period;
clk_cnt0 = clk_cnt0 + 1)
begin
tmp_per0 = ori_per0;
if ((rem0 != 0) && (inc0 <= rem0))
begin
tmp_rem0 = (outclk_cycles_per_sync_period * inc0) % rem0;
cycle_to_adjust0 = (outclk_cycles_per_sync_period * inc0) / rem0;
if (tmp_rem0 != 0)
cycle_to_adjust0 = cycle_to_adjust0 + 1;
end
// if this cycle is the one to adjust the output clock period, then
// increment the period by 1 unit
if (cycle_to_adjust0 == clk_cnt0)
begin
tmp_per0 = tmp_per0 + 1;
inc0 = inc0 + 1;
end
// adjust the high and low cycle period
high_time0 = tmp_per0 / 2;
if ((tmp_per0 % 2) != 0)
high_time0 = high_time0 + 1;
low_time0 = tmp_per0 - high_time0;
// schedule the high and low cycle of 1 output clock period
for (cyc0 = 0; cyc0 <= 1; cyc0 = cyc0 + 1)
begin
// Avoid glitch in vcs when high_time0 and low_time0 is 0
// (due to outclk_synchronizing_period is 0)
if (outclk_synchronizing_period != 0)
outclk_tmp = #(sched_time0) output_value0;
else
outclk_tmp = #(sched_time0) 1'b0;
output_value0 = ~output_value0;
if (output_value0 == 1'b0)
begin
sched_time0 = high_time0;
end
else if (output_value0 == 1'b1)
begin
sched_time0 = low_time0;
end
end
end
// drop the schedule_outclk to 0 so that the "always@(inclk)" block can
// trigger this block again when the correct time comes
schedule_outclk = #1 1'b0;
end
always @(outclk_tmp)
begin
outclk <= outclk_tmp;
end
endmodule // clklock
// END OF MODULE CLKLOCK
`timescale 1 ps / 1 ps
module alt_inbuf (i, o);
input i;
output o;
parameter io_standard = "NONE";
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter lpm_type = "alt_inbuf";
assign o = i;
endmodule
`timescale 1 ps / 1 ps
module alt_outbuf (i, o);
input i;
output o;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter slow_slew_rate = "NONE";
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter lpm_type = "alt_outbuf";
assign o = i;
endmodule
`timescale 1 ps / 1 ps
module alt_outbuf_tri (i, oe, o);
input i;
input oe;
output o;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter slow_slew_rate = "NONE";
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter lpm_type = "alt_outbuf_tri";
bufif1 (o, i, oe);
endmodule
`timescale 1 ps / 1 ps
module alt_iobuf (i, oe, io, o);
input i;
input oe;
inout io;
output o;
reg o;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter slow_slew_rate = "NONE";
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter input_termination = "NONE";
parameter output_termination = "NONE";
parameter lpm_type = "alt_iobuf";
always @(io)
begin
o = io;
end
assign io = (oe == 1) ? i : 1'bz;
endmodule
`timescale 1 ps / 1 ps
module alt_inbuf_diff (i, ibar, o);
input i;
input ibar;
output o;
parameter io_standard = "NONE";
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter lpm_type = "alt_inbuf_diff";
reg out_tmp;
always@(i or ibar)
begin
casex({i,ibar})
2'b00: out_tmp = 1'bx;
2'b01: out_tmp = 1'b0;
2'b10: out_tmp = 1'b1;
2'b11: out_tmp = 1'bx;
default: out_tmp = 1'bx;
endcase
end
assign o = out_tmp;
endmodule
`timescale 1 ps / 1 ps
module alt_outbuf_diff (i, o, obar);
input i;
output o;
output obar;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter lpm_type = "alt_outbuf_diff";
assign o = i;
assign obar = !i;
endmodule
`timescale 1 ps / 1 ps
module alt_outbuf_tri_diff (i, oe, o, obar);
input i;
input oe;
output o;
output obar;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter lpm_type = "alt_outbuf_tri_diff";
bufif1 (o, i, oe);
bufif1 (obar, !i, oe);
endmodule
`timescale 1 ps / 1 ps
module alt_iobuf_diff (i, oe, io, iobar, o);
input i;
input oe;
inout io;
inout iobar;
output o;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter input_termination = "NONE";
parameter output_termination = "NONE";
parameter lpm_type = "alt_iobuf_diff";
reg out_tmp;
always @(io or iobar)
begin
casex({io,iobar})
2'b00: out_tmp = 1'bx;
2'b01: out_tmp = 1'b0;
2'b10: out_tmp = 1'b1;
2'b11: out_tmp = 1'bx;
default: out_tmp = 1'bx;
endcase
end
assign o = out_tmp;
assign io = (oe === 1'b1) ? i : (oe === 1'b0) ? 1'bz : 1'bx;
assign iobar = (oe == 1'b1) ? !i : (oe == 1'b0) ? 1'bz : 1'bx;
endmodule
`timescale 1 ps / 1 ps
module alt_bidir_diff (oe, bidirin, io, iobar);
input oe;
inout bidirin;
inout io;
inout iobar;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter input_termination = "NONE";
parameter output_termination = "NONE";
parameter lpm_type = "alt_bidir_diff";
reg out_tmp;
always @(io or iobar)
begin
casex({io,iobar})
2'b00: out_tmp = 1'bx;
2'b01: out_tmp = 1'b0;
2'b10: out_tmp = 1'b1;
2'b11: out_tmp = 1'bx;
default: out_tmp = 1'bx;
endcase
end
assign bidirin = (oe === 1'b0) ? out_tmp : (oe === 1'b1) ? 1'bz : 1'bx;
assign io = (oe === 1'b1) ? bidirin : (oe === 1'b0) ? 1'bz : 1'bx;
assign iobar = (oe == 1'b1) ? !bidirin : (oe == 1'b0) ? 1'bz : 1'bx;
endmodule
`timescale 1 ps / 1 ps
module alt_bidir_buf (oe, bidirin, io);
input oe;
inout bidirin;
inout io;
parameter io_standard = "NONE";
parameter current_strength = "NONE";
parameter current_strength_new = "NONE";
parameter slew_rate = -1;
parameter location = "NONE";
parameter enable_bus_hold = "NONE";
parameter weak_pull_up_resistor = "NONE";
parameter termination = "NONE";
parameter input_termination = "NONE";
parameter output_termination = "NONE";
parameter lpm_type = "alt_bidir_diff";
reg out_tmp;
always @(io)
begin
casex(io)
1'b0: out_tmp = 1'b0;
1'b1: out_tmp = 1'b1;
default: out_tmp = 1'bx;
endcase
end
assign bidirin = (oe === 1'b0) ? out_tmp : (oe === 1'b1) ? 1'bz : 1'bx;
assign io = (oe === 1'b1) ? bidirin : (oe === 1'b0) ? 1'bz : 1'bx;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -