⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stratix_atoms.v

📁 一个非常好的dc使用书籍 一个非常好的dc使用书籍
💻 V
📖 第 1 页 / 共 5 页
字号:
   parameter power_up       = "low";
   parameter cin_used       = "false";
   parameter cin0_used      = "false";
   parameter cin1_used      = "false";
   parameter output_mode    = "comb_only";
   parameter lpm_type       = "stratix_lcell";
   parameter x_on_violation = "on";
   
   input     dataa, datab, datac, datad;
   input     clk, aclr, aload, sclr, sload, ena; 
   input     cin, cin0, cin1,  inverta, regcascin;
   input     devclrn, devpor ;
   output    cout, cout0, cout1, regout, combout;
   wire      dffin, qfbkin;
   
   stratix_asynch_lcell lecomb (.dataa(dataa), .datab(datab), 
				.datac(datac), .datad(datad),
				.cin(cin), .cin0(cin0), .cin1(cin1), 
				.inverta(inverta), .qfbkin(qfbkin),
				.regin(dffin), .combout(combout),
				.cout(cout), .cout0(cout0), .cout1(cout1));
   defparam  lecomb.operation_mode = operation_mode;
   defparam  lecomb.sum_lutc_input = sum_lutc_input;
   defparam  lecomb.cin_used = cin_used;
   defparam  lecomb.cin0_used = cin0_used;
   defparam  lecomb.cin1_used = cin1_used;
   defparam  lecomb.lut_mask = lut_mask;
   
   stratix_lcell_register lereg (.clk(clk), .aclr(aclr), .aload(aload),
				 .sclr(sclr), .sload(sload), .ena(ena), 
				 .datain(dffin), 
				 .datac(datac), .regcascin(regcascin),
				 .devclrn(devclrn), .devpor(devpor), 
				 .regout(regout), .qfbkout(qfbkin));
   defparam  lereg.synch_mode = synch_mode;
   defparam  lereg.register_cascade_mode = register_cascade_mode;
   defparam  lereg.power_up = power_up;
   defparam  lereg.x_on_violation = x_on_violation;
   
endmodule


///////////////////////////////////////////////////////////////////////////////
//
//                              STRATIX_ASYNCH_IO
//
///////////////////////////////////////////////////////////////////////////////
`timescale 1 ps/1 ps

module stratix_asynch_io (datain, oe, regin, ddioregin, padio, delayctrlin, combout, 
			  regout, ddioregout);
   
   input datain, oe;
   input regin, ddioregin;
   input delayctrlin;
   output combout;
   output regout, ddioregout;
   inout  padio;
   
   parameter operation_mode = "input";
   parameter bus_hold = "false";
   parameter open_drain_output = "false";
   parameter phase_shift_delay = 0;
   
   reg 	     prev_value;
   
   reg 	     tmp_padio, tmp_combout;
   reg 	     buf_control;
   reg combout_tmp;

   integer dqs_delay;
   
   buf(datain_in, datain);
   buf(oe_in, oe);
   buf (delayctrlin_ipd, delayctrlin);
   
   tri 	     padio_tmp;
   
   specify
      (padio => combout) = (0,0);
      (datain => padio) = (0, 0);
      (posedge oe => (padio +: padio_tmp)) = (0, 0);
      (negedge oe => (padio +: 1'bz)) = (0, 0);
      (ddioregin => ddioregout) = (0, 0);
      (regin => regout) = (0, 0);
   endspecify
   
   initial
      begin
	 prev_value = 'b0;
	 tmp_padio = 'bz;
         dqs_delay = phase_shift_delay;
      end
  
        always @(delayctrlin_ipd)
        begin
            if (delayctrlin_ipd == 1'b1)
                dqs_delay = phase_shift_delay;
            else if (delayctrlin_ipd == 1'b0)
                dqs_delay = 0;
            else begin
                $display($time, " Warning: Illegal value detected on 'delayctrlin' input.");
                dqs_delay = 0;
            end
        end
 
	always @(datain_in or oe_in or padio)
	begin
		if (bus_hold == "true" )
		begin
			buf_control = 'b1;
			if ( operation_mode == "output" || operation_mode == "bidir")
			begin
				if ( oe_in == 1)
				begin
					if ( open_drain_output == "true" )
					begin
						if (datain_in == 0)
						begin
							tmp_padio =  1'b0;
							prev_value = 1'b0;
						end
						else if (datain_in == 1'bx)
						begin
							tmp_padio = 1'bx;
							prev_value = 1'bx;
						end
						else   // output of tri is 'Z'
						begin
							if ( operation_mode == "bidir")
								prev_value = padio;
							
							tmp_padio = 1'bz;
						end
					end  
					else  // open drain_output = false;
					begin
						tmp_padio = datain_in;
						prev_value = datain_in;
					end
				end   
				else if ( oe_in == 0 )
				begin
					if (operation_mode == "bidir")
						prev_value = padio;

					tmp_padio = 1'bz;
				end
				else   // oe == 'X' 
				begin
					tmp_padio = 1'bx;
					prev_value = 1'bx;
				end
			end
			
			if ( operation_mode == "output")
				tmp_combout = 1'bz;
			else
				tmp_combout = padio;
		end
		else    // bus hold is false
		begin
			buf_control = 'b0;
			if ( operation_mode == "input")
			begin
				tmp_combout = padio;
			end
			else if (operation_mode == "output" || operation_mode == "bidir")
			begin
				if ( operation_mode  == "bidir")
					tmp_combout = padio;
				
				if ( oe_in == 1 )
				begin
					if ( open_drain_output == "true" )
					begin
						if (datain_in == 0)
							tmp_padio = 1'b0;
						else if ( datain_in == 1'bx)
							tmp_padio = 1'bx;
						else
							tmp_padio = 1'bz;
					end
					else
						tmp_padio = datain_in;
				end
				else if ( oe_in == 0 )
					tmp_padio = 1'bz;
				else
					tmp_padio = 1'bx;
			end
			else
				$display ("Error: Invalid operation_mode specified in stratix io atom!\n");
		end
        combout_tmp <= #(dqs_delay) tmp_combout;
	end
   
   bufif1 (weak1, weak0) b(padio_tmp, prev_value, buf_control);  //weak value
   pmos (padio_tmp, tmp_padio, 'b0);
//   pmos (combout, tmp_combout, 'b0);
   pmos (combout, combout_tmp, 'b0);
   pmos (padio, padio_tmp, 'b0);
   and (regout, regin, 1'b1);
   and (ddioregout, ddioregin, 1'b1);

endmodule

///////////////////////////////////////////////////////////////////////////////
//
//                             STRATIX_IO_REGISTER
//
///////////////////////////////////////////////////////////////////////////////

module  stratix_io_register (clk, datain, ena, 
			     sreset, areset, 
			     devclrn, devpor, regout);
   parameter	async_reset = "none";
   parameter 	sync_reset = "none";
   parameter 	power_up = "low";
   
   input 	clk, ena, datain;
   input 	areset, sreset;
   input 	devclrn, devpor ;
   output 	regout;
   
   reg 		iregout;
   wire 	clk_in;
   wire 	reset, is_areset_clear, is_areset_preset;
   
   reg 		datain_viol;
   reg 		sreset_viol;
   reg 		ena_viol;
   reg 		violation;
   
   reg 		clk_last_value;
   
   buf (clk_in, clk);
   buf (idatain, datain);
   buf (iareset, areset);
   buf (isreset, sreset);
   buf (iena, ena);
   
   assign reset = devpor && devclrn && !(iareset && async_reset != "none") && (iena);
   
   assign is_areset_clear = (async_reset == "clear")?1'b1:1'b0;
   assign is_areset_preset = (async_reset == "preset")?1'b1:1'b0;

   specify
      
      $setuphold (posedge clk &&& reset, datain, 0, 0, datain_viol) ;
      $setuphold (posedge clk &&& reset, sreset, 0, 0, sreset_viol) ;
      $setuphold (posedge clk &&& reset, ena, 0, 0, ena_viol) ;
      
      (posedge clk => (regout +: iregout)) = 0 ;
      
      if (is_areset_clear == 1'b1)
	 (posedge areset => (regout +: 1'b0)) = (0,0);
      if ( is_areset_preset == 1'b1)
	 (posedge areset => (regout +: 1'b1)) = (0,0);
      
   endspecify
   
   initial
      begin
//	 clk_last_value = 0;
	 violation = 0;
	 if (power_up == "low")
	    iregout = 'b0;
	 else if (power_up == "high")
	    iregout = 'b1;
      end
   
   always @ (datain_viol or sreset_viol or ena_viol)
      begin
	 violation = 1;
      end
   
   always @ (clk_in or posedge iareset or negedge devclrn or negedge devpor or posedge violation)
      begin
	 if (violation == 1'b1)
        begin
	   violation = 0;
	   iregout = 'bx;
	end
	else if (devpor == 'b0)
	begin
	    if (power_up == "low")
	        iregout = 'b0;
	    else if (power_up == "high")
		iregout = 'b1;
	end
	else if (devclrn == 'b0)
		iregout = 'b0;
	else if (async_reset == "clear" && iareset == 'b1) 
	      iregout = 'b0 ;
	else if (async_reset == "preset" && iareset == 'b1 )
			   iregout = 'b1;
	else if (iena == 'b1 && clk_in == 'b1 && clk_last_value == 'b0)
	begin
		   if (sync_reset == "clear" && isreset == 'b1)
		      iregout = 'b0 ;
	else if (sync_reset == "preset" && isreset == 'b1)
	      iregout = 'b1;
	else
	   iregout = idatain ;
				end
	 clk_last_value = clk_in;
      end
   and (regout, iregout, 'b1) ;
endmodule

///////////////////////////////////////////////////////////////////////////////
//
//                                STRATIX_IO
//
///////////////////////////////////////////////////////////////////////////////

module stratix_io (datain, ddiodatain, oe, outclk, outclkena,
		   inclk, inclkena, areset, sreset, delayctrlin, devclrn, devpor, devoe,
		   padio, combout, regout, ddioregout);
   
   parameter operation_mode = "input";
   parameter ddio_mode = "none";
   parameter open_drain_output = "false";
   parameter bus_hold = "false";
   
   parameter output_register_mode = "none";
   parameter output_async_reset = "none";
   parameter output_sync_reset = "none";
   parameter output_power_up = "low";
   parameter tie_off_output_clock_enable = "false";
   
   parameter oe_register_mode = "none";
   parameter oe_async_reset = "none";
   parameter oe_sync_reset = "none";
   parameter oe_power_up = "low";
   parameter tie_off_oe_clock_enable = "false";
   
   parameter input_register_mode = "none";
   parameter input_async_reset = "none";
   parameter input_sync_reset = "none";
   parameter input_power_up = "low";
   
   parameter extend_oe_disable = "false";
 
   parameter sim_dll_phase_shift = 0;
   parameter sim_dqs_input_frequency = 10000;
 
   // LOCAL PARAMETERS

   parameter phase_shift_delay = (sim_dll_phase_shift * sim_dqs_input_frequency)/360;

   inout     padio;
   input     datain, ddiodatain;
   input     oe, outclk, outclkena, inclk, inclkena;
   input     areset, sreset, delayctrlin;
   input     devclrn, devpor, devoe;
   output    combout, regout, ddioregout;
   
   wire      oe_reg_out, oe_pulse_reg_out;
   wire      in_reg_out, in_ddio0_reg_out, in_ddio1_reg_out;
   wire      out_reg_out, out_ddio_reg_out;
   
   wire      out_clk_ena, oe_clk_ena;
   
   wire      tmp_datain;
   wire      ddio_data;
   wire      oe_out;
   wire      outclk_delayed;
  

   assign out_clk_ena = (tie_off_output_clock_enable == "false") ? outclkena : 1'b1;
   assign oe_clk_ena = (tie_off_oe_clock_enable == "false") ? outclkena : 1'b1;
   
   //input register
   stratix_io_register in_reg  (.regout(in_reg_out), .clk(inclk), 
				.ena(inclkena), .datain(padio), 
				.areset(areset), .sreset(sreset), 
				.devpor(devpor), .devclrn(devclrn));
   defparam  in_reg.async_reset = input_async_reset;
   defparam  in_reg.sync_reset = input_sync_reset;
   defparam  in_reg.power_up = input_power_up;
   
   // in_ddio0_reg
   stratix_io_register in_ddio0_reg (.regout(in_ddio0_reg_out), .clk(!inclk), 
				     .ena (inclkena), .datain(padio), 
				     .areset(areset), .sreset(sreset),
				     .devpor(devpor), .devclrn(devclrn));
   defparam  in_ddio0_reg.async_reset = input_async_reset;
   defparam  in_ddio0_reg.sync_reset = input_sync_reset;
   defparam  in_ddio0_reg.power_up = input_power_up;
   
   // in_ddio1_reg
   stratix_io_register in_ddio1_reg (.regout(in_ddio1_reg_out), .clk(inclk), 
				     .ena(inclkena), .datain(in_ddio0_reg_out),
				     .areset(areset), .sreset(1'b0),
				     .devpor(devpor), .devclrn(devclrn));
   defparam  in_ddio1_reg.async_reset = input_async_reset;
   defparam  in_ddio1_reg.sync_reset = "none"; // this register has no sync_reset
   defparam  in_ddio1_reg.power_up = input_power_up;
   
   // out_reg
   stratix_io_register out_reg (.regout(out_reg_out), .clk(outclk), 
				.ena(out_clk_ena), .datain(datain), 
				.areset(areset), .sreset(sreset),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -