rs232_rec_fun.v

来自「这是一个verilog HDL 语言的例子」· Verilog 代码 · 共 105 行

V
105
字号
`timescale 1ns/1ps

 module rs232_rec_fun
	(
		Clk,Rst,
		band_start,band_CheckFlag,
		rs232_rx_in, RecByte_out,
		Received_Byte_Flag
	);
	
	input Clk;
	input Rst;
	input band_CheckFlag;
	input rs232_rx_in; 
	output Received_Byte_Flag;
	
	output band_start;	
	output wire[7:0]  RecByte_out;
	// Module contents
	
	reg neg_chk0,neg_chk1,neg_chk2,neg_chk3;
	wire neg_chked;
	reg Received_Byte_Flag_r;
	
	always @ ( posedge Clk or negedge Rst ) begin
		if( !Rst) begin
			neg_chk0<=1'b0;
			neg_chk1<=1'b0;
			neg_chk2<=1'b0;
			neg_chk3<=1'b0;
		end
		else begin			
			neg_chk0<=rs232_rx_in;
			neg_chk1<=neg_chk0;
			neg_chk2<=neg_chk1;
			neg_chk3<=neg_chk2;
		end
	end
	
	assign neg_chked = neg_chk3 & neg_chk2 & ~neg_chk1 & ~neg_chk0 ; //  下降沿  1100 //高低电平分别判断两个 
			
	reg band_start_r;
	reg[3:0] num; 
	
	always @ ( posedge Clk or negedge Rst ) begin
		if( !Rst ) begin
			band_start_r <= 1'b0;// 1'bz;//1'b0;
			//num <= 4'd0;  // 在程序中对同一个输出,不能同时在多处赋值 
			Received_Byte_Flag_r <= 'b0;
		end
		else if( neg_chked ) begin
			band_start_r <= 1'b1;
			//num <= 4'd0; 
			Received_Byte_Flag_r <= 'b1;
		end	
		else if ( num == 4'd10) begin
			band_start_r <= 1'b0;// 1'bz;//1'b0;
			//num <= 4'd0; 
			Received_Byte_Flag_r <= 'b0;  // 发送端检测下降沿 10 
		end
	end
	
	assign band_start = band_start_r;
	
	reg [7:0] rec_lastdata_r;
	reg [7:0] rec_tempdata_r;
		
	always @ ( posedge Clk or negedge Rst ) begin
		if( !Rst ) begin
			rec_lastdata_r <=8'h0;
			rec_tempdata_r <=8'h0;
			num <= 4'd0;
			//Received_Byte_Flag_r<='b0;
		end
		else if( Received_Byte_Flag_r ) begin
			if( band_CheckFlag ) begin
				num <= num +1'h1;
				case (num)
					4'd1: rec_tempdata_r[0] <= rs232_rx_in ;
					4'd2: rec_tempdata_r[1] <= rs232_rx_in ;
					4'd3: rec_tempdata_r[2] <= rs232_rx_in ;
					4'd4: rec_tempdata_r[3] <= rs232_rx_in ;
					4'd5: rec_tempdata_r[4] <= rs232_rx_in ;
					4'd6: rec_tempdata_r[5] <= rs232_rx_in ;
					4'd7: rec_tempdata_r[6] <= rs232_rx_in ;
					4'd8: rec_tempdata_r[7] <= rs232_rx_in ; 
					default :;
				endcase
			end
			//rec_lastdata_r <= 8'h21;
		end
		else if (num == 4'd10 ) begin //我们的标准接收模式下只有1+8+1(2)=11bit的有效数据
			num <= 4'd0;
			rec_lastdata_r <= rec_tempdata_r ;
			//Received_Byte_Flag_r <= 'b1;
		end

		//rec_lastdata_r <= 8'h34;
	end
	
	assign RecByte_out = rec_lastdata_r;
	assign Received_Byte_Flag = Received_Byte_Flag_r;

endmodule

⌨️ 快捷键说明

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