verilog入门 之串口接收器

串口数据原理图:
在这里插入图片描述

`timescale 1ns/10ps

module uart_rxer(
	clk,
	res,
	RX,//用于读取数据
	data_out,//输出data,将读取到的数据返回
	en_data_out//使能
);


	input clk,res,RX;
	output[7:0] data_out;
	output en_data_out;
	
	reg[7:0] data_out;
	reg en_data_out;

	reg[7:0] state;//存储状态
	reg[12:0] con;//时间计数
	reg[3:0] con_bits;//空闲计数

	reg RX_delay;//RX延时

	always@(posedge clk or negedge res) begin

		if(~res) begin//复位
			state<=0;
			con<=0;
			con_bits<=0;
			en_data_out<=0;
			data_out<=0;
			RX_delay<=0;
		end

		else begin
		
		RX_delay<=RX;
		case(state) 
			0:begin//状态0,等待,4999个con为一个数据间隔
				if(con==4999) begin
					con<=0;
				end
				else begin
					con<=con+1;
				end

				if(con==0) begin
					if(RX) begin
						con_bits<=con_bits+1;
					end
					else begin
						con_bits<=0;
					end

				end

				if(con_bits==12) begin//十二个数据间隔后进入状态1
					state<=1;
				end


			end

			1:begin//????
				en_data_out<=0;
				if(~(RX&RX_delay)) begin
					state<=2;
				end
			end

			2:begin//等待1.5个数据间隔后接受b0
				if(con==7500-1) begin
					con<=0;
					data_out[0]<=RX;
					state<=3;
				end
				else begin
					con<=con+1;
				end
			end

			3:begin//一个数据间隔后接收b1
				if(con==5000-1) begin
					con<=0;
					data_out[1]<=RX;
					state<=4;
				end
				else begin
					con<=con+1;
				end
			end
			4:begin//接收b2
				if(con==5000-1) begin
					con<=0;
					data_out[2]<=RX;
					state<=5;
				end
				else begin
					con<=con+1;
				end
			end
			5:begin//接收b3
				if(con==5000-1) begin
					con<=0;
					data_out[3]<=RX;
					state<=6; 
				end
				else begin
					con<=con+1;
				end
			end
			6:begin//接收b4
				if(con==5000-1) begin
					con<=0;
					data_out[4]<=RX;
					state<=7;
				end
				else begin
					con<=con+1;
				end
			end
			7:begin//接收b5
				if(con==5000-1) begin
					con<=0;
					data_out[5]<=RX;
					state<=8;
				end
				else begin
					con<=con+1;
				end
			end
			8:begin//接收b6
				if(con==5000-1) begin
					con<=0;
					data_out[6]<=RX;
					state<=9;
				end
				else begin
					con<=con+1;
				end
			end
			9:begin//接收b7
				if(con==5000-1) begin
					con<=0;
					data_out[7]<=RX;
					state<=10;
				end
				else begin
					con<=con+1;
				end
			end
			10:begin
				en_data_out<=1;//data_out使能
				state<=1;//返回状态1,
			end
			default:begin//规定状态之外的状态
				state<=0;
				con<=0;
				con_bits<=0;
				en_data_out<=0;
			end
		endcase
		end

	end

endmodule
module uart_rxer_tb;

	reg clk,res;
	wire RX;
	wire[7:0] data_out;
	wire en_data_out;

	reg[25:0] RX_send;//发送的数据
	reg[12:0] con;//????bit??

	assign RX=RX_send[0];

	uart_rxer uart_rxer(//实例化一个接收模块
		.clk(clk),
		.res(res),
		.RX(RX),
		.data_out(data_out),
		.en_data_out(en_data_out)
	);

	initial begin
		clk<=0;res<=0;RX_send<={1'b1,8'haa,1'b0,16'hffff};con<=0;//为数据赋值
		#17 res<=1;
		#4000000 $stop;
	end

	always #5 clk<=~clk;

	always@(posedge clk) begin
		if(con==5000-1) begin//4999为一个数据间隔
			con<=0;
		end
		else begin
			con<=con+1;
		end

		if(con==0) begin//每一个数据间隔
			RX_send[24:0]<=RX_send[25:1];//RX_send按位循环
			RX_send[25]<=RX_send[0];
		end
	end
	
endmodule

仿真结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog中,串口接收数据通常是通过串口接收(UART Receiver)模块来实现的。根据引用,串口发送端口空闲时为高,发送端口拉低表示数据传送即将开始,字节数据低位先发,字节发送后拉高表示字节传送结束。常用的波特率有4800、9600、115200等。 根据引用中的测试代码,UART_RXer_tb模块通过将串口接收数据RX连接到RX_send来模拟串口接收数据。在该测试代码中,RX_send表示接收到的串口数据的最低位。通过将RX_send[24:0]右移一位并将RX_send[25]设置为RX_send的值来模拟接收到连续的串口数据。 根据引用的说明,这个Verilog程序完成的是接收来自上位机发送的多字节串口数据,并将不同的字节分配给不同的寄存,以完成相应的控制工作。 因此,Verilog中的串口接收数据是通过串口接收模块来实现的,该模块根据发送端口的状态来接收串口数据,并将接收到的数据存储在相应的寄存中进行后续处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Verilog——串口数据接收(状态机)](https://blog.csdn.net/weixin_41788560/article/details/118444413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [串口接收多字节 Verilog程序](https://download.csdn.net/download/zq18362902766/10361036)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值