📄 stratixiii_atoms.v
字号:
else if ((clk_in == 1) & (ena_in == 1'b1))
q_tmp <= d_in;
end
assign q_wire = q_tmp;
and (q, q_wire, 1'b1);
endmodule // stratixiii_lvds_tx_reg
///////////////////////////////////////////////////////////////////////////////
//
// Module Name : stratixiii_lvds_tx_parallel_register
//
// Description : Register for the 10 data input channels of the Stratix III
// LVDS Tx
//
///////////////////////////////////////////////////////////////////////////////
`timescale 1 ps/1 ps
module stratixiii_lvds_tx_parallel_register (clk,
enable,
datain,
dataout,
devclrn,
devpor
);
parameter channel_width = 4;
// INPUT PORTS
input [channel_width - 1:0] datain;
input clk;
input enable;
input devclrn;
input devpor;
// OUTPUT PORTS
output [channel_width - 1:0] dataout;
// INTERNAL VARIABLES AND NETS
reg clk_last_value;
reg [channel_width - 1:0] dataout_tmp;
wire clk_ipd;
wire enable_ipd;
wire [channel_width - 1:0] datain_ipd;
buf buf_clk (clk_ipd,clk);
buf buf_enable (enable_ipd,enable);
buf buf_datain [channel_width - 1:0] (datain_ipd,datain);
wire [channel_width - 1:0] dataout_opd;
buf buf_dataout [channel_width - 1:0] (dataout,dataout_opd);
// TIMING PATHS
specify
(posedge clk => (dataout +: dataout_tmp)) = (0, 0);
$setuphold(posedge clk, datain, 0, 0);
endspecify
initial
begin
clk_last_value = 0;
dataout_tmp = 'b0;
end
always @(clk_ipd or enable_ipd or devpor or devclrn)
begin
if ((devpor === 1'b0) || (devclrn === 1'b0))
begin
dataout_tmp <= 'b0;
end
else begin
if ((clk_ipd === 1'b1) && (clk_last_value !== clk_ipd))
begin
if (enable_ipd === 1'b1)
begin
dataout_tmp <= datain_ipd;
end
end
end
clk_last_value <= clk_ipd;
end // always
assign dataout_opd = dataout_tmp;
endmodule //stratixiii_lvds_tx_parallel_register
///////////////////////////////////////////////////////////////////////////////
//
// Module Name : stratixiii_lvds_tx_out_block
//
// Description : Negative edge triggered register on the Tx output.
// Also, optionally generates an identical/inverted output clock
//
///////////////////////////////////////////////////////////////////////////////
`timescale 1 ps/1 ps
module stratixiii_lvds_tx_out_block (clk,
datain,
dataout,
devclrn,
devpor
);
parameter bypass_serializer = "false";
parameter invert_clock = "false";
parameter use_falling_clock_edge = "false";
// INPUT PORTS
input datain;
input clk;
input devclrn;
input devpor;
// OUTPUT PORTS
output dataout;
// INTERNAL VARIABLES AND NETS
reg dataout_tmp;
reg clk_last_value;
wire bypass_mode;
wire invert_mode;
wire falling_clk_out;
// BUFFER INPUTS
wire clk_in;
wire datain_in;
buf (clk_in, clk);
buf (datain_in, datain);
// TEST PARAMETER VALUES
assign falling_clk_out = (use_falling_clock_edge == "true")?1'b1:1'b0;
assign bypass_mode = (bypass_serializer == "true")?1'b1:1'b0;
assign invert_mode = (invert_clock == "true")?1'b1:1'b0;
// TIMING PATHS
specify
if (bypass_mode == 1'b1)
(clk => dataout) = (0, 0);
if (bypass_mode == 1'b0 && falling_clk_out == 1'b1)
(negedge clk => (dataout +: dataout_tmp)) = (0, 0);
if (bypass_mode == 1'b0 && falling_clk_out == 1'b0)
(datain => (dataout +: dataout_tmp)) = (0, 0);
endspecify
initial
begin
clk_last_value = 0;
dataout_tmp = 0;
end
always @(clk_in or datain_in or devclrn or devpor)
begin
if ((devpor === 1'b0) || (devclrn === 1'b0))
begin
dataout_tmp <= 0;
end
else begin
if (bypass_serializer == "false")
begin
if (use_falling_clock_edge == "false")
dataout_tmp <= datain_in;
if ((clk_in === 1'b0) && (clk_last_value !== clk_in))
begin
if (use_falling_clock_edge == "true")
dataout_tmp <= datain_in;
end
end // bypass is off
else begin
// generate clk_out
if (invert_clock == "false")
dataout_tmp <= clk_in;
else
dataout_tmp <= !clk_in;
end // clk output
end
clk_last_value <= clk_in;
end // always
and (dataout, dataout_tmp, 1'b1);
endmodule //stratixiii_lvds_tx_out_block
///////////////////////////////////////////////////////////////////////////////
//
// Module Name : stratixiii_lvds_transmitter
//
// Description : Timing simulation model for the Stratix III LVDS Tx WYSIWYG.
// It instantiates the following sub-modules :
// 1) primitive DFFE
// 2) Stratix III_lvds_tx_parallel_register and
// 3) Stratix III_lvds_tx_out_block
//
///////////////////////////////////////////////////////////////////////////////
`timescale 1 ps/1 ps
module stratixiii_lvds_transmitter (clk0,
enable0,
datain,
serialdatain,
postdpaserialdatain,
dataout,
serialfdbkout,
dpaclkin,
devclrn,
devpor
);
parameter channel_width = 10;
parameter bypass_serializer = "false";
parameter invert_clock = "false";
parameter use_falling_clock_edge = "false";
parameter use_serial_data_input = "false";
parameter use_post_dpa_serial_data_input = "false";
parameter is_used_as_outclk = "false";
parameter tx_output_path_delay_engineering_bits = -1;
parameter enable_dpaclk_to_lvdsout = "off";
parameter preemphasis_setting = 0;
parameter vod_setting = 0;
parameter differential_drive = 0;
parameter lpm_type = "stratixiii_lvds_transmitter";
// INPUT PORTS
input [channel_width - 1:0] datain;
input clk0;
input enable0;
input serialdatain;
input postdpaserialdatain;
input devclrn;
input devpor;
input dpaclkin;
// OUTPUT PORTS
output dataout;
output serialfdbkout;
tri1 devclrn;
tri1 devpor;
// INTERNAL VARIABLES AND NETS
integer i;
wire dataout_tmp;
wire dataout_wire;
wire shift_out;
reg clk0_last_value;
wire [channel_width - 1:0] input_data;
reg [channel_width - 1:0] shift_data;
wire txload0;
reg [channel_width - 1:0] datain_dly;
wire bypass_mode;
wire [channel_width - 1:0] datain_in;
wire serial_din_mode;
wire postdpa_serial_din_mode;
wire clk0_in;
wire serialdatain_in;
wire postdpaserialdatain_in;
buf (clk0_in, clk0);
buf datain_buf [channel_width - 1:0] (datain_in, datain);
buf (serialdatain_in, serialdatain);
buf (postdpaserialdatain_in, postdpaserialdatain);
// TEST PARAMETER VALUES
assign serial_din_mode = (use_serial_data_input == "true") ? 1'b1 : 1'b0;
assign postdpa_serial_din_mode = (use_post_dpa_serial_data_input == "true") ? 1'b1 : 1'b0;
// TIMING PATHS
specify
if (serial_din_mode == 1'b1)
(serialdatain => dataout) = (0, 0);
if (postdpa_serial_din_mode == 1'b1)
(postdpaserialdatain => dataout) = (0, 0);
if (enable_dpaclk_to_lvdsout == "on")
(dpaclkin => dataout) = (0, 0);
endspecify
initial
begin
i = 0;
clk0_last_value = 0;
shift_data = 'b0;
end
stratixiii_lvds_tx_reg txload0_reg (.d(enable0),
.clrn(1'b1),
.prn(1'b1),
.ena(1'b1),
.clk(clk0_in),
.q(txload0)
);
stratixiii_lvds_tx_out_block output_module (.clk(clk0_in),
.datain(shift_out),
.dataout(dataout_tmp),
.devclrn(devclrn),
.devpor(devpor)
);
defparam output_module.bypass_serializer = bypass_serializer;
defparam output_module.invert_clock = invert_clock;
defparam output_module.use_falling_clock_edge = use_falling_clock_edge;
stratixiii_lvds_tx_parallel_register input_reg (.clk(txload0),
.enable(1'b1),
.datain(datain_dly),
.dataout(input_data),
.devclrn(devclrn),
.devpor(devpor)
);
defparam input_reg.channel_width = channel_width;
always @(datain_in)
begin
datain_dly <= #1 datain_in;
end
assign shift_out = shift_data[channel_width - 1];
always @(clk0_in or devclrn or devpor)
begin
if ((devpor === 1'b0) || (devclrn === 1'b0))
begin
shift_data <= 'b0;
end
else begin
if (bypass_serializer == "false")
begin
if ((clk0_in === 1'b1) && (clk0_last_value !== clk0_in))
begin
if (txload0 === 1'b1)
begin
for (i = 0; i < channel_width; i = i + 1)
shift_data[i] <= input_data[i];
end
else begin
for (i = (channel_width - 1); i > 0; i = i - 1 )
shift_data[i] <= shift_data[i-1];
end
end
end // bypass is off
end // devpor
clk0_last_value <= clk0_in;
end // always
assign dataout_wire = (use_serial_data_input == "true") ? serialdatain_in :
(use_post_dpa_serial_data_input == "true") ? postdpaserialdatain_in :
(enable_dpaclk_to_lvdsout == "on") ? dpaclkin:
dataout_tmp;
and (dataout, dataout_wire, 1'b1);
and (serialfdbkout, dataout_wire, 1'b1);
endmodule // stratixiii_lvds_transmitter
///////////////////////////////////////////////////////////////////////
//
// STRATIXIII RUBLOCK ATOM
//
///////////////////////////////////////////////////////////////////////
`timescale 1 ps/1 ps
module stratixiii_rublock
(
clk,
shiftnld,
captnupdt,
regin,
rsttimer,
rconfig,
regout
);
parameter sim_init_config = "factory";
parameter sim_init_watchdog_value = 0;
parameter sim_init_status = 0;
parameter lpm_type = "stratixiii_rublock";
input clk;
input shiftnld;
input captnupdt;
input regin;
input rsttimer;
input rconfig;
output regout;
endmodule
//--------------------------------------------------------------------------
// Module Name : stratixiii_ram_pulse_generator
// Description : Generate pulse to initiate memory read/write operations
//--------------------------------------------------------------------------
`timescale 1 ps/1 ps
module stratixiii_ram_pulse_generator (
clk,
ena,
pulse,
cycle
);
input clk; // clock
input ena; // pulse enable
output pulse; // pulse
output cycle; // delayed clock
parameter delay_pulse = 1'b0;
parameter start_delay = (delay_pulse == 1'b0) ? 1 : 2; // delay write
reg state;
reg clk_prev;
wire clk_ipd;
specify
specparam t_decode = 0,t_access = 0;
(posedge clk => (pulse +: state)) = (t_decode,t_access);
endspecify
buf #(start_delay) (clk_ipd,clk);
wire pulse_opd;
buf buf_pulse (pulse,pulse_opd);
initial clk_prev = 1'bx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -