精华内容
下载资源
问答
  • 如何实现axi_lite的双向传递

    千次阅读 2017-02-28 20:56:29
    通过axi_lite实现PS与PL之间的双向信息传输

    最近,由于项目。需要通过axi_lite实现PS与PL之间的双向信息传输。在网上找了好久,PS到PL单向传输的例子很多,比如http://www.eetop.cn/blog/html/70/1149070-51989.html这篇博文描述的这样。

    而双向传输的例子却很难找到,通过阅读生成的自定义IP代码。发现PS有写寄存器的能力,也有读寄存器的能力。这就使得PL向PS传输信息可以实现。

    本文后面贴出的代码,用最简单的方法来实现PL向PS的信息传输。将生成的代码中分配的四个寄存器中的最后一个寄存器PS写的能力禁止,只保存PS读的能力,而通过PL写这个寄存器(PS可读)来实现PL向PS传输信息。

    接下来贴出修改部分代码:
    首先,禁止PS对于最后一个寄存器写的能力。首先,要找到write logic部分,可通过查看生成代码注释找到。此部分代码如下所示(不同vivado版本可能有一定差异),对slv_reg3进行操作部分删除,本文代码采用注释方法方便比较,共三处,分别用(1)、(2)、(3)标记:

    // Implement memory mapped register select and write logic generation
    // The write data is accepted and written to memory mapped registers when
    // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
    // select byte enables of slave registers while writing.
    // These registers are cleared when reset (active low) is applied.
    // Slave register write enable is asserted when valid address and data are available
    // and the slave is ready to accept the write address and write data.
    assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;

    always @( posedge S_AXI_ACLK )
    begin
      if ( S_AXI_ARESETN == 1'b0 )
        begin
          slv_reg0 <= 0;
          slv_reg1 <= 0;
          slv_reg2 <= 0;
          //(1)// slv_reg3 <= 0;
        end 
      else begin
        if (slv_reg_wren)
          begin
            case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
              2'h0:
                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                    // Respective byte enables are asserted as per write strobes 
                    // Slave register 0
                    slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                  end  
              2'h1:
                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                    // Respective byte enables are asserted as per write strobes 
                    // Slave register 1
                    slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                  end  
              2'h2:
                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                    // Respective byte enables are asserted as per write strobes 
                    // Slave register 2
                    slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                  end  
              //(2)//2'h3:
                //for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
                  //if ( S_AXI_WSTRB[byte_index] == 1 ) begin
                    // Respective byte enables are asserted as per write strobes 
                    // Slave register 3
                    //slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
                  end  
              default : begin
                          slv_reg0 <= slv_reg0;
                          slv_reg1 <= slv_reg1;
                          slv_reg2 <= slv_reg2;
                         //(3)//slv_reg3 <= slv_reg3;
                        end
            endcase
          end
      end
    end
    

    在用户定义代码处加上如下代码:

    // Add user logic here
    always @( posedge S_AXI_ACLK )
    begin
      if ( S_AXI_ARESETN == 1'b0 )
        begin
          slv_reg3  <= 0;
        end 
      else
        begin
          slv_reg3 <= PL_data_in;       
        end
    end
    // User logic ends
    

    当然,在输入端口处需要加上PL_data_in为输入端口。其他部分与单向情况类似。

    展开全文
  • Vue4种父子组件数据双向传递

    千次阅读 2017-09-22 08:45:12
    讲重点,今天我就给大家讲讲VUE四种数据双向传递有那些用法 https://juejin.im/post/59c270bc5188252c237f851f?utm_source=tuicool&utm_medium=referral 一.通过$on , $emit 来进行双向通信 使用 $on(eventName...

    讲重点,今天我就给大家讲讲VUE四种数据双向传递有那些用法

    https://juejin.im/post/59c270bc5188252c237f851f?utm_source=tuicool&utm_medium=referral

    一.通过$on , $emit 来进行双向通信

    使用 $on(eventName) 监听事件
    使用 $emit(eventName) 触发事件

    这种用法,其实是我接下来三种用法的根基

    先来说说$on 是用来干麻的,是用来监听的事件的,就是监听$emit里(eventName)事件的,一量$emit触发事件,则$on会接收到,则执行函数事件

    那我们基本数据单向传递我们都用props来进行传递,那一旦子组件想改变props传过来的数据,我们是不能直接改变Props里的数据,我们还是要改变父组件的数据,用$on和$emit是如何实现的呢

    children组件

    <template lang="pug">
      .demo
        .demo-example(@click="changePropsValue") {{msg}}
    </template>
    
    
    <script>
    export default {
      props: ['msg'],
      methods: {
        changePropsValue () {
          this.$emit('changeMsg', '通过$emit触发事件了')
        }
      }
    }
    </script>

    1.msg是通过父组件传递过来的,我们先前可肯定要在props里声明好
    2.在点击的时候,我们触发了changeMsg事件,第二个参数是,你想要传到父组件的参数

    parent组件

    <template lang="pug">
      div
        demo(:msg="msg" v-on:changeMsg='onChange')
    </template>
    
    <script>
    import Demo from './demo.vue'
    export default {
      data () {
        return {
          msg: '首次数据传递'
        }
      },
      components: {
        Demo
      },
      methods: {
        onChange (msg) {
          this.msg = msg
        }
      }
    }
    </script>

    我们随后把demo引入,传入子组件的msg我们事先在data数据里面定义好,同时在demo组件上进行一个$on的监听
    1.$on :(冒号)后面跟的第一个值是$emit触发的事件,也是$on所要监听的事件,一量$emit有触发,则马上执行了onChange函数,但本质上vue还是单向数据流的,虽然props不能改变,但是data里的数据是可以进行改变的,一但data的数据和子组件有传递关系,一旦父data数据有变动,子组件props所对应的数据则同时跟着变动

    二.通过 v-model 来进行双父子通信

    在vue进入到2.0的时候,取消了.sync的功能,导致了一堆组件库大动脑子,基本都用了v-model去进行双向绑定,本质上v-model适用场景是用在表单上面的,但是既然可以自定义了,那就有它的灵活性

    官方说法:

    自定义事件可以用来创建自定义的表单输入组件,使用 v-model 来进行数据双向绑定。看看这个:input v-model="something"

    那语法糖则是这样的

    input
    v-bind:value="something"
    v-on:input="something = $event.target.value"

    这说明了

    1.v-model里的something这个变量值在语法糖里代表的是value值,在表单上我们可以看作是input的value值,那在其它标签可以看成一个将要传入的Props数据,那唯一不可变的是这个props的Key必须是value
    2.v-on:input="something = $event.target.value"
    其实v-model内置也是通过$on和$emit来进行传递的,进行了input输入事件的监听,然后拿到事件上$event.target.value最新的改变something

    现在老版本的组件库,当2.0取消.sync的时候,自定义组件的时候,如何巧用v-model来进行双向通信

    children组件

    <template lang="pug">
      .demo
        .demo-example(@click="changePropsValue") {{value}}
    </template>
    
    
    <script>
    export default {
      props: ['value'],
      methods: {
        changePropsValue () {
          this.$emit('input', '通过$emit触发input事件了')
        }
      }
    }
    </script>

    1.这里的value前面说过了就是v-model传过来的value ( v-bind:value="something"),但是只能用value去接收
    2.这里主要巧用了一点,平时我们改变input输入框的时候,input事件是自己主动触发的,但是,我们也同时可以给他手动触发,我们用$emit进行了手动触发(input)事件

    parent组件

    <template lang="pug">
      div
        demo(v-model ='msg')
    </template>
    
    <script>
    import Demo from './demo.vue'
    export default {
      data () {
        return {
          msg: '首次数据传递'
        }
      },
      components: {
        Demo
      }
    }
    </script>

    这个我们直接用v-model像表单那样绑定就直接可以进行父子组件双向绑定了。在v-model的语法糖里封装了v-on:input 去进行监听事件

    3.在2.3回归的特性.sync

    回归的.sync与1.0版本的写法有所改变,改来改去,不离其实中,还是要通过$emit去显式地触发一个更新事件;

    但是相比v-model来说语法上更加直观,更加简洁,毕镜v-model是主要给表单进行又向绑定适用的

    如果再进一步往底层说,.sync还是进行了$on进行了监听封装,跟v-model一样也同样是一种语法糖

    children组件

    <template lang="pug">
      .demo
        .demo-example(@click="changePropsValue") {{msg}}
    </template>
    
    
    <script>
    export default {
      props: ['msg'],
      methods: {
        changePropsValue () {
          this.$emit('update:msg', '通过$emit显示触发了更新事件')
        }
      }
    }
    </script>

    1.通过props来进行msg的数据接收
    2.通过$emit来进行触发,第一个参数则是显示触发,update:msg (msg)则是你需要改变的props里从父组件里接收的值,第二个参数,还是你要更新的值,从语意上设计的也很有感觉,有木有

    parent

    <template lang="pug">
      div
        demo(:msg.sync="msg")
    </template>
    
    <script>
    import Demo from './demo.vue'
    export default {
      data () {
        return {
          msg: '首次数据传递'
        }
      },
      components: {
        Demo
      }
    }
    </script>

    主要看demo(:msg.sync="msg") 这里直接在向子组件传递的时候还是像1.0的时候加一个.sync,本质上还是它会被扩展为一个自动更新父组件属性的 v-on 侦听器
    (推荐用法,一般对一个模态框进行封装的时候很有用,有了.sync不建议用v-model)

    4.$parent用法

    这在一些显示操作的时候,向外部暴露props和event的时候是不推荐用的,那有人要问了$$parent什么时候用呢,在一些自己内部逻辑操用的时候可以用一下,不用很繁琐的来进行双向来回导,节省代码和逻辑,有时候也可以让人一目了然

    children组件

    <template lang="pug">
      .demo
        .demo-example(@click="changePropsValue") 点击按钮
    </template>
    
    
    <script>
    export default {
      methods: {
        changePropsValue () {
          this.$parent.msg = '通过$parent显改变了更新事件'
        }
      }
    }
    </script>

    1.子组件,通过点击按钮,显示的改变了父组件的parent.msg里面的数据

    parent

    <template lang="pug">
      div
        demo
        p {{msg}}
    </template>
    
    <script>
    import Demo from './demo.vue'
    export default {
      data () {
        return {
          msg: '第一次写入数据'
        }
      },
      components: {
        Demo
      }
    }
    </script>

    在这种四种方法里,我还是推荐用.sync来进行双向通信,一量旦通信机制深了,组件的嵌到超过3层的话,我还是建议用vuex来进行数据的共享,不然一层一层传,再一层一层的向上导,到最后你页面会把控不住,业务代码也就不直观了

    展开全文
  • 引用: 双向传递! #include"iostream" using namespace std; const int N = 8; int main() { void s(int *a, int *b); int i = 3, b = 5; s(&i, &b); system("pause"); return 0; } void s...

    #include"iostream"
    using namespace std;
    const int N = 8;
    int main()
    {
    	void s(int &a, int &b);
    	int i = 3, b = 5;
    	s(i, b);
    	
    		system("pause");
    
    	return 0;
    }
    void s(int &a, int &b)
    {
    	int temp;
    	temp = a;
    	a = b;
    	b = temp;
    }
    


    引用: 双向传递!



    #include"iostream"
    using namespace std;
    const int N = 8;
    int main()
    {
    	void s(int *a, int *b);
    	int i = 3, b = 5;
    	s(&i, &b);
    	
    		system("pause");
    
    	return 0;
    }
    void s(int *a, int *b)
    {
    	int temp;
    	temp = *a;
    	*a = *b;
    	*b = temp;
    }
    

    地址传递。     注意: 存储空间的区别。





    #include"iostream"
    using namespace std;
    const int N = 8;
    int main()
    {
    	void s(int a, int b);
    	int i = 3, b = 5;
    	s(i, b);
    	
    		system("pause");
    
    	return 0;
    }
    void s(int a, int b)
    {
    	int temp;
    	temp = a;
    	a =b;
    	b= temp;
    }
    



    值传递:          达不到双向传递的目的;




















































    展开全文
  • Service与Activity实时双向传递数据

    千次阅读 2015-12-11 10:44:55
    Service实时向Activity传递数据 演示一个案例,需求如下: 在Service组件中创建一个线程,该线程用来生产数值,每隔1秒数值自动加1,然后把更新后的数值在界面上实时显示。 步骤如下: 1、新建一个android项目工程...

    一、Service实时向Activity传递数据

    演示一个案例,需求如下:
    在Service组件中创建一个线程,该线程用来生产数值,每隔1秒数值自动加1,然后把更新后的数值在界面上实时显示。

    步骤如下:
    1、新建一个android项目工程,取名为demo。
    2、新建一个Service类,用来实时生产数值,供界面实时显示。

    复制代码
    package com.ljq.activity;
     
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.util.Log;
     
    public class CountService extends Service {
     private int count = 0;
     private boolean threadDisable=false;
     
     @Override
     public void onCreate() {
      super.onCreate();
       
      new Thread(new Runnable() {
       @Override
       public void run() {
        while (!threadDisable) {
         try {
          Thread.sleep(1000);
         } catch (InterruptedException e) {
          e.printStackTrace();
         }
         count++;
         Log.v("CountService", "Count is " + count);
          
         //发送广播
         Intent intent=new Intent();
         intent.putExtra("count", count);
         intent.setAction("com.ljq.activity.CountService");
         sendBroadcast(intent);
        }
       }
      }).start();
     
     }
     
     @Override
     public IBinder onBind(Intent intent) {
      return null;
     }
     
     @Override
     public void onDestroy() {
      super.onDestroy();
      count=0;
      threadDisable = true;
      Log.v("CountService", "on destroy");
     }
     
     
    }
    复制代码

    3、新建一个Activity类,显示数据。

    复制代码
    package com.ljq.activity;
     
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
     
    public class MainActivity extends Activity {
     private EditText editText=null;
     private MyReceiver receiver=null;
      
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
             
            editText=(EditText)findViewById(R.id.editText);
             
            //启动服务
            startService(new Intent(MainActivity.this, CountService.class));
             
      //注册广播接收器
      receiver=new MyReceiver();
      IntentFilter filter=new IntentFilter();
      filter.addAction("com.ljq.activity.CountService");
      MainActivity.this.registerReceiver(receiver,filter);
        }
         
        @Override
     protected void onDestroy() {
         //结束服务
            stopService(new Intent(MainActivity.this, CountService.class));
      super.onDestroy();  
     }
         
        /**
         * 获取广播数据
         * 
         * @author jiqinlin
         *
         */
        public class MyReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
          Bundle bundle=intent.getExtras();
          int count=bundle.getInt("count");
          editText.setText(count+"");    
         }
        }
     
          
         
     
    }
    复制代码

    4、main.xml布局文件

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent">
        <EditText android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:cursorVisible="false"
            android:editable="false"
            android:id="@+id/editText"/>
     
    </LinearLayout>
    复制代码

    5、清单文件

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.ljq.activity"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".MainActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
      <service android:name =".CountService" />
     
        </application>
        <uses-sdk android:minSdkVersion="7" />
     
    </manifest>
    复制代码

    二、activity向service中传值

     (2012-11-01 15:48:30)

    和activity中互相传值类似

    在activity中

    Intent regIntent = new Intent(this, ChatService.class);
      regIntent.putExtra("student_id", student_id);
      startService(regIntent);

    然后再service中的onStart函数中获取该值(该方法4.0后已经过期了,当然还可以继续使用)

      student_id=intent.getStringExtra("student_id");
      System.out.println("sevice_student_id---------------"+student_id);

    当然写到这里还是不能传的,不然会报错!!!

    我们需要在Mainfeist文件中注册这个service

    销毁Service写在activity的onDestroy方法里:

     @Override
     protected void onDestroy() {
       ChatActivity.this.stopService(new
       Intent(ChatActivity.this,
       ChatService.class));
      super.onDestroy();
     }

    补充:

    也可以从public int onStartCommand(Intent intent, int flags, int startId)中取出从activity中传过来的值。intent.getExtra()获得bundle对象,可从中取值。

    也可以用bindService(intent, conn,BIND_AUTO_CREATE);传值,把要传的值绑定在intent里,在service的public IBinder onBind(Intent intent) 方法里取得intent。
    可以在service里面注册一个广播,在activity里sendbroadcast(intent)传值。


     

    展开全文
  • Mainactivity1.java 主要是获取需要发送信息的输入框、确认发送的按钮以及接收的文本框控件 然后对按钮监听,并且使用Intent的putExtra设置传递键值对, 再使用startActivityForResult方法(为了一个结果)进行传输 ...
  • 在c++可以使用引用传递作为函数的形参传入函数,相较于值传递的方式,引用传递能够节省函数使用时...然而,由于引用传递双向的,当在函数中对于形参的数据进行改变后,实参的值也会进行相应的改变,如下所示: ...
  • Qt:quick和C++双向传递图片

    千次阅读 2015-04-17 10:41:02
    1.从quick传递图片到C++: 这一步主要是在quick中,将对象的指针传回C++,再利用gradWindow的save把图片保存出来。 核心函数 bool saveImage(QObject *source) { QQuickItem *item = qobject_cast(source); if...
  • 首先,有两个控制器,分别为控制器A、控制器B。 A->B:数据由控制器A传向控制器B,这叫做数据的顺传;数据由控制器B传向控制器A,这叫做逆传...下面是博主写的简单实现了两个控制间实现数据的双向传递的app的demo: 1
  • 文章目录双向数据传递v-mode 双向数据传递 这里提到的父子组件双向数据传递,即父子组件可以进行互相修改 我们知道一般父向子传值,子通过props进行接收,子向父传值,是通过$emit发布一个事件,父通过事件的监听...
  • 证明:当我用字符流实现了服务器端和客户端的连接后,从客户端发送字符串给服务器端,服务器端收到信息后再回传一个信息给客户端此时出现了阻塞,如改用其他流均可实现双向传递。服务器端程序:import java.net.*;...
  • Java_call_C(双向传递JAVA对象)

    千次阅读 2012-05-09 14:55:29
    在上一篇,我们知道在JNI中一个jstring就代表一个String,并且事实上是一个java对象,也就是说经由JNI来传递java对象是完全可能的。但因为本地代码不能直接存取Java,所有Java对象都有一个共同的代表(表示方式):...
  • 版权声明:转载请注明作者(独孤尚良dugushangliang)出处: https://blog.csdn.net/dugushangliang/article/details/90577356 参阅https://www.runoob.com/react/react-props.html并调试代码如下... <!... <...
  • tablecontrol是abap编辑器中SE80进入该编辑器 使用screen painter绘制普通屏幕 进入screen painter之后,...它的样子是一个表格,可以双向传递数据 TC(table control)------>程序内表 输入 将数据保存入内表 PAI  
  • 前面的话 虽然v-model和.sync之间的区别,是非常明显的,但是通过这个去研究下去,就有点意思了。首先说明v-model是.sync的一种特殊情况,也就是当prop是value,vm.$emit('update:input'),这个...双向数据传递 为...
  • 双向传递。 谭浩强先生用一个简单的例子: 输入两个整数, 按大小顺序输出, 用 函数处理 ,说明了指针的这类应用 。 1、【例】 输入的两个整数按大小顺序输出 , 用函数处理,而且用指针类型的数据作函数参数。...
  • //读取返回信息 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode){ case 1: if (resultCode==RESULT_OK){ String s=data.getStringExtra(...
  • 很多时候我们需要在子组件中修改prop的值,这样就破坏了vue的单项数据流,利用vue2.3的sync可以实现数据的双向绑定,这是官方解释 https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修饰符 ,...
  • 分为父传子,子传父、父子双向绑定、非父子关系值传递。 2、父传子: 例子: <div id="app"> <button @click="add"></button> <my-component :input-text="total"></my-c...
  • 但是,在一些特定交互的系统中,并不完全开放的网络场景下,为了进一步提升交互双方的可靠性,客户端和服务端都需要校验对方的证书信息,即双向认证。 服务端和客户端这样一个网络架构中,一般是一对多的关系,即一...
  • 双向绑定原理

    千次阅读 2019-05-31 18:46:32
    希望了解双向绑定原理 从MVC、MVVM说起 参考阮一峰老师的文章:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html 流程:View根据Model展示页面,当页面发生操作时(commander),View传递指令到Controller...
  • “别具一格”的vue双向数据绑定原理

    千次阅读 多人点赞 2021-05-30 01:35:35
    见网上许多文章讲vue双向数据绑定一开口就大谈 Object.defineProperty 和 proxy。其实不然。 vue 中有两个“特别的”概念:响应式(它和defineProperty有关)和双向数据绑定。 其实响应式原理是一种单向行为:它是数据...

空空如也

空空如也

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

信息的双向传递