Xilinx的PCIe仿真模型学习

面包板社区 2019-08-15 16:55


什么是Xilinx的PCIe仿真模型?


这里所说的Xilinx PCIe仿真模型是指在例化PCIe核时候其自动生成的参考时自动产生的仿真模型,用户可以用此模型来仿真其PCIe设计。这里着重学习为仿真endpoint提供的RP模型,Xilinx称其为downstream port model,简称DS端口模型。该模型框架图见下图。


图中的dsport模块,个人理解是模拟root端,而dsport上方的usrapp_rx和usrapp_tx可以理解为驱动+用户层程序,所以学习这2个usrapp源文件,对于用户理解pcie的驱动和顶层应用程序开发还是有好处的。该模型由于是downstream端口,所以大部分测试功能都在usrapp_tx里实现并发起。所以后面学习的重点是在仿真的同时,理解吃透usrapp_tx及其从它出调用的子程序。


使用Xilinx的PCIe的时候,例化示例都会自动生成仿真模型,同时官网提供的基于xapp1052的参考设计,也同时提供仿真BMD的仿真模型。即所谓的下行端口模型(downstream port model),所以PCIe例化之后产生的参考设计都会自动生成一个dsport的模型文件,让用户可以以此模拟一个root端口来测试其endpoint端口。下图给出了下行端口模型的结构框图:


图1:DS端口模型结构框图


当然,上图是仿真endpoint的模型,而且大部分用户都是实例化endpoint,如果是设计root端口的话,可以忽略本文。以下描述都是基于使用endpoint。用户例化的PCIe核可是视为EP,上图DS模型就是RP,仿真顶层还需要一个Testbench将RP和EP包裹起来,所有这些文件在PCIe核例化的时候自动产生,具体位置(这里以xapp1052为例)为:


图2:仿真文件存放位置


如图2所示,dsport文件夹存放都是图1灰色框部分文件,functional文件夹存放的是Testbench顶层以及系统时钟和复位生成文件,而tests文件夹则存放了用户层测试激励(体现与图1右侧的“Test Program”),这些激励都是usrapp_tx发起。下面会试着详细介绍图1中的几个灰框里的文件,主要是usr_app_rx和usr_app_tx以及Test Program。


dsport(downstream port)

这个模块主要实现root complex,Xilinx一直强调这个模块不能看成是严格的root complex,因为它并不能提供真正root complex提供的很多特性,只是方便用户仿真而创建的模型。用户侧的endpoint经PCIe链路发送TLP到下行端口(downstream port)模型。


xapp1052里实现dsport的源文件主要应该是xilinx_pcie_2_1_rport_7x.v,pcie_2_1_rport_7x.v,而文件pci_exp_usrapp_cfg.v用来对DS模型进行配置。


RX_APP(pci_exp_usrapp_rx.v)

在RX_APP可能主要定义了解析接收用户接口状态机。该状态机的状态变量如下:


 /* State variables */ `define TRN_RX_RESET 5'b00001 `define TRN_RX_DOWN 5'b00010 `define TRN_RX_IDLE 5'b00100 `define TRN_RX_ACTIVE 5'b01000 `define TRN_RX_SRC_DSC 5'b10000

TX_APP(pci_exp_usrapp_tx.v)


usrapp_tx为PCIe链路两端的数据传输,发送TLP到dsport模块。包解析或测试程序由usrapp_tx启动,用于仿真endpoint接口。所有测试程序都是实现定义好的,存放在上述tests文件夹下的文件之中(tests.vh)。在usrapp_tx源文件中直接调用tests.vh

 //Test starts here if (testname == "dummy_test") begin $display("[%t] %m: Invalid TESTNAME: %0s", $realtime, testname); $finish(2); end `include "tests.vh" else begin $display("[%t] %m: Error: Unrecognized TESTNAME: %0s", $realtime, testname); $finish(2); end

而在tests.vh文件中则通过include语句将存放测试程序的源文件包括进来,Xilinx提供很多事先定义好的测试程序,但是在xapp1052示例中的sample_tests1.vh仅提供了三个测试程序,它们分别是sample_smoke_test0,sample_smoke_test1以及pio_writeReadBack_test0。


sample_smoke_test0发起一个PCI Type0配置读TLP,并等待完成TLP;然后将返回值与预期的器件ID和供应商ID进行比较。


sample_smoke_test1执行和sample_smoke_test0一样的操作,但是使用了可预期任务程序。这个测试使用了两个独立的测试程序线程:一个线程发送PCI Type0配置读TLP,第二个线程提交一个带数据的完成报文TLP可预期任务。这个测试展示了使用可预期任务实现并行测试的结构。该测试可以用于确认从用户设计收到的任何TLP,也可以在当顺序不重要时确认收到的TLP。


pio_writeReadBack_test0测试程序先发送一个单DW写TLP,然后发送一个单DW读TLP;然后等待完成报文TLP,并验证读写数据是否一致。


不管测试程序要实现怎样的功能,都大致分为以下6个步骤:

  1. 执行条件比较特定的测试名称(比如确认当前测试是不是pio_writeReadBack_test0?或其它测试)
  2. 设置仿真退出时间,防止仿真进挂起
  3. 等待正常复位,以及链路链接(link-up)
  4. 初始化endpoint配置空间
  5. 在DS端口模型和endpoint直接发送和接收TLP
  6. 验证测试是否成功

pio_writeReadBack_test0


本节来看看pio_writeReadBack_test0测试程序里的具体代码
else if(testname == "pio_writeReadBack_test0")begin// This test performs a 32 bit write to a 32 bit Memory space and performs a read back//board.RP.tx_usrapp.TSK_SIMULATION_TIMEOUT(10050);board.RP.tx_usrapp.TSK_SIMULATION_TIMEOUT(20050);board.RP.tx_usrapp.TSK_SYSTEM_INITIALIZATION;board.RP.tx_usrapp.TSK_BAR_INIT;//--------------------------------------------------------------------------// Event : Testing BARs//--------------------------------------------------------------------------for (board.RP.tx_usrapp.ii = 0; board.RP.tx_usrapp.ii <= 6; board.RP.tx_usrapp.ii =board.RP.tx_usrapp.ii + 1) beginif (board.RP.tx_usrapp.BAR_INIT_P_BAR_ENABLED[board.RP.tx_usrapp.ii] > 2'b00) // bar is enabledcase(board.RP.tx_usrapp.BAR_INIT_P_BAR_ENABLED[board.RP.tx_usrapp.ii])2'b01 : // IO SPACEbegin$display("[%t] : Transmitting TLPs to IO Space BAR %x", $realtime, board.RP.tx_usrapp.ii);//--------------------------------------------------------------------------// Event : IO Write bit TLP//--------------------------------------------------------------------------board.RP.tx_usrapp.TSK_TX_IO_WRITE(board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0], 4'hF, 32'hdead_beef);board.RP.com_usrapp.TSK_EXPECT_CPL(3'h0, 1'b0, 1'b0, 2'b0,board.RP.tx_usrapp.COMPLETER_ID_CFG, 3'h0, 1'b0, 12'h4,board.RP.tx_usrapp.COMPLETER_ID_CFG, board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0], test_vars[0]);board.RP.tx_usrapp.TSK_TX_CLK_EAT(10);board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1;//--------------------------------------------------------------------------// Event : IO Read bit TLP//--------------------------------------------------------------------------// make sure P_READ_DATA has known initial valueboard.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff;forkboard.RP.tx_usrapp.TSK_TX_IO_READ(board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0], 4'hF);board.RP.tx_usrapp.TSK_WAIT_FOR_READ_DATA;joinif (board.RP.tx_usrapp.P_READ_DATA != 32'hdead_beef)begin$display("[%t] : Test FAILED --- Data Error Mismatch, Write Data %x != Read Data %x",$realtime, 32'hdead_beef, board.RP.tx_usrapp.P_READ_DATA);test_failed_flag = 1;endelsebegin$display("[%t] : Test PASSED --- Write Data: %x successfully received",$realtime, board.RP.tx_usrapp.P_READ_DATA);endboard.RP.tx_usrapp.TSK_TX_CLK_EAT(10);board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1;end2'b10 : // MEM 32 SPACEbegin$display("[%t] : Transmitting TLPs to Memory 32 Space BAR %x", $realtime,board.RP.tx_usrapp.ii);//--------------------------------------------------------------------------// Event : Memory Write 32 bit TLP//--------------------------------------------------------------------------board.RP.tx_usrapp.DATA_STORE[0] = 8'h04;board.RP.tx_usrapp.DATA_STORE[1] = 8'h03;board.RP.tx_usrapp.DATA_STORE[2] = 8'h02;board.RP.tx_usrapp.DATA_STORE[3] = 8'h01;board.RP.tx_usrapp.TSK_TX_MEMORY_WRITE_32(board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.DEFAULT_TC, 10'd1,// board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0]+8'h10, 4'h0, 4'hF, 1'b0);//Modified By Jerryboard.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0]+8'h08, 4'h0, 4'hF, 1'b0);board.RP.tx_usrapp.TSK_TX_CLK_EAT(10);board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1;//--------------------------------------------------------------------------// Event : Memory Read 32 bit TLP//--------------------------------------------------------------------------// make sure P_READ_DATA has known initial valueboard.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff;forkboard.RP.tx_usrapp.TSK_TX_MEMORY_READ_32(board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.DEFAULT_TC, 10'd1,//board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0]+8'h10, 4'h0, 4'hF);//Modified by Jerryboard.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0]+8'h08, 4'h0, 4'hF);board.RP.tx_usrapp.TSK_WAIT_FOR_READ_DATA;joinif (board.RP.tx_usrapp.P_READ_DATA != {board.RP.tx_usrapp.DATA_STORE[3],board.RP.tx_usrapp.DATA_STORE[2], board.RP.tx_usrapp.DATA_STORE[1],board.RP.tx_usrapp.DATA_STORE[0] })begin$display("[%t] : Test FAILED --- Data Error Mismatch, Write Data %x != Read Data %x",$realtime, {board.RP.tx_usrapp.DATA_STORE[3],board.RP.tx_usrapp.DATA_STORE[2],board.RP.tx_usrapp.DATA_STORE[1],board.RP.tx_usrapp.DATA_STORE[0]},board.RP.tx_usrapp.P_READ_DATA);test_failed_flag = 1;endelsebegin$display("[%t] : Test PASSED --- Write Data: %x successfully received",$realtime, board.RP.tx_usrapp.P_READ_DATA);endboard.RP.tx_usrapp.TSK_TX_CLK_EAT(10);board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1;end2'b11 : // MEM 64 SPACEbegin$display("[%t] : Transmitting TLPs to Memory 64 Space BAR %x", $realtime,board.RP.tx_usrapp.ii);//--------------------------------------------------------------------------// Event : Memory Write 64 bit TLP//--------------------------------------------------------------------------board.RP.tx_usrapp.DATA_STORE[0] = 8'h64;board.RP.tx_usrapp.DATA_STORE[1] = 8'h63;board.RP.tx_usrapp.DATA_STORE[2] = 8'h62;board.RP.tx_usrapp.DATA_STORE[3] = 8'h61;board.RP.tx_usrapp.TSK_TX_MEMORY_WRITE_64(board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.DEFAULT_TC, 10'd1,{board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii+1][31:0],board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0]+8'h20}, 4'h0, 4'hF, 1'b0);board.RP.tx_usrapp.TSK_TX_CLK_EAT(10);board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1;//--------------------------------------------------------------------------// Event : Memory Read 64 bit TLP//--------------------------------------------------------------------------// make sure P_READ_DATA has known initial valueboard.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff;forkboard.RP.tx_usrapp.TSK_TX_MEMORY_READ_64(board.RP.tx_usrapp.DEFAULT_TAG,board.RP.tx_usrapp.DEFAULT_TC, 10'd1,{board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii+1][31:0],board.RP.tx_usrapp.BAR_INIT_P_BAR[board.RP.tx_usrapp.ii][31:0]+8'h20}, 4'h0, 4'hF);board.RP.tx_usrapp.TSK_WAIT_FOR_READ_DATA;joinif (board.RP.tx_usrapp.P_READ_DATA != {board.RP.tx_usrapp.DATA_STORE[3],board.RP.tx_usrapp.DATA_STORE[2], board.RP.tx_usrapp.DATA_STORE[1],board.RP.tx_usrapp.DATA_STORE[0] })begin$display("[%t] : Test FAILED --- Data Error Mismatch, Write Data %x != Read Data %x",$realtime, {board.RP.tx_usrapp.DATA_STORE[3],board.RP.tx_usrapp.DATA_STORE[2], board.RP.tx_usrapp.DATA_STORE[1],board.RP.tx_usrapp.DATA_STORE[0]}, board.RP.tx_usrapp.P_READ_DATA);test_failed_flag = 1;endelsebegin$display("[%t] : Test PASSED --- Write Data: %x successfully received",$realtime, board.RP.tx_usrapp.P_READ_DATA);endboard.RP.tx_usrapp.TSK_TX_CLK_EAT(10);board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1;enddefault : $display("Error case in usrapp_tx\n");endcaseend$display("[%t] : Finished transmission of PCI-Express TLPs", $realtime);if (!test_failed_flag) begin$display ("Test Completed Successfully");end$finish;end

board.RP.tx_usrapp.TSK_SIMULATION_TIMEOUT(10050);


这一句设置了仿真推出的时间

board.RP.tx_usrapp.TSK_SYSTEM_INITIALIZATION;

这个函数让测试程序等待系统复位被释放,同时endpoint的trn_lnk_up_n信号被置位。这样就表示endpoint已经准备好通过DS端口模型被测试程序配置。

board.RP.tx_usrapp.TSK_BAR_INIT;

执行一系列对endpoint核PCI配置空间进行Type0 配置写和读,确认endpoint的存储器和IO需求,然后对endpoint的基地址寄存器(BARs)进行编程,这样确保可以从DS端口模型介绍TLP。

其实BARs空间初始化任务里同时调用了其它几个任务子程序:
 /************************************************************ Task : TSK_BAR_INIT Inputs : None Outputs : None Description : Initialize PCI core based on core's configuration. *************************************************************/ task TSK_BAR_INIT; begin TSK_BAR_SCAN; TSK_BUILD_PCIE_MAP; TSK_DISPLAY_PCIE_MAP; TSK_BAR_PROGRAM; end endtask // TSK_BAR_INIT
首先我们来看子程序TSK_BAR_SCAN,该子程序对6个Bar和一个扩展ROM Bar通过Type0配置读写进行配置,下面列出了BAR0的配置读写:
 // Determine Range for BAR0 TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h10, P_ADDRESS_MASK, 4'hF); DEFAULT_TAG = DEFAULT_TAG + 1; TSK_TX_CLK_EAT(100); // Read BAR0 Range TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h10, 4'hF); DEFAULT_TAG = DEFAULT_TAG + 1; TSK_WAIT_FOR_READ_DATA; BAR_INIT_P_BAR_RANGE[0] = P_READ_DATA;
具体仿真结果是:

图3:TSK_TX_SYNCHRONIZE

这个子程序的主要功能是同步trn_clk和trn_tdst_rdy_n信号。当一个TLP被发送之前,必须等待trn_clk的上升沿和trn_tdst_rdy_n被置位。在这个子程序之中调用了子程序TSK_READ_DATA_128和TSK_PARSE_FRAME,主要用意是输出log信息到tx.dat文件中。


作者:coyoo, 来源:面包板社区链接:https://www.mianbaoban.cn/blog/uid-me-1010859.html版权声明:本文为博主原创,未经本人允许,禁止转载!


↓↓ 点击"阅读原文"申请试读 ↓↓


------------------------

与工程师一起改变世

面包板社区 面包板社区——中国第一电子人社交平台 面包板社区是Aspencore旗下媒体,整合了电子工程专辑、电子技术设计、国际电子商情丰富资源。社区包括论坛、博客、问答,拥有超过250万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 128浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 80浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 59浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 70浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 76浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 123浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 102浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 98浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 115浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 129浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 127浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 89浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 177浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 109浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦