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

📄 uart_rx.v

📁 RS232的UART编程
💻 V
字号:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    10:57:36 04/02/2009 
// Design Name: 
// Module Name:    uart_rx 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module uart_rx(bclk,reset,rxd,rx_ready,rx_dout);
input  bclk;
input  reset;
input  rxd;
output rx_ready;
output [7:0] rx_dout;

parameter [3:0]  Lframe=8;
parameter [2:0]  s_idle=3'b000;
parameter [2:0]  s_sample=3'b010;

parameter [2:0] s_stop=3'b100;

reg  rx_ready;
reg [2:0] state=s_idle;
reg [3:0] cnt=0;
reg [3:0] num=0;
reg [3:0] dcnt=0;
reg [7:0] rx_doutmp=0;

assign rx_dout=rx_doutmp;

always@(posedge bclk or posedge reset )  begin
       if(reset==1'b1)  begin
		     state<= s_idle;
			  cnt<=0;
			  dcnt<=0;
			  num<=0;
			  rx_doutmp<=0;
			  rx_ready<=0;
			  end
		else begin 
		case(state)
		 s_idle:begin
			 rx_doutmp<=0;
			 dcnt<=0;
			 rx_ready<=1;
			 if(cnt==4'b1111)  begin
			   cnt<=0;
				if(num>7) begin
				state <=s_sample;
				num<=0;
				end
				else  begin
				  state<=s_idle;
				  num<=0;
				  end
				end
			else  begin
			  cnt<=cnt+1;
			  if(rxd==1'b0)  begin
			    num<=num+1;
				end
				else  begin
				num<=num;
				end
		end
end
    s_sample:begin 
	       rx_ready<=1'b0;
			 if(dcnt==Lframe)  begin
			  state<=s_stop;
			  end
			   else begin
				  state<=s_sample;
				  if(cnt==4'b1111)  begin
				  dcnt<=dcnt+1;
				  cnt<=0;
				  if(num>7)  begin 
				    num<=0;
					 rx_doutmp[dcnt]<=1;
					 end
					 else begin
					 rx_doutmp[dcnt]<=0;
					 num<=0;
					 end
				end
				else begin 
				cnt<=cnt+1;
				if(rxd==1'b1)  begin
				   num<=num+1;
					end
					else  begin
					     num<=num;
						  end
						end
				end
		end
		s_stop:begin
		rx_ready<=1'b1;
		if(cnt==4'b1111)  begin
		   cnt<=0;
			state<=s_idle;
			end
			else  begin
			  cnt<=cnt+1;
			  end
			end
		endcase
		end
		end
endmodule
				
				
				
				
				

⌨️ 快捷键说明

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