精华内容
下载资源
问答
  • 当我配置数据位配置为8位,同时配置停止位为1.5位时,编译器提示参数出错。 原因:1、Windows不支持该配置。MSDN中明确规定,数据位只能为5至8位。 2、当数据位为6、7、8位时,停止位只能配置成1或2位;同样当...

    当我配置数据位配置为8位,同时配置停止位为1.5位时,编译器提示参数出错。

    原因:1、Windows不支持该配置。MSDN中明确规定,数据位只能为5至8位。

              2、当数据位为6、7、8位时,停止位只能配置成1或2位;同样当数据位为5位时,停止位只能为1或1.5位

    展开全文
  • 串行接口(UART)------verilog实现串口发送模块

    万次阅读 多人点赞 2018-11-19 12:08:06
    前面一篇博客实现已经分析并实现串行接口的接收模块。其中,串口的波特率对串口来说是一个比较重要的概念,因为其决定了接收或者发送一位数据所用的时间。由于FPGA所用的时钟通常远比串口的波特率快,所以在使用FPGA...

    前面一篇博客实现已经分析并实现串行接口的接收模块。其中,串口的波特率对串口来说是一个比较重要的概念,因为其决定了接收或者发送一位数据所用的时间。由于FPGA所用的时钟通常远比串口的波特率快,所以在使用FPGA的时钟发送或者接收数据时,都需要一个串口波特率定时模块来产生定时脉冲,以此确保每位数据只被接收或者发送一次。

    串口发送过程如图1所示,由图可知,其基本原理跟串口的接收时序一致,唯一区别就是串口发送模块不需要开始标志(串口接收数据时需要开始标志,其起始位必须为0);每次发送数据也是11位,包含1位起始位、8位数据位、1位校验位、1位停止位。

     图1中,sampling_signal是由波特率定时模块产生的,对应TX_Pin_Out的每一位数据,都有一个sampling_signal,表明每个数据在这个波特率的时间内只被发送一次。

    图1 串口发送过程

    一、串口发送数据流程

    图2 串口发送过程

    串口发送数据流程如图2所示, 在s0状态,计数器电路加载0,如果cnt_en串口发送数据信号使能,进入s1状态。在s1状态,加载待发送的数据,如果采样信号有效,则计数器使能,计数器开始计数;若计数器计数到count=1,进入s2状态,在s2状态,主要通过一位寄存器将并行数据转为串行发送,若采样信号有效,则计数器、移位寄存器信号使能,此时移位寄存器开始一位一位的发送出去,同时计数器计数发送数据的个数;若计数到count=11,进入到s3数据发送完成状态,在s3状态,如果采样信号有效,发送完成标志位拉高,计数器和移位寄存器信号使能,此时串口发送数据完毕。若计数器count=0,则进入到s0状态,等待下一次数据的发送。

    二、数据路径

    由图2可知,串口发送模块需要的电路的基本模块包括计数器、并行转串行移位寄存器,波特率定时(计数器)。数据路径如图3所示:

    图3 数据路径

    三、控制信号

     由数据路径可知,右移寄存器的控制信号包括使能信号en_a和数据加载信号load_a,计数器的控制信号包括计数器使能信号en_b和计数器加载信号(加载0)load_b,波特率定时计数器包含波特率定时计数器使能信号。可以在图2中的各个状态中得出这些信号何时有效。

    图4 控制信号

     由图4可知,在s0状态,计数器加载信号load_b有效,此时计数器加载0;在s1状态右移寄存器记载信号load_a使能,此时移位寄存器加载要发送的数据,在该状态,如果波特率定时采样信号simpling_signal有效,计数器使能信号en_b有效,计数发已经送数据的个数;在s2状态如果simpling_signal有效,移位寄存器使能信号en_a和计数器使能信号en_b有效;在s3状态,如果simpling_signal有效,en_a和n_b有效,发送最后一位数据,同时发送完成信号标志tx_done信号拉高。

     四、verilog描述

    用verilog代码来描述图3所示的数据路径,代码如下:

    1、代码顶层部分:

    module TRANSMIT_MODULE(input clk_in,
    							  input rst,
    							  input [10:0]tx_data,
    							  input cnt_en,发送数据使能信号
    							  output reg tx_done,
    							  output tx_pin_data,
    							  output clk_50m
        );
    // Instantiate the module
    clk_ip clk_ip (
        .CLKIN_IN(clk_in), 
        .CLKFX_OUT(clk_50m), 
        .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), 
        .CLK0_OUT(CLK0_OUT)
        );
    wire [3:0]count;
    wire simpling_signal;
    reg load_b;
    reg load_a;
    reg en_b;		
    reg en_a;
    parameter [3:0]s0 = 'b0001;
    parameter [3:0]s1 = 'b0010;
    parameter [3:0]s2 = 'b0100;
    parameter [3:0]s3 = 'b1000;
    reg [3:0]current_state = 'd0;
    reg [3:0]next_state = 'd0;
    //
    always @(posedge clk_50m)
    	if(!rst)
    		current_state <= s0;
    	else
    		current_state <= next_state;
    ///
    always @(*)
    	case(current_state)
    		s0:	begin
    			if(cnt_en)
    				next_state = s1;
    			else
    				next_state = s0;
    		end
    		s1:	begin
    			if(count == 'd1)
    				next_state = s2;
    			else
    				next_state = s1;
    		end
    		s2:	begin
    			if(count == 'd11)
    				next_state = s3;
    			else
    				next_state = s2;
    		end
    		s3:	begin
    			if(count == 'd0)
    				next_state = s0;
    			else
    				next_state = s3;
    		end
    	default:	next_state = s0;
    	endcase
    /
    always @(*)
    	case(current_state)
    		s0:	begin
    			load_b = 'd1;
    			load_a = 'd0;
    			en_b = 'd0;		
    			en_a = 'd0;
    			tx_done = 'd0;
    		end
    		s1:	begin
    			load_b = 'd0;	
    			tx_done = 'd0;		
    			en_a = 'd0;	
    			load_a = 'd1;			
    			if(simpling_signal)	begin
    //				load_a = 'd1;
    				en_b = 'd1;
    			end
    			else	begin
    //				load_a = 'd0;
    				en_b = 'd0;
    			end
    		end
    		s2:	begin
    			load_b = 'd0;
    			load_a = 'd0;
    			tx_done = 'd0;
    			if(simpling_signal)	begin
    				en_a = 'd1;
    				en_b = 'd1;
    			end
    			else	begin
    				en_a = 'd0;
    				en_b = 'd0;				
    			end	
    		end
    		s3:	begin
    			load_b = 'd0;
    			load_a = 'd0;
    
    			if(simpling_signal)	begin
    				tx_done = 'd1;
    				en_b = 'd1;	
    				en_a = 'd1;				
    			end
    			else	begin
    				tx_done = 'd0;
    				en_b = 'd0;	
    				en_a = 'd0;				
    			end
    		end
    		default:	begin
    			load_b = 'd1;
    			load_a = 'd0;
    			en_b = 'd0;		
    			en_a = 'd0;
    			tx_done = 'd0;
    		end
    	endcase
    // Instantiate the module
    BPS_TIMER BPS_TIMER (
        .clk_50m(clk_50m), 
        .cnt_en(cnt_en), 
        .simpling_signal(simpling_signal)
        );
    // Instantiate the module
    COUNT_NUMBER COUNT_NUMBER (
        .clk_50m(clk_50m), 
        .load_b(load_b), 
        .en_b(en_b), 
        .count(count)
        );
    // Instantiate the module
    right_shifter right_shifter (
        .clk_50m(clk_50m), 
        .load_a(load_a), 
        .en_a(en_a), 
        .tx_data(tx_data), 
        .tx_pin_data(tx_pin_data)
        );
    endmodule
    

    2、波特率定时模块:

    由于使用的时钟是50mhz的,而串口的波特率是9600bps,即串口发送数据的时钟是9600hz,因此需要使用50mhz的时钟产生个计数器,
    ///使其每1/9600s产生一个允许采样脉冲。
    //计数器大小设置:500*10^3/96 = 5208,\,因此计数器需要计数5208个数,由于在数据中间在中间时刻更稳定,因此,在5208/2=2604时对数据进行采样更准确,
    //由于计数是从零开始,因此在2603时对数据进行采样,数据计数到5207清零。
    //
    module BPS_TIMER(input clk_50m,
    					  input cnt_en,
    					  output simpling_signal
        );
    reg [12:0] cnt = 'd0;
    always @(posedge clk_50m)
    	if(cnt_en)	begin
    		if(cnt == 'd5207)
    			cnt <= 'd0;
    		else
    			cnt <=  cnt + 'd1;
    	end
    	else
    		cnt <= 'd0;
    assign simpling_signal = (cnt == 'd2603)?'b1:'b0;
    endmodule
    

    3、计数器模块:

    module COUNT_NUMBER(input clk_50m,
    						  input load_b,
    						  input en_b,
    						  output reg[3:0] count
        );
    always @(posedge clk_50m)
    	if(load_b)
    		count <= 'd0;
    	else if(en_b)	begin
    		if(count == 'd11)
    			count <= 'd0;
    		else
    			count <= count + 'd1;
    	end
    	else
    		count <= count;
    
    endmodule

    4、移位寄存器模块:

    module right_shifter(input clk_50m,
    						  input load_a,
    						  input en_a,
    						  input [10:0]tx_data,
    						  output tx_pin_data
        );
    reg [10:0]data;
    always @(posedge clk_50m)
    	if(load_a)
    		data <= tx_data;
    	else if(en_a)
    		data <= {1'b0,data[10:1]};
    	else
    		data <= data;
    assign tx_pin_data = data[0];
    
    endmodule
    

    5、仿真激励文件:

    module test;
    
    	// Inputs
    	reg clk_in;
    	reg rst;
    	reg [10:0] tx_data;
    	reg cnt_en;
    
    	// Outputs
    	wire tx_done;
    	wire tx_pin_data;
    	wire clk_50m;
    
    	// Instantiate the Unit Under Test (UUT)
    	TRANSMIT_MODULE uut (
    		.clk_in(clk_in), 
    		.rst(rst), 
    		.tx_data(tx_data), 
    		.cnt_en(cnt_en), 
    		.tx_done(tx_done), 
    		.tx_pin_data(tx_pin_data), 
    		.clk_50m(clk_50m)
    	);
    
    	initial begin
    		// Initialize Inputs
    		clk_in = 0;
    		rst = 0;
    		tx_data = 0;
    		cnt_en = 0;
    
    		// Wait 100 ns for global reset to finish
    		#100;
            
    		// Add stimulus here
    
    	end
          always #5 clk_in = !clk_in;
    reg [2:0] cnt = 'd0;
    always @(posedge clk_50m)
    	if(cnt == 'd5)
    		cnt <= 'd5;
    	else
    		cnt <= cnt + 'd1;
    always @(posedge clk_50m)
    	if(cnt<=3)
    		rst <= 'd0;
    	else
    		rst <= 'd1;
    reg[20:0]count = 'd0;
    always @(posedge clk_50m)
    	if(count == 'd10000)	
    		count <= 'd0;
    	else
    		count <= count + 'd1;
    
    always @(posedge clk_50m)
    		if(tx_done)	begin
    			cnt_en <= 'd0;
    			tx_data <= 'd0;
    		end
    		else if(count == 'd10000)	begin
    			cnt_en <= 'd1;
    			tx_data <= 'b10101010101;
    		end
    		else	begin
    			cnt_en <= cnt_en;
    			tx_data <= tx_data;
    		end
    endmodule
    

    6、Isim仿真结果如下:发送的数据 tx_data <= 'b10101010101;

    图5 仿真结果

    由仿真结果可知,在一个发送数据周期,en_a有效11次。待所有数据发送完毕tx_done信号拉高。

     

    展开全文
  • 串行接口(UART)------verilog实现串口接收模块

    万次阅读 多人点赞 2018-11-15 15:08:35
    串行接口(Serial port),主要用于串行式逐位数据传输。常见的有一般计算机应用的RS-232(使用 25 针或 9 针连接器)和工业计算机应用的半双工RS-485与全双工RS-422。----------维基百科 按照电气标准划分,串口...

    一、串口基本概念

    串行接口(Serial port),主要用于串行式逐数据传输。常见的有一般计算机应用的RS-232(使用 25 针或 9 针连接器)和工业计算机应用的半双工RS-485全双工RS-422。----------维基百科

    按照电气标准划分,串口可以分为RS-232-C、RS-422、RS-485。

    RS-232-C:也称标准接口,是目前最常用的一种串行通讯接口。台式计算机一般有两个串行口:COM1和COM2,均为9针D形接口通常在计算机后面能看到,一般笔记本上有一个串口,超薄本除外。RS-232-C电气标准接口传输速率低,传输距离近。

    RS-422:为改进RS-232-C传输距离近,传输速率低的特点,RS-422定义了一种平衡通信接口,传输速率提高到10Mb/s,并允许在一条接收总线上挂多个接收器。

    RS-485:为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485 标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为 TIA/EIA-485-A标准。

     下图是串口公口实物图,在台式机和笔记本上一般都能找到。维基百科

    串口公口
    图1 串口公口

     2、串口传输时序-------参考【FPGA黑金开发板】Verilog HDL那些事儿--串口模块(十一)

    图2  串口时序

     图2是串口传输数据的时序图,串口总线默认是高电平,一帧数据开始必须先拉低电平,对应图中起始位。串口传输数据是以数据包为单位的,一个数据包有11位,其中先传输起始位,紧接着传输8个数据位,数据位是按照由低到高的顺序进行传输的,接着传输校验位,最后传输停止位。

    串口还有一个重要的参数就是波特率,一般用波特率来形容串口传输数据的速度。常用的波特率有9600bps和115200bps,本文主要介绍9600bps。bps:bit per second,就是每秒钟传输多少位;9600bps就是每秒钟传输9600位,对应的传输一位所用的时钟周期就是9600Hz。接下来本文参考《verilog那些事儿——建模篇》中串口模块的划分来实现串口的接收部分verilog代码。

    3、串口接收分析

    由于这里是串口接收模块的介绍,为简单考虑从串口外部输入的信号只考虑RX_data_in。由于串口接收数据有明显的先后顺序,因此可以使用状态机来描述串口接收数据过程。使用算法状态机描述串口接收过程如下图所示:

     

    图3 算法状态机

    图3中s0状态实现数据的初始化,start信号对应串口发送的起始位数据,使用沿检测电路实现;s2状态是接收8位有效数据状态,由于串口是串行将数据接收进来,然后转成并行数据,因此s1部分的电路可以用右移的移位寄存器实现(串口先发送低位数据,所以选用右移移位寄存器);图中虽然画出了s3状态执行校验功能,但是本代码不考虑检验问题,因此s3状态相当于是空状态;s4状态是串口接收数据完毕发出的标志信号。根据算法状态机可以看出,实现串口的接收所需要的基本电路有移位寄存器电路、计数器电路和触发器电路。

    4、数据路径

    图4 数据路径

     数据路径如图4所示,波特率定时信号的作用分析如下:

    图5 FPGA接收数据过程

     由于FPGA的工作时钟较快,串口发送数据较慢。如图5所示,串口发送一位数据可能占用多个FPGA时钟周期,因此需要增加采样信号sampling_signal,采样信号有效时占一个时钟周期,在采样信号有效时,FPGA才接收数据,保证每位数据只接收一次。波特率定时计数器就是用来产生采样信号的,在波特率定时计数器计数到一定数据后,采样信号有效,否则,采样信号无效,这样就可以产生如图5所示的采样信号。

    5、控制信号

    图6  控制信号

    图6给出了控制信号在哪个状态有效。在s0状态,移位寄存器和计数器加载0,D触发器使能信号en_b有效,检测串口发送的数据rx_pin_in的起始信号,待检测到起始信号后,start信号有效,进入s1状态,在s1状态使能波特率采样计时信号cnt_en,判断串口采样信号sinpling_signal是否有效,若有效,设置计数器使能信号有效,反之,设置计数器使能信号无效;在计数器cnt=1时,进入s2状态,此状态开始接收串口发送的8位数据位,首先使能波特率采样计时信号cnt_en,判断sinpling_signal是否有效,若有效,计数器使能信号和移位寄存器使能信号均设置为有效,反之,设置为无效;待8位数据位接收完毕后,进入s3状态,此时仍然使能波特率采样计时信号cnt_en,判断采样信号sinpling_signal是否有效,若有效,设置计数器使能信号有效,反之,设置无效。待计数器记到10时,进入s3状态,串口发送的11位信号接收完毕标志信号done拉高,此时仍然使能波特率采样计时信号cnt_en,判断sinpling_signal是否有效,若有效设置计数器使能信号有效,反之,设置无效。然后进入s0空闲状态,等待下一次数据接收。

    6、verilog描述

    接下来就可以使用verilog语言描述上述电路:

    module RECEIVE_MODULE(input clk_in,
    							 input rst,
    							 input rx_pin_in,
    							 output [7:0] rx_data,
    							 output reg done,
    							 output clk_50m
        );
    //wire clk_50m;	 
    clk_1 clk_1 (
        .CLKIN_IN(clk_in), 
        .CLKFX_OUT(clk_50m), 
        .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), 
        .CLK0_OUT(CLK0_OUT)
        );
    
    parameter s0 = 'b00001;
    parameter s1 = 'b00010;
    parameter s2 = 'b00100;
    parameter s3 = 'b01000;
    parameter s4 = 'b10000;
    reg[4:0]current_state = 'd0;
    reg[4:0]next_state = 'd0;
    //
    wire start;
    reg en_b;
    reg cnt_en;
    wire simpling_signal;
    reg load_c;
    reg en_c;
    reg en_a;
    reg load_a;
    wire [3:0]count;
    /
    always @(posedge clk_50m or negedge rst)
    	if(!rst)
    		current_state <= s0;
    	else
    		current_state <= next_state;
    /
    always @(*)
    	case(current_state)
    		s0:	begin
    			if(start)
    				next_state = s1;
    			else
    				next_state = s0;
    		end
    		s1:	begin///起始位
    			if(count == 'd1)
    				next_state = s2;
    			else
    				next_state = s1;
    		end
    		s2:	begin///数据位
    			if(count == 'd9)
    				next_state = s3;
    			else
    				next_state = s2;
    		end
    		s3:	begin
    			if(count == 'd10)
    				next_state = s4;
    			else
    				next_state = s3;
    		end
    		s4:	begin
    			if(count == 'd0)
    				next_state = s0;
    			else
    				next_state = s4;
    		end
    		default:next_state = s0;			
    	endcase
    /
    always @(*)
    	case(current_state)
    		s0:	begin
    			en_b = 'd1;
    			load_a = 'd1;
    			load_c = 'd1;
    			cnt_en = 'd0;
    			en_a = 'd0;
    			en_c = 'd0;
    			done = 'd0;
    		end
    		s1:	begin
    			en_b = 'd1;
    			load_a = 'd0;
    			load_c = 'd1;
    			cnt_en = 'd1;
    			en_c = 'd0;
    			done = 'd0;
    			if(simpling_signal)	begin
    				en_a = 'd1;
    			end
    			else	begin
    				en_a = 'd0;
    			end
    		end
    		s2:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd1;
    			done = 'd0;
    			if(simpling_signal)	begin
    				en_c = 'd1;
    				en_a = 'd1;
    			end
    			else	begin
    				en_c = 'd0;
    				en_a = 'd0;
    			end
    		end
    		s3:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd1;	
    			en_c = 'd0;
    			done = 'd0;
    			if(simpling_signal)
    				en_a = 'd1;
    			else
    				en_a = 'd0;
    		end
    		s4:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd1;	
    			en_c = 'd0;
    			done = 'd1;
    			if(simpling_signal)
    				en_a = 'd1;
    			else
    				en_a = 'd0;			
    		end
    		default:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd0;
    			en_a = 'd0;
    			en_c = 'd0;
    			done = 'd0;
    		end
    	endcase
    // Instantiate the module
    edge_detection edge_detection (
        .clk_50m(clk_50m), 
        .en_b(en_b), 
        .rx_pin_in(rx_pin_in), 
        .start(start)
        );
    // Instantiate the module
    BPS_TIMER BPS_TIMER (
        .clk_50m(clk_50m), 
        .cnt_en(cnt_en), 
        .simpling_signal(simpling_signal)
        );
    // Instantiate the module
    right_shifter right_shifter (
        .clk_50m(clk_50m), 
        .load_c(load_c), 
        .en_c(en_c), 
        .rx_pin_in(rx_pin_in), 
        .rx_data(rx_data)
        );
    // Instantiate the module
    COUNT_NUM COUNT_NUM (
        .clk_50m(clk_50m), 
        .load_a(load_a), 
        .en_a(en_a), 
        .count(count)
        );
    endmodule
    

     边沿检测模块代码:

    module edge_detection(input clk_50m,
    							 input en_b,
    							 input rx_pin_in,
    							 output start
        );
    reg rx_pin_in_1 = 'd0;
    always @(posedge clk_50m)
    	if(en_b)
    		rx_pin_in_1 <= rx_pin_in;
    	else
    		rx_pin_in_1 <= rx_pin_in_1;
    		
    assign start = (!rx_pin_in) & rx_pin_in_1;
    
    endmodule
    

     波特率定时模块代码:

    由于使用的时钟是50mhz的,而串口的波特率是9600bps,即串口发送数据的时钟是9600hz,因此需要使用50mhz的时钟产生个计数器,
    ///使其每1/9600s产生一个允许采样脉冲。
    //计数器大小设置:500*10^3/96 = 5208,\,因此计数器需要计数5208个数,由于在数据中间在中间时刻更稳定,因此,在5208/2=2604时对数据进行采样更准确,
    //由于计数是从零开始,因此在2603时对数据进行采样,数据计数到5207清零。
    //
    module BPS_TIMER(input clk_50m,
    					  input cnt_en,
    					  output simpling_signal
        );
    reg [12:0] cnt = 'd0;
    always @(posedge clk_50m)
    	if(cnt_en)	begin
    		if(cnt == 'd5207)
    			cnt <= 'd0;
    		else
    			cnt <=  cnt + 'd1;
    	end
    	else
    		cnt <= 'd0;
    assign simpling_signal = (cnt == 'd2603)?'b1:'b0;
    endmodule
    

     右移寄存器模块代码:

    //此模块用于将串行发送的数据转成并行接收
    //
    module right_shifter(input clk_50m,
    							input load_c,
    							input en_c,
    							input rx_pin_in,
    							output reg[7:0]rx_data
        );
    always @(posedge clk_50m)
    	if(load_c)
    		rx_data <= 'd0;
    	else if(en_c)
    		rx_data <= {rx_pin_in,rx_data[7:1]};
    	else
    		rx_data <= rx_data;
    endmodule

     计数器模块代码:

    module COUNT_NUM(input clk_50m,
    					  input load_a,
    					  input en_a,
    					  output reg [3:0]count
        );
    always @(posedge clk_50m)
    	if(load_a)
    		count <= 'd0;
    	else if(en_a)	begin
    		if(count == 'd10)
    			count <= 'd0;
    		else
    			count <= count + 'd1;
    	end
    	else
    		count <= count;
    		
    endmodule
    

     仿真激励文件代码:

    module test;
    
    	// Inputs
    	reg clk_in;
    	reg rst;
    	reg rx_pin_in = 'd1;
    
    	// Outputs
    	wire [7:0] rx_data;
    	wire done;
    	wire clk_50m;
    
    	// Instantiate the Unit Under Test (UUT)
    	RECEIVE_MODULE uut (
    		.clk_in(clk_in), 
    		.rst(rst), 
    		.rx_pin_in(rx_pin_in), 
    		.rx_data(rx_data), 
    		.done(done),
    		.clk_50m(clk_50m)
    	);
    
    	initial begin
    		// Initialize Inputs
    		clk_in = 0;
    		rst = 0;
    		rx_pin_in = 1;
    
    		// Wait 100 ns for global reset to finish
    		#100;
    		// Add stimulus here
    
    	end
    	reg clk1= 'd1;
          always #5 clk_in = ~clk_in;
    		
    	reg [15:0]cnt = 'd0;
    	always @(posedge clk_50m)
    		if(cnt>0)
    			rst <= 'd1;
    		else
    			rst <= rst;
    			
    		always @(posedge clk_50m)
    			if(cnt == 'd60000)/'d57287
    				cnt <= 'd0;
    			else
    				cnt <= cnt + 'd1;
    		always @(posedge clk_50m)
    			if(cnt>'d10&&cnt<='d5208)
    				rx_pin_in <= 'd0;//1
    			else if(cnt>='d5208&&cnt<='d10415)
    				rx_pin_in <= 'd1;//2
    			else if(cnt>='d10416&&cnt<='d15623)
    				rx_pin_in <= 'd0;3
    			else if(cnt>='d15624&&cnt<='d20831)
    				rx_pin_in <= 'd1;///4
    			else if(cnt>='d20832&&cnt<='d26039)
    				rx_pin_in <= 'd0;5
    			else if(cnt>='d26040&&cnt<='d31247)
    				rx_pin_in <= 'd1;///6
    			else if(cnt>='d31248&&cnt<='d36455)
    				rx_pin_in <= 'd0;///7
    			else if(cnt>='d36456&&cnt<='d41663)
    				rx_pin_in <= 'd1;///8
    			else if(cnt>='d41664&&cnt<='d46871)
    				rx_pin_in <= 'd1;///9
    			else if(cnt>='d46872&&cnt<='d52079)
    				rx_pin_in <= 'd1;///10
    			else if(cnt>='d52080&&cnt<='d57287)
    				rx_pin_in <= 'd1;///11
    endmodule
    
    

    Isim行为仿真结果:

    图7 仿真结果

    从仿真波形中可以看出,当串行发送信号 01010101111时,在done信号拉高时接收数据完毕,显示接收的数据是11010101。因此,从仿真上看串口的接收可以正常工作。

     

    展开全文
  • 在调试STM32程序,突然发现只要我在串口助手上打开串口,程序就停止运行了,本来在闪的灯也不闪了。 刚开始根本想不通串口打开跟板子的程序运行会有什么影响。。。 3.3V的电源灯一直是亮着的,手上也没有USB转串口...

    记录一个蠢蠢的问题。

    在调试STM32程序,突然发现只要我在串口助手上打开串口,程序就停止运行了,本来在闪的灯也不闪了。

    刚开始根本想不通串口打开跟板子的程序运行会有什么影响。。。

    3.3V的电源灯一直是亮着的,手上也没有USB转串口,网上查了一会,只看到说TX和RX短路了就会这样,开始怀疑是板子上的串口芯片坏了,检查之后发现没问题啊。

    有点懵逼,无从下手了。

     

    先看看开发板原理图吧

    连到STM32芯片上的除了RX/TX,就是BOOT0和RESET了。

    好吧,恍然大悟。。。

    看了一眼串口助手上的两个流控制RST和DTR,果然:

    RST不知道啥时候给勾上了,导致一按打开串口,CH340的RST就让单片机保持复位了,程序就停止运行了,灯当然就不闪了。

     

    一脸黑线。。。

    展开全文
  • 异步串行接口

    千次阅读 2016-11-30 23:35:41
    第10章 异步串行接口  1、 串行通信与并行通信的概念、特点。 数据通信的基本方式可分为并行通信与串行通信两种。 并行通信:是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度快,适用于短...
  • 串口串行接口(serialport)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serialcommunicaTIon)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来...
  • 串口串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来...
  • 串口串行接口(serialport)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serialcommunicaTIon)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来...
  • 单片机(AT89C51)的串行接口及串行通信是非常重要的一项技术,我们需要有深度的解刨才可以理解透彻,既然进来了我肯定不会让你失望,点个小赞再走吧。 正式进入串口通信前我们需要了解什么是通信? 计算机与...
  • 1:“串行接口”简称为串口。 2:作用:进行有线通信 3:特点:数据一位一位地顺序传送; 通信线路简单,只要一对传输线就可以实现双向通信; 串口通信原理: 数据一位一位地顺序传送 串口通信协议: 1.数据...
  • 串行接口简称串口,主要的作用就是通信,只需要一对传输线上就可以实现双向通信。 在通信领域内,有两种数据通信方式:并行通信和串行通信 串行通信方式支持单工、半双工、全双工通信 单工 仅能进行一个方向的数据...
  • C51单片机————串行接口

    千次阅读 多人点赞 2018-07-15 14:37:55
    C51单片机————串行接口 定时(定时控制、测量、延时。。。)和计数(对外部事件统计数目)。 Created with Raphaël 2.1.2张三张三李四李四嘿,四哥, 定时器和计数器有哪几种实现哦?想了想主要有三种方法那...
  • 串口编程 - 串口简介

    2021-01-25 23:32:50
    串行接口(Serial port),也称串行接口或串行端口,串行通信接口,COM接口,简称串口。主要用于串行式逐位数据传输。 串口通信(Serial Communication),是一种非常常见的设备间的通信方式。串口通信协议是指双方约定...
  • 51单片机的串行接口介绍

    千次阅读 2020-06-21 18:13:21
    51单片机的串行接口介绍串行口结构设置工作方式(串行口控制寄存器SCON)设置波特率 51单片机内部集成1~2个可编程通用异步串行通信接口(即UART),采用全双工制式。该通信接口有四种工作方式,并且 能设置各种...
  • FPGA实现串行接口 RS232

    千次阅读 2010-12-31 18:44:00
    串行接口(RS-232)串行接口是连接FPGA和PC机的一种简单方式。这个项目向大家展示了如果使用FPGA来创建RS-232收发器。整个项目包括5个部分 RS232是怎样工作的 如何产生需要的波特率 发送模块 接收模块 应用实例RS...
  • 调试一个简单的串口协议,当单片机收到串口发送的数据,解析数据无误后向串口回发一字节数据0x01,且只是发送一次,但串口助手不停得接收到0x0![图片说明]...
  • 串口解析 串口配置 1.波特率 2.停止位 3.数据位 4.奇偶校验位 比特率:通讯的频率 停止位:可以选择1/1.5/2三个选择 数据位:可以选择5/6/7/8四个选择 奇偶校验位:可以选择奇校验/偶校验/无奇偶校验位 假设我们...
  • FPGA:实现串行接口 RS232

    千次阅读 2014-06-28 15:17:48
    串行接口(RS-232) 串行接口是连接FPGA和PC机的一种简单方式。这个项目向大家展示了如果使用FPGA来创建RS-232收发器。 整个项目包括5个部分 1. RS232是怎样工作的 2. 如何产生需要的波特率 3. 发送模块 ...
  • 利用串行接口传输各种数值数据

    千次阅读 2015-03-05 12:48:14
    利用串行接口传输各种数值数据 天津滨海职业学院机电系 刘景文 胥宝萍 300451 摘 要:介绍了一种无应答数值发送、接收的协议,如何利用MCS-51单片机进行各种数值发送、在VC下借助 MSComm通信控件进行数值接收 ,...
  • 串口通信的停止

    千次阅读 2013-07-01 18:04:00
    串口通信 的波特率有关,通信所用波特率的倒数值即为1位,它在实际中表示为一个时间段。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此 ...
  • 串行接口的基本特点

    千次阅读 2015-01-27 16:26:23
    MCS-51单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同场合的需要。其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;工作方式1多用于双机之间或与外设电路的...
  • 串口一、串口串行接口)二、异步串口(以下统称串口)三、重要参数1、波特率2、报文格式四、波形1、具体连接2、波形分析2.1 发送12.2 发送65 本文使用 STM32F406ZGT6单片机基于标准库进行测试 一、串口串行接口...
  • 串口

    2018-08-23 16:32:29
    串口,即串行接口,与之相对应的另一种接口叫并口,并行接口。两者的区别是,传输一个字节(8个位)的数据时,串口是将8个位排好队,逐个地在1条连接线上传输,而并口则将8个位一字排开,分别在8条连接线上同时传输...
  • 串口串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比...
  • 当单片机从停止模式被唤醒后,LED指示灯闪烁变慢,同时串口通信出现乱码。 程序如下: //将串口接收口做为中断唤醒 void EXIT_UART_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef ...
  • 基于FPGA的RS232串行接口的实现

    千次阅读 2015-02-03 14:07:56
    串行接口(RS-232) 串行接口是连接FPGA和PC机的一种简单方式。本文主要使用FPGA来创建RS-232的收发器。   1、整个项目包括5个部分 RS232是怎样工作的如何产生需要的波特率发送模块接收模块应用实例 2、特性...
  • stm32串口中断通信,实现上位机控制开始发送和停止发送一、准备工作二、程序编写三、效果展示 一、准备工作 本文所使用的硬件设备为野火的指南者开发板,利用商家提供的例程完成串口的中断通信。 所要实现的功能为...
  • 串口通信

    2018-12-31 09:26:09
    串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。 串口通信(Serial...
  • 串口是一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus(USB)混淆)。大多数计算机包含两个基于RS232的串口串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。...
  • 串口串行接口(serial port)的简称,也称为串行通信接口或COM接口。 串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。 串口按电气标准及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,131
精华内容 27,252
关键字:

串口怎么停止