精华内容
下载资源
问答
  • 2013-08-05 18:30:56
    所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞(None Blocking)。

    网上有很多网友用很通俗的比喻 把同步和异步讲解的很透彻 转过来

    举个例子:普通B/S模式(同步)AJAX技术(异步)
    同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
    异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

    同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
    异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
    所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。


    以通讯为例
    同步:发送一个请求,等待返回,然后再发送下一个请求
    异步:发送一个请求,不等待返回,随时可以再发送下一个请求
    并发:同时发送多个请求



    下面再转一段关于java异步应用的文章

    用异步输入输出流编写Socket进程通信程序
    在Merlin中加入了用于实现异步输入输出机制的应用程序接口包:java.nio(新的输入输出包,定义了很多基本类型缓冲(Buffer)),java.nio.channels(通道及选择器等,用于异步输入输出),java.nio.charset(字符的编码解码)。通道(Channel)首先在选择器(Selector)中注册自己感兴趣的事件,当相应的事件发生时,选择器便通过选择键(SelectionKey)通知已注册的通道。然后通道将需要处理的信息,通过缓冲(Buffer)打包,编码/解码,完成输入输出控制。
    通道介绍:
    这里主要介绍ServerSocketChannel和SocketChannel.它们都是可选择的(selectable)通道,分别可以工作在同步和异步两种方式下(注意,这里的可选择不是指可以选择两种工作方式,而是指可以有选择的注册自己感兴趣的事件)。可以用channel.configureBlocking(Boolean )来设置其工作方式。与以前版本的API相比较,ServerSocketChannel就相当于ServerSocket (ServerSocketChannel封装了ServerSocket),而SocketChannel就相当于Socket(SocketChannel封装了Socket)。当通道工作在同步方式时,编程方法与以前的基本相似,这里主要介绍异步工作方式。
    所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞(None Blocking)。在服务器端,ServerSocketChannel通过静态函数open()返回一个实例serverChl。然后该通道调用serverChl.socket().bind()绑定到服务器某端口,并调用register(Selector sel, SelectionKey.OP_ACCEPT)注册OP_ACCEPT事件到一个选择器中(ServerSocketChannel只可以注册OP_ACCEPT事件)。当有客户请求连接时,选择器就会通知该通道有客户连接请求,就可以进行相应的输入输出控制了;在客户端,clientChl实例注册自己感兴趣的事件后(可以是OP_CONNECT,OP_READ,OP_WRITE的组合),调用clientChl.connect (InetSocketAddress )连接服务器然后进行相应处理。注意,这里的连接是异步的,即会立即返回而继续执行后面的代码。
    选择器和选择键介绍:
    选择器(Selector)的作用是:将通道感兴趣的事件放入队列中,而不是马上提交给应用程序,等已注册的通道自己来请求处理这些事件。换句话说,就是选择器将会随时报告已经准备好了的通道,而且是按照先进先出的顺序。那么,选择器是通过什么来报告的呢?选择键(SelectionKey)。选择键的作用就是表明哪个通道已经做好了准备,准备干什么。你也许马上会想到,那一定是已注册的通道感兴趣的事件。不错,例如对于服务器端serverChl来说,可以调用key.isAcceptable()来通知serverChl有客户端连接请求。相应的函数还有:SelectionKey.isReadable(),SelectionKey.isWritable()。一般的,在一个循环中轮询感兴趣的事件(具体可参照下面的代码)。如果选择器中尚无通道已注册事件发生,调用Selector.select()将阻塞,直到有事件发生为止。另外,可以调用selectNow()或者select(long timeout)。前者立即返回,没有事件时返回0值;后者等待timeout时间后返回。一个选择器最多可以同时被63个通道一起注册使用。

    应用实例:
    下面是用异步输入输出机制实现的客户/服务器实例程序�D�D程序清单1(限于篇幅,只给出了服务器端实现,读者可以参照着实现客户端代码):
    public class NBlockingServer {
    int port = 8000;
    int BUFFERSIZE = 1024;
    Selector selector = null;
    ServerSocketChannel serverChannel = null;
    HashMap clientChannelMap = null;//用来存放每一个客户连接对应的套接字和通道
    public NBlockingServer( int port ) {
    this.clientChannelMap = new HashMap();
    this.port = port;
    }
    public void initialize() throws IOException {
    //初始化,分别实例化一个选择器,一个服务器端可选择通道
    this.selector = Selector.open();
    this.serverChannel = ServerSocketChannel.open();
    this.serverChannel.configureBlocking(false);
    InetAddress localhost = InetAddress.getLocalHost();
    InetSocketAddress isa = new InetSocketAddress(localhost, this.port );
    this.serverChannel.socket().bind(isa);//将该套接字绑定到服务器某一可用端口
    }
    //结束时释放资源
    public void finalize() throws IOException {
    this.serverChannel.close();
    this.selector.close();
    }
    //将读入字节缓冲的信息解码
    public String decode( ByteBuffer byteBuffer ) throws
    CharacterCodingException {
    Charset charset = Charset.forName( "ISO-8859-1" );
    CharsetDecoder decoder = charset.newDecoder();
    CharBuffer charBuffer = decoder.decode( byteBuffer );
    String result = charBuffer.toString();
    return result;
    }
    //监听端口,当通道准备好时进行相应操作
    public void portListening() throws IOException, InterruptedException {
    //服务器端通道注册OP_ACCEPT事件
    SelectionKey acceptKey =this.serverChannel.register( this.selector,
    SelectionKey.OP_ACCEPT );
    //当有已注册的事件发生时,select()返回值将大于0
    while (acceptKey.selector().select() > 0 ) {
    System.out.println("event happened");
    //取得所有已经准备好的所有选择键
    Set readyKeys = this.selector.selectedKeys();
    //使用迭代器对选择键进行轮询
    Iterator i = readyKeys.iterator();
    while (i.hasNext()) {
    SelectionKey key = (SelectionKey)i.next();
    i.remove();//删除当前将要处理的选择键
    if ( key.isAcceptable() ) {//如果是有客户端连接请求
    System.out.println("more client connect in!");
    ServerSocketChannel nextReady =
    (ServerSocketChannel)key.channel();
    //获取客户端套接字
    Socket s = nextReady.accept();
    //设置对应的通道为异步方式并注册感兴趣事件
    s.getChannel().configureBlocking( false );
    SelectionKey readWriteKey =
    s.getChannel().register( this.selector,
    SelectionKey.OP_READ|SelectionKey.OP_WRITE );
    //将注册的事件与该套接字联系起来
    readWriteKey.attach( s );
    //将当前建立连接的客户端套接字及对应的通道存放在哈希表//clientChannelMap中
    this.clientChannelMap.put( s, new
    ClientChInstance( s.getChannel() ) );
    }
    else if ( key.isReadable() ) {//如果是通道读准备好事件
    System.out.println("Readable");
    //取得选择键对应的通道和套接字
    SelectableChannel nextReady =
    (SelectableChannel) key.channel();
    Socket socket = (Socket) key.attachment();
    //处理该事件,处理方法已封装在类ClientChInstance中
    this.readFromChannel( socket.getChannel(),
    (ClientChInstance)
    this.clientChannelMap.get( socket ) );
    }
    else if ( key.isWritable() ) {//如果是通道写准备好事件
    System.out.println("writeable");
    //取得套接字后处理,方法同上
    Socket socket = (Socket) key.attachment();
    SocketChannel channel = (SocketChannel)
    socket.getChannel();
    this.writeToChannel( channel,"This is from server!");
    }
    }
    }
    }
    //对通道的写操作
    public void writeToChannel( SocketChannel channel, String message )
    throws IOException {
    ByteBuffer buf = ByteBuffer.wrap( message.getBytes() );
    int nbytes = channel.write( buf );
    }
    //对通道的读操作
    public void readFromChannel( SocketChannel channel, ClientChInstance clientInstance )
    throws IOException, InterruptedException {
    ByteBuffer byteBuffer = ByteBuffer.allocate( BUFFERSIZE );
    int nbytes = channel.read( byteBuffer );
    byteBuffer.flip();
    String result = this.decode( byteBuffer );
    //当客户端发出”@exit”退出命令时,关闭其通道
    if ( result.indexOf( "@exit" ) >= 0 ) {
    channel.close();
    }
    else {
    clientInstance.append( result.toString() );
    //读入一行完毕,执行相应操作
    if ( result.indexOf( "\n" ) >= 0 ){
    System.out.println("client input"+result);
    clientInstance.execute();
    }
    }
    }
    //该类封装了怎样对客户端的通道进行操作,具体实现可以通过重载execute()方法
    public class ClientChInstance {
    SocketChannel channel;
    StringBuffer buffer=new StringBuffer();
    public ClientChInstance( SocketChannel channel ) {
    this.channel = channel;
    }
    public void execute() throws IOException {
    String message = "This is response after reading from channel!";
    writeToChannel( this.channel, message );
    buffer = new StringBuffer();
    }
    //当一行没有结束时,将当前字窜置于缓冲尾
    public void append( String values ) {
    buffer.append( values );
    }
    }
    //主程序
    public static void main( String[] args ) {
    NBlockingServer nbServer = new NBlockingServer(8000);
    try {
    nbServer.initialize();
    } catch ( Exception e ) {
    e.printStackTrace();
    System.exit( -1 );
    }
    try {
    nbServer.portListening();
    }
    catch ( Exception e ) {
    e.printStackTrace();
    }
    }
    }


    小结:
    从以上程序段可以看出,服务器端没有引入多余线程就完成了多客户的客户/服务器模式。该程序中使用了回调模式(CALLBACK),细心的读者应该早就看出来了。需要注意的是,请不要将原来的输入输出包与新加入的输入输出包混用,因为出于一些原因的考虑,这两个包并不兼容。即使用通道时请使用缓冲完成输入输出控制。该程序在Windows2000,J2SE1.4下,用telnet测试成功。
    更多相关内容
  • 1.Rd,Sd表示: 2.PR,CLR表示: s,即set,异步置位 r,即reset,异步复位

    1.Rd,Sd表示:

    b24fa8a97d8348ca9387553382f8302d.png

    2.PR,CLR表示:

     8a1d630c8c8f4d5786af7690f8903330.png

    s,即set,异步置位

    r,即reset,异步复位 

    展开全文
  • 设计时常常是低电平有效,本文讲解一下原因,希望对大家有帮助。
  • 考虑以下电路,当触发器的D数据输入相对于clk来说是异步的,再这种情况下,因为不知道什么时候会有异步输入的信号、输入信号什么时候撤销,这将导致在clk上升沿来临时建立和保持时间不满足,从而导致输出Q的数据...

    考虑以下电路,当触发器的D端数据输入相对于clk来说是异步的,再这种情况下,因为不知道什么时候会有异步输入的信号、输入信号什么时候撤销,这将导致在clk上升沿来临时建立和保持时间不满足,从而导致输出端Q的数据不稳定。
    在这里插入图片描述
    对于该电路来说,D端信号和清零信号均是相对于clk来说是异步信号,因此两个信号均需要考虑,下面进行分析。
    一.异步输入信号导致亚稳态分析
    常见的同步电路如下,采用两级寄存器拍了拍,实现信号跨时钟域同步。
    在这里插入图片描述
    但这样的电路只适用于异步输入的脉宽大于时钟周期的情况,当输入脉宽太窄时,clk可能出现采漏情况。
    因此考虑以下电路同步,当输入窄脉冲时,该电路能正确采集并输出一个clk周期的高电平。
    在这里插入图片描述
    当没有输入信号时,电路稳定的状态输出如下所示
    在这里插入图片描述
    可见,该电路正常工作,等待异步输入的上升沿触发第一级DFF。当窄脉冲输入时,电路的状态如下
    在这里插入图片描述
    由于输入脉宽窄,在跳高又跳低时clk时钟未到上升沿,所以该电路接下来等待时钟上升沿。
    时钟上升沿到来是,电路状态如下
    在这里插入图片描述
    由于第一级和第二级触发器之间时钟不同,因此有很大概率产生亚稳态;但第三级触发器是正常的所以输出为0,反馈的组合电路状态还是没改变。
    当下一个时钟上升沿到来时,电路的状态如下
    在这里插入图片描述
    第三级触发器可能输出1,也可能输出0,当输出为0时,组合电路状态未变,当输出为1时,电路改变如下
    在这里插入图片描述
    由于同步输出为1,导致组合电路产生了清零信号,导致第一,二级触发器清零。但也正是由于清零信号的存在,导致同步输出只产生了一个clk周期宽度的高电平。因此该电路可以将异步输入的窄脉冲,拓宽为clk周期的信号。
    再回头查看两级寄存器同步电路,如下所示
    在这里插入图片描述
    当data_clka输入为一个clk_a周期脉宽时,clk_b可能未能正确采集到数据,因此需要对输入的脉宽进行延长。如下所示电路
    在这里插入图片描述
    将data_clka一个周期的高电平时间延长为多个周期,以便于clk_b采集。
    二.异步复位信号导致的亚稳态分析
    电路图如下
    在这里插入图片描述
    由于时钟和数据是在同一时钟域的,所以不用考虑由于数据输入产生的亚稳态。复位信号有效时输出为0,此时输出不会产生亚稳态,但当复位信号结束时,clk上升沿可能恰好有效,此时采集到rst的电平未知,从而产生出亚稳态。
    因此为了防止复位信号产生的亚稳态,从而设计出以下电路
    在这里插入图片描述
    当rst信号为高电平时,电路正常工作,电路的状态如下所示
    在这里插入图片描述
    当rst信号有效时,电路进行复位,状态如下
    在这里插入图片描述
    各级触发器复位,等待复位信号结束,当复位结束时,电路状态如下
    在这里插入图片描述
    当rst信号复位结束时,clk时钟上升沿到来,由于rst信号在跳变建立时间不满足,采集到rst信号未知,从而导致第一级触发器输出值未知,即第一级触发器产生亚稳态。对于第二级触发器来说,由于在clk上升沿来之前其D端为0,Q端为0,当clk上升沿有效时,虽然对rst采样到未知电平,但此时触发器还是会输出0,因为没有让触发器跳1的条件。即采集到rst=0,触发器输出为0,采集到rst=1,输入D=0,所以触发器还是输出为0。这也就是异步复位、同步释放电路。
    这点类似三目运算符,即表达式:assign out= sel?a:b;当a=4’b1010,b=4’b1001,sel=x时,输出out=4’b10xx。

    展开全文
  • 异步输入的同步器和开关防颤电路的设计,设计一个4位二进制计数器,在开发实验板上实现按键控制技术
  • FPGA设计一个带有异步复位控制和时钟使能控制的10进制计数器。 端口设定如下: 输入端口:CLK:时钟,RST:复位,EN:时钟使能,LOAD:置位控制, DIN:置位数据; 输出端口:COUT:进位输出,DOUT:...
  • 【Verilog】UART异步串口的verilog实现

    千次阅读 2022-03-15 21:58:49
    电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有RS232、RS422、RS485等,它们定义了接口不同的电气特性,如RS-232是单端输入输出,而RS-422/485为差分输入输出等。 RS232接口标准出现...

    目录

    一、UART介绍

    二、Verilog代码

    2.1 TOP

    2.2 发送模块

    2. 3 接收模块


    一、UART介绍

            UART是一种采用异步串行通信方式的通用异步收发传输器(universal asynchronous receiver-transmitter),它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。

            UART串口通信需要两根信号线来实现,一根用于串口发送,另外一根负责串口接收。UART在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。校验位分为奇校验和偶校验,用于检验数据在传输过程中是否出错。 奇校验时,发送方应使数据位中1的个数与校验位中1的个数之和为奇数;接收方在接收数据时, 对1的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。同样,偶校验则检查1 的个数是否为偶数。

             UART通信过程中的数据格式及传输速率是可设置的,为了正确的通信,收发双方应约定并遵循同样的设置。数据位可选择为5、6、7、8位,其中8位数据位是最常用的,在实际应用中一般都选择8位数据位;校验位可选择奇校验、偶校验或者无校验位;停止位可选择1位(默认),1.5或2位。串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bps(位 /秒),常用的波特率有9600、19200、38400、57600以及115200等。

            在设置好数据格式及传输速率之后,UART负责完成数据的串并转换,而信号的传输则由外部驱动电路实现。电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有RS232、RS422、RS485等,它们定义了接口不同的电气特性,如RS-232是单端输入输出,而RS-422/485为差分输入输出等。 RS232接口标准出现较早,可实现全双工工作方式,即数据发送和接收可以同时进行。在传输距离较短时(不超过15m),RS232是串行通信最常用的接口标准。

            RS-232标准的串口最常见的接口类型为DB9,样式如图 16.1.2所示,工业控制领域中用到的工控机一般都配备多个串口,很多老式台式机也都配有串口。但是笔记本电脑以及较新一点的台式机都没有串口,它们一般通过USB转串口线(图 16.1.3)来实现与外部设备的串口通信。

             DB9接口定义以及各引脚功能说明如下图所示,我们一般只用到其中的2(RXD)、3 (TXD)、5(GND)引脚,其他引脚在普通串口模式下一般不使用。

     

    二、Verilog代码

            串口数据环回实验系统框图:

            

             在编写代码之前,我们首先要确定串口通信的数据格式及波特率。在这里我们选择串口比

    较常用的一种模式,数据位为8位,停止位为1位,无校验位,波特率为9600bps。则传输一
    帧数据的时序图如图 所示:
            

     

    2.1 TOP

    module	uart_top(
    	input			sys_clk,
    	input			sys_rst_n,
    	input			uart_rxd,	
    	output			uart_txd
    );
    
    parameter			FREQ	=	50000000;
    parameter			BPS		=	9600;
    
    wire				en;
    wire		[7:0]	uart_data;
    
    uart_recv	 #(                          //串口接收模块
        .FREQ       	(FREQ),       //设置系统时钟频率
        .BPS       		(BPS))
    u_uart_recv(
    	.sys_clk        (sys_clk),
    	.sys_rst_n      (sys_rst_n),
    	.uart_rxd       (uart_rxd),
    	
    	
    	.uart_txd		(uart_data),
    	.rx_done		(en)
    );
    
    uart_send	 #(                          //串口发送模块
        .FREQ       	(FREQ),       //设置系统时钟频率
        .BPS       		(BPS))
    u_uart_send(
    	.sys_clk        (sys_clk),
    	.sys_rst_n      (sys_rst_n),
    	.uart_din		(uart_data),
    	.tx_en			(en),
    	.uart_txd		(uart_txd)
    );
    
    endmodule 

    2.2 发送模块

    module	uart_send(
    	input			sys_clk,
    	input			sys_rst_n,
    	input	[7:0]	uart_din,
    	input			tx_en,
    	
    	output	reg		uart_txd
    );
    
    parameter			BPS		=		9600;
    parameter			FREQ	=		50000000;
    localparam			BPS_CNT	=		FREQ / BPS;
    
    wire				start_flag;
    	
    reg					tx_en_d0;	
    reg					tx_en_d1;
    reg					tx_flag;		//发送过程标志
    reg		[15:0]		bps_cnt;
    reg		[3:0]		tx_cnt;
    reg		[7:0]		tx_data;
    
    assign		start_flag	=		tx_en	&&	(~tx_en_d1);
    
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)begin
    		tx_en_d0		<=		1'b0;
    		tx_en_d1		<=		1'b0;
    		end
    	else	begin
    		tx_en_d0		<=		tx_en;
    		tx_en_d1		<=		tx_en_d0;
    		end
    end
    
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)begin
    		bps_cnt			<=		16'd0;
    		tx_cnt			<=		4'd0;
    		end
    	else	if(bps_cnt	<	BPS_CNT-1)begin
    			bps_cnt			<=		bps_cnt+1'b1;
    			tx_cnt			<=		tx_cnt;
    			end
    	else	begin
    		bps_cnt			<=		16'd0;
    		tx_cnt			<=		tx_cnt+1'b1;
    		end
    end
    
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)begin
    		tx_flag			<=		1'b0;
    		tx_data			<=		8'd0;
    		end
    	else if(start_flag)begin
    			tx_flag		<=		1'b1;
    			tx_data		<=		uart_din;
    			end
    	else if((tx_cnt==4'd9)&&(bps_cnt==BPS_CNT/2))begin
    			tx_flag		<=		1'b0;
    			tx_data		<=		8'd0;
    			end
    		else begin	
    			tx_flag		<=		tx_flag;
    			tx_data		<=		tx_data;
    			end
    end
    
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)
    		uart_txd		<=		1'b1;		//空闲状态,发送端为高电平
    	else if(tx_flag)
    			case(tx_cnt)
    				4'd0	:	uart_txd	<=	1'b0;//起始位
    				4'd1	:	uart_txd	<=	tx_data[0];
    				4'd2	:	uart_txd	<=	tx_data[1];
    				4'd3	:	uart_txd	<=	tx_data[2];
    				4'd4	:	uart_txd	<=	tx_data[3];
    				4'd5	:	uart_txd	<=	tx_data[4];
    				4'd6	:	uart_txd	<=	tx_data[5];
    				4'd7	:	uart_txd	<=	tx_data[6];
    				4'd8	:	uart_txd	<=	tx_data[7];
    				4'd9	:	uart_txd	<=	1'b1;//停止位
    				default	:	uart_txd	<=	1'b1;
    				endcase
    		else
    			uart_txd	<=	1'b1;
    end
    				
    endmodule

    2. 3 接收模块

    module	uart_recv(
    	input			sys_clk,
    	input			sys_rst_n,
    	input			uart_rxd,
    	
    	output	reg[7:0]	uart_txd,
    	output	reg		rx_done
    );
    parameter			BPS		=		9600;
    parameter			FREQ	=		50000000;
    localparam			BPS_CNT	=		FREQ / BPS;
    
    wire				start_flag;		//对uart_rxd下降沿进行检测
    
    reg					uart_rxd_d0;
    reg					uart_rxd_d1;
    reg					rx_flag;		//接收数据标志信号
    reg		[3:0]		rx_cnt;			//对接收数据计数	
    reg		[15:0]		bps_cnt;		//对时钟的计数
    reg		[7:0]		tx_data;		//对接收数据进行寄存
    
    assign	start_flag	=	uart_rxd_d1	&	(~uart_rxd_d0);		//下降沿检测电路
    
    //对uart_rxd延迟两个时钟单位
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)begin
    		uart_rxd_d0		<=		1'b0;
    		uart_rxd_d1		<=		1'b0;
    		end
    	else	begin
    		uart_rxd_d0		<=		uart_rxd;
    		uart_rxd_d1		<=		uart_rxd_d0;
    		end
    end
    
    //当start_flag来临时,开始接收数据
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)
    		rx_flag			<=		1'b0;
    	else	
    		if(start_flag)
    			rx_flag		<=		1'b1;
    		else if((bps_cnt == BPS_CNT/2)  &&	(rx_cnt	== 4'd9))  //接收了8个bit后,接收状态关闭
    			rx_flag		<=		1'b0;
    		else
    			rx_flag		<=		rx_flag;
    end
    
    //进入接收过程后,启动系统时钟计数器与接收数据计数器
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)begin
    		bps_cnt			<=		16'd0;
    		rx_cnt			<=		4'd0;
    		end
    	else if(rx_flag)
    		if(bps_cnt	<	BPS_CNT -1'b1)begin
    			bps_cnt		<=		bps_cnt	+	1'b1;
    			rx_cnt		<=		rx_cnt;
    			end
    		else	begin
    			bps_cnt		<=		16'd0;
    			rx_cnt		<=		rx_cnt	+	1'b1;
    			end
    	else	begin
    		bps_cnt			<=		16'd0;
    		rx_cnt			<=		4'd0;
    		end
    end
    
    //通过计数器来寄存接收到的数据,tx_data
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)
    		tx_data			<=		8'd0;
    	else	if(rx_flag)		
    			if(bps_cnt ==	BPS_CNT/2)begin
    				case(rx_cnt)
    					4'd1	:	tx_data[0]	<=	uart_rxd_d1;
    					4'd2	:	tx_data[1]	<=	uart_rxd_d1;
    					4'd3	:	tx_data[2]	<=	uart_rxd_d1;
    					4'd4	:	tx_data[3]	<=	uart_rxd_d1;
    					4'd5	:	tx_data[4]	<=	uart_rxd_d1;
    					4'd6	:	tx_data[5]	<=	uart_rxd_d1;
    					4'd7	:	tx_data[6]	<=	uart_rxd_d1;
    					4'd8	:	tx_data[7]	<=	uart_rxd_d1;
    					default	:	;
    				endcase
    				end
    			else
    				tx_data		<=		tx_data;
    	else
    		tx_data		<=		8'd0;
    end
    	
    //接收数据寄存到uart_txd,并输出接收完成标志位
    always@(posedge	sys_clk	or	negedge	sys_rst_n)begin
    	if(!sys_rst_n)begin
    		rx_done		<=		1'b0;
    		uart_txd	<=		8'd0;
    		end
    	else	if(rx_cnt == 4'd9)begin
    				rx_done		<=		1'b1;
    				uart_txd	<=		tx_data;
    			end
    	else	begin
    			rx_done		<=		1'b0;
    			uart_txd	<=		8'd0;
    			end
    end
    
    endmodule

    展开全文
  • 同步和异步 (代码执行顺序)

    千次阅读 2019-09-20 18:01:48
    同步代码执行顺序优先级高于异步代码执行顺序优先级; new Promise(fn)中的fn是同步执行; process.nextTick()>Promise.then()>setTimeout>setImmediate。
  • 同步时序逻辑电路的特点:各触发器的时钟全部连接在一起,并接在系统时钟,只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来,此时无论外部输入x有无变化,状态...
  • 一、异步时序逻辑电路特点及分类 1.特点:没有统一时钟脉冲信号,电路状态的改变是外部输入信号变化直接作用的结果; 在状态转移过程中,各存储部件的状态变化发生不同步,不同状态维持时间也不一定相同; 在研究...
  • 脉冲异步时序电路中没有统一的时钟脉冲,因此,规定输入信号为脉冲信号,即控制电路状态转换的脉冲由电路状态输入端直接提供。  ● 电路对过去输入信号的记忆是由触发器实现的。  在同步时序电路中采用带时钟...
  • 数字电路中同步和异步概念

    万次阅读 2016-12-10 15:20:44
    异步输入信号和时钟无关;同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算。实际开发中,经常有同步清零、异步清零、同步复位、异步复位等概念,下面就给与相关代码演示。 ...
  • 信息发送原理:将手动输入字符串信息转换成机器可以识别的字节数组,然后调用套接字的Send()方法将字节数组发送出去。信息接收原理:调用套接字的Receive()方法,获取对传来的字节数组,然后将其转换成人可以读懂的...
  • 所谓异步计数器电路,是指其构成的基本功能单元触发器的时钟输入信号不是与触发器在一起的,有的是外输入的脉冲信号,有的是其他触发器的输出,这样当外输入脉冲信号到来的时候,触发器的翻转有先有后,是异步的。...
  • 同步复位没有用到寄存器的异步复位CLR端口,综合出来的实际电路只是把复位信号rst_n作为逻辑输入的使能信号。 同步复位代码: //同步复位 module top ( input clk, input rst_n, input a, output reg b ); ...
  • 前言 我本来是打算写一篇co源码精读(为啥读co,因为它短),然鹅发现自己存在一系列基础...当时,它的主要目的是处理以前由服务器语言(如Perl)负责的一些输入验证操作。在JavaScript问世之前,必须把表单数据发送到
  • 在客户端文本框输入一个内容,然后在服务器返回时间 在DEMO中要用到ashx文件,用于获取服务器的信息 效果图片 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。 客户端代码 <%...
  • VHDL之异步复位计数器

    2019-09-05 09:55:28
    使用VHDL编写的,能够异步复位,上升沿计数的计数器。
  • 如果n某一位等于1,CLR端输入就为1,对应的PRE端输入一定为0(有取反),PRE为0,输出立即置1。这样就实现了复位data=in; 网上对D触发器异步复位和置位讲解的不多,还有讲错的,我也是参考别人的解释,自己得出的...
  • AJAX异步post前后传输数据

    千次阅读 2022-04-02 13:43:33
    前端代码,无jq适合新手看 Document 姓名: 后端java代码 import javax.servlet.ServletException;... } } 启动tomcat 主页 输入一个姓名,鼠标离开文本框,文本框数据传给后端,后端处理+"还没有注册"发送给前端显示
  • RXD是UART接收,为输入。  UART的基本特点是:(1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。(2)起始位(Start
  • 数字逻辑复习——触发器

    千次阅读 多人点赞 2020-12-29 10:27:39
    目录 一、触发器的两个基本特点 ...2、设有专门的异步置位输入端异步复位输入端的同步RS-FF触发器 3、动作特点 (二)同步D触发器 1.逻辑图、特性表和特性方程 2.逻辑功能 (三)同步JK触发器
  • 目录 D触发器 同步高电平触发的D触发器 异步高电平触发的D触发器 同步上升沿触发的D触发器 ...异步是指电路除了时钟信号控制之外,还有优先级更高的控制(SET和RESET) D触发器 同步高电平触
  • Verilog寄存器电路描述(异步复位、异步置位等)

    千次阅读 多人点赞 2020-03-30 18:25:47
    寄存器电路的Verilog描述方式一、最基本的寄存器二、 异步复位寄存器三、异步置位寄存器四...功能:在clk时钟信号的上升沿,输入端数据din被锁存到输出端dout。 Verilog代码: moudle dff(clk,din,dout) input cl...
  • 记录状态的寄存器组其时钟输入端不是都连结在同一个时钟信号上。例如用一个触发器的输出连结到另一个触发器的时钟端去触发的就是异步时序逻辑。 用 Verilog HDL 设计的可综合模块,必须避免使用
  • 利用Matlab建立异步电动机恒压频比变频调速仿真模型,通过控制PWM调制波的幅值和频率,达到控制电机输入端电压幅值、频率的目的,并利用PI调节器构建转速闭环控制,调整PI控制器参数,最终得到系统的闭环控制模型,...
  • 基于恒压频比控制方式的异步电机变频调速MATLAB仿真模型,MATLAB版本为R...模型中可观测定子电流,转速,转矩,调制信号,逆变器输出电压,定子端输入电压。 建议读者学习变频调速基础知识,以便于更好的进行调整参数。
  • 性能分析表明,较理想同步情况下,在考虑多用户信号传输异步特性时,系统性能将明显下降,但若能在基站发射通过联合预编码优化设计,则可降低异步干扰信号对系统性能的影响,从而改善系统性能。
  • 西安航天民芯 DCDC转换器 异步升压芯片 MT3608 SOT23-6 可代替兼容市面LTI3608 LN3608 TD8208 SY6289 SY7208 SDB628 SX1308 ZCC...5 VIN 输入端 3 FB 反馈端 2 GND 接地端 1 SW 开关引脚 4 EN 使能端,高有效 6 NC 悬空
  • 最近更新了一系列关于异步和回调的文章,比如《一篇文章,搞明白异步和多线程的区别》、《两个经典例子让你彻底理解java回调机制》、《异步请求和异步调用有区别?》,大家感兴趣的话可温习一下。 今天再带大家学习...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 121,432
精华内容 48,572
关键字:

异步输入端