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

📄 uart_rxd.v

📁 基于verilog hdl的UART串口接收子程序。
💻 V
字号:
// Copyright (C) 1991-2009 Altera Corporation
// 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 from 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, Altera MegaCore Function License 
// 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.

// *****************************************************************************
// This file contains a Verilog test bench with test vectors .The test vectors  
// are exported from a vector file in the Quartus Waveform Editor and apply to  
// the top level entity of the current Quartus project .The user can use this   
// testbench to simulate his design using a third-party simulation tool .       
// *****************************************************************************
// Generated on "05/11/2009 19:47:12"
                                                                        
// Verilog Self-Checking Test Bench (with test vectors) for design :    uart_rxd
// 
// Simulation tool : 3rd Party
// 

`timescale 1 ns/ 1 ps
module uart_rxd_vlg_sample_tst(
	RXD,
	clk_in,
	sampler_tx
);
input  RXD;
input  clk_in;
output sampler_tx;

reg sample;
time current_time;
always @(RXD or clk_in)
                                                                                
begin                                         
 if ($time > 0)                               
 begin                                        
	if ($time == 0 || $time != current_time)  
	begin									  
		if (sample === 1'bx)                  
			sample = 0;                       
		else                                  
			sample = ~sample;                 
	end										  
	current_time = $time;					  
 end                                          
end                                           

assign sampler_tx = sample;
endmodule

module uart_rxd_vlg_check_tst (
	RI,clk_out,data_out,sampler_rx
);
input  RI;
input  clk_out;
input [7:0] data_out;
input sampler_rx;

reg  RI_expected;
reg  clk_out_expected;
reg [7:0] data_out_expected;

reg  RI_prev;
reg  clk_out_prev;
reg [7:0] data_out_prev;

reg  RI_expected_prev;
reg  clk_out_expected_prev;
reg [7:0] data_out_expected_prev;

reg  last_RI_exp;
reg  last_clk_out_exp;
reg [7:0] last_data_out_exp;

reg trigger;

integer i;
integer nummismatches;

reg [1:3] on_first_change ;


initial
begin
trigger = 0;
i = 0;
nummismatches = 0;
on_first_change = 3'b1;
end

// update real /o prevs

always @(trigger)
begin
	RI_prev = RI;
	clk_out_prev = clk_out;
	data_out_prev = data_out;
end

// update expected /o prevs

always @(trigger)
begin
	RI_expected_prev = RI_expected;
	clk_out_expected_prev = clk_out_expected;
	data_out_expected_prev = data_out_expected;
end



// expected RI
initial
begin
	RI_expected = 1'bX;
end 

// expected clk_out
initial
begin
	clk_out_expected = 1'bX;
end 
// expected data_out[ 7 ]
initial
begin
	data_out_expected[7] = 1'bX;
end 
// expected data_out[ 6 ]
initial
begin
	data_out_expected[6] = 1'bX;
end 
// expected data_out[ 5 ]
initial
begin
	data_out_expected[5] = 1'bX;
end 
// expected data_out[ 4 ]
initial
begin
	data_out_expected[4] = 1'bX;
end 
// expected data_out[ 3 ]
initial
begin
	data_out_expected[3] = 1'bX;
end 
// expected data_out[ 2 ]
initial
begin
	data_out_expected[2] = 1'bX;
end 
// expected data_out[ 1 ]
initial
begin
	data_out_expected[1] = 1'bX;
end 
// expected data_out[ 0 ]
initial
begin
	data_out_expected[0] = 1'bX;
end 
// generate trigger
always @(RI_expected or RI or clk_out_expected or clk_out or data_out_expected or data_out)
begin
	trigger <= ~trigger;
end

always @(posedge sampler_rx or negedge sampler_rx)
begin
`ifdef debug_tbench
	$display("Scanning pattern %d @time = %t",i,$realtime );
	i = i + 1;
	$display("| expected RI = %b | expected clk_out = %b | expected data_out = %b | ",RI_expected_prev,clk_out_expected_prev,data_out_expected_prev);
	$display("| real RI = %b | real clk_out = %b | real data_out = %b | ",RI_prev,clk_out_prev,data_out_prev);
`endif
	if (
		( RI_expected_prev !== 1'bx ) && ( RI_prev !== RI_expected_prev )
		&& ((RI_expected_prev !== last_RI_exp) ||
			on_first_change[1])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port RI :: @time = %t",  $realtime);
		$display ("     Expected value = %b", RI_expected_prev);
		$display ("     Real value = %b", RI_prev);
		nummismatches = nummismatches + 1;
		on_first_change[1] = 1'b0;
		last_RI_exp = RI_expected_prev;
	end
	if (
		( clk_out_expected_prev !== 1'bx ) && ( clk_out_prev !== clk_out_expected_prev )
		&& ((clk_out_expected_prev !== last_clk_out_exp) ||
			on_first_change[2])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port clk_out :: @time = %t",  $realtime);
		$display ("     Expected value = %b", clk_out_expected_prev);
		$display ("     Real value = %b", clk_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[2] = 1'b0;
		last_clk_out_exp = clk_out_expected_prev;
	end
	if (
		( data_out_expected_prev[0] !== 1'bx ) && ( data_out_prev[0] !== data_out_expected_prev[0] )
		&& ((data_out_expected_prev[0] !== last_data_out_exp[0]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[0] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[0] = data_out_expected_prev[0];
	end
	if (
		( data_out_expected_prev[1] !== 1'bx ) && ( data_out_prev[1] !== data_out_expected_prev[1] )
		&& ((data_out_expected_prev[1] !== last_data_out_exp[1]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[1] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[1] = data_out_expected_prev[1];
	end
	if (
		( data_out_expected_prev[2] !== 1'bx ) && ( data_out_prev[2] !== data_out_expected_prev[2] )
		&& ((data_out_expected_prev[2] !== last_data_out_exp[2]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[2] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[2] = data_out_expected_prev[2];
	end
	if (
		( data_out_expected_prev[3] !== 1'bx ) && ( data_out_prev[3] !== data_out_expected_prev[3] )
		&& ((data_out_expected_prev[3] !== last_data_out_exp[3]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[3] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[3] = data_out_expected_prev[3];
	end
	if (
		( data_out_expected_prev[4] !== 1'bx ) && ( data_out_prev[4] !== data_out_expected_prev[4] )
		&& ((data_out_expected_prev[4] !== last_data_out_exp[4]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[4] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[4] = data_out_expected_prev[4];
	end
	if (
		( data_out_expected_prev[5] !== 1'bx ) && ( data_out_prev[5] !== data_out_expected_prev[5] )
		&& ((data_out_expected_prev[5] !== last_data_out_exp[5]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[5] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[5] = data_out_expected_prev[5];
	end
	if (
		( data_out_expected_prev[6] !== 1'bx ) && ( data_out_prev[6] !== data_out_expected_prev[6] )
		&& ((data_out_expected_prev[6] !== last_data_out_exp[6]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[6] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[6] = data_out_expected_prev[6];
	end
	if (
		( data_out_expected_prev[7] !== 1'bx ) && ( data_out_prev[7] !== data_out_expected_prev[7] )
		&& ((data_out_expected_prev[7] !== last_data_out_exp[7]) ||
			on_first_change[3])
	)
	begin
		$display ("ERROR! Vector Mismatch for output port data_out[7] :: @time = %t",  $realtime);
		$display ("     Expected value = %b", data_out_expected_prev);
		$display ("     Real value = %b", data_out_prev);
		nummismatches = nummismatches + 1;
		on_first_change[3] = 1'b0;
		last_data_out_exp[7] = data_out_expected_prev[7];
	end

	trigger <= ~trigger;
end
initial 

begin 
$timeformat(-12,3," ps",6);
#1000.0;
if (nummismatches > 0)
	$display ("%d mismatched vectors : Simulation failed !",nummismatches);
else
	$display ("Simulation passed !");
$stop;
end 
endmodule

module uart_rxd_vlg_vec_tst();
// constants                                           
// general purpose registers
reg RXD;
reg clk_in;
// wires                                               
wire RI;
wire clk_out;
wire [7:0] data_out;

wire sampler;                             

// assign statements (if any)                          
uart_rxd i1 (
// port map - connection between master ports and signals/registers   
	.RI(RI),
	.RXD(RXD),
	.clk_in(clk_in),
	.clk_out(clk_out),
	.data_out(data_out)
);

// RXD
initial
begin
	RXD = 1'b0;
end 

// clk_in
initial
begin
	clk_in = 1'b0;
end 

uart_rxd_vlg_sample_tst tb_sample (
	.RXD(RXD),
	.clk_in(clk_in),
	.sampler_tx(sampler)
);

uart_rxd_vlg_check_tst tb_out(
	.RI(RI),
	.clk_out(clk_out),
	.data_out(data_out),
	.sampler_rx(sampler)
);
endmodule

⌨️ 快捷键说明

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