tag 标签: 仿真

相关帖子
相关博文
  • 热度 1
    2019-10-6 20:58
    304 次阅读|
    1 个评论
    下载链接:https://pan.baidu.com/s/1E3d-7gOlbLES117GC54-5Q 提取码:w9xv ​
  • 热度 5
    2019-8-8 15:19
    901 次阅读|
    0 个评论
    创建PCIe空间映射子函数
    BAR初始化第一步,即BAR_SCAN子函数了解完了,下面我们了解初始化第二步,即TSK_BUILD_PCIE_MAP函数。再次复习下BAR初始化步骤( 在TSK_BAT_INIT任务里面其实是在模拟BIOS和驱动程序的操作,首先会对BAR寄存器进行赋值,然后会对BAR指向的设备内存进行IO或者mem映射,最后就是对设备的配置寄存器的参数写入。 ): /************************************************************ 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_BUILD_PCIE_MAP源代码有点长,这里就不贴了。其主要目的就是执行存储器或I/O映射算法,并依据Endpoint需求分配Memory 32、Memory 64和I/O空间。具体来说,就是根据上一步 TSK_BAR_SCAN得到的各个BAR的range变量,检查这些range,根据检查结果,判断每个BAR是否被使能、及其对应的映射结果(是MEM32啊还是MEM64啊,或者是I/O空间)。仿真的时候会将检查结果打印如下: 注 :函数 TSK_BUILD_PCIE_MAP在检查正常的时候只会打印上图中的第一句;下面每个BAR空间的检查结果,是在调用函数TSK_DISPLAY_PCIE_MAP的时候打印的。 BAR空间初始化最后一步,看似就是将之前读回的BAR状态重新使用Type0配置写再写回去( 这里应该对应应用程序里的BAR空间基地址的产生,电脑开机扫描获取PCIe的各个BAR的信息,为它们分配地址空间,这里的Program应该是将分配好的地址空间基地址重新写回到BAR寄存器 ),比如对BAR0的写: // Program BAR0 TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h10, BAR_INIT_P_BAR , 4'hF); DEFAULT_TAG = DEFAULT_TAG + 1; TSK_TX_CLK_EAT(100); 这个子函数还对其它BAR空间进行Type0配置写,个人觉得,其它BAR空间都Disable了,写不写都无所谓。值得注意的时候,该子函数最后还对PCI命令寄存器和PCIe器件控制寄存器进行了编程: // Program PCI Command Register TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h04, 32'h00000003, 4'h1); DEFAULT_TAG = DEFAULT_TAG + 1; TSK_TX_CLK_EAT(100); // Program PCIe Device Control Register TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h68, 32'h0000005f, 4'h1); DEFAULT_TAG = DEFAULT_TAG + 1; TSK_TX_CLK_EAT(1000); 注意上述两次写和BAR0写的区别,比如最后一个参数为4‘h1,则表示只有最低字节被Enable了,即只需传递低8位即可。 了解完BAR空间的初始化,后面开始了解正常的PIO仿真,即存储器写和存储器读。
  • 热度 4
    2019-8-8 14:46
    671 次阅读|
    0 个评论
    Type0配置写函数
    在前面了解PCI配置空间、TLP以及Type0配置读的基础上,本文介绍Type0配置写子函数。该子函数产生一个Type0配置写TLP,先来看具体代码: /************************************************************ Task : TSK_TX_TYPE0_CONFIGURATION_WRITE Inputs : Tag, PCI/PCI-Express Reg Address, First BypeEn Outputs : Transaction Tx Interface Signaling Description : Generates a Type 0 Configuration Write TLP *************************************************************/ task TSK_TX_TYPE0_CONFIGURATION_WRITE; input tag_; input reg_addr_; input reg_data_; input first_dw_be_; begin if (trn_lnk_up_n) begin $display(" : Trn interface is MIA", $realtime); $finish(1); end TSK_TX_SYNCHRONIZE(0, 0, 0); trn_td <= #(Tcq) { 1'b0, 2'b10, 5'b00100, 1'b0, 3'b000, 4'b0000, 1'b0, 1'b0, 2'b00, 2'b00, 10'b0000000001, // 32 COMPLETER_ID_CFG, tag_, 4'b0000, first_dw_be_, // 64 COMPLETER_ID_CFG, 4'b0000, reg_addr_ , 2'b00, // 32 reg_data_ , reg_data_ , reg_data_ , reg_data_ // 64 }; trn_tsof_n <= #(Tcq) 0; trn_teof_n <= #(Tcq) 0; trn_trem_n <= #(Tcq) 2'b00; trn_tsrc_rdy_n <= #(Tcq) 0 ; TSK_TX_SYNCHRONIZE(1, 1, 1); trn_tsof_n <= #(Tcq) 1; trn_teof_n <= #(Tcq) 1; trn_trem_n <= #(Tcq) 2'b00; trn_tsrc_rdy_n <= #(Tcq) 1; end endtask // TSK_TX_TYPE0_CONFIGURATION_WRITE 有了对Type0配置读的了解,那么理解上面的代码就容易很多了,TLP前面32bit和配置读一样,唯一的区别在于TLP最后32bit带了1DW的写数据。写数据通过函数第三个参数调用的时候引入。 需要注意的是,上述代码中两次调用了函数 TSK_TX_SYNCHRONIZE,第一次调用( TSK_TX_SYNCHRONIZE(0, 0, 0); ),只是为了同步trn_clk和trn_tdst_rdyn_n,之后TLP信息被赋值给trn_td。第二次调用( TSK_TX_SYNCHRONIZE(1, 1, 1); )是为了同步信号,也是为了将TLP信息添加到本地buffer,并最终发送到输出log。也就是说,我们在仿真的时候看到很多下图所示的信息都是第二次调用函数 TSK_TX_SYNCHRONIZE的时候处理,第二次调用除了在仿真的时候的打印输出下图所示的信息外,还将TLP信息Log到输出文件(tx.dat和rx.dat) 这里有个疑问是在TSK_BAR_SCAN函数中,对每个BAR先使用Type配置写,写入的数据是”P_ADDRESS_MASK = 32'hffff_ffff;“,源代码给出的注释是对BAR空间写PCI_MASK来找到range。接着使用Type0配置读刚刚被写入MASK值的BAR空间,读回的数据保存在BAR_INIT_P_BAR_RANGE 里,也就是所谓“ 找到range ”。我的问题是,为什么对BAR空间写入MASK后,再对其进行type0读就可以得到range?
  • 热度 4
    2019-8-7 13:38
    1727 次阅读|
    2 个评论
    Xilinx的PCIe仿真模型学习
    使用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(" %m: Invalid TESTNAME: %0s", $realtime, testname); $finish(2); end `include "tests.vh" else begin $display(" %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个步骤: 执行条件比较特定的测试名称(比如确认当前测试是不是 pio_writeReadBack_test0?或其它测试) 设置仿真退出时间,防止仿真进挂起 等待正常复位,以及链路链接(link-up) 初始化endpoint配置空间 在DS端口模型和endpoint直接发送和接收TLP 验证测试是否成功 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) begin 2'b00) // bar is enabled case(board.RP.tx_usrapp.BAR_INIT_P_BAR_ENABLED ) 2'b01 : // IO SPACE begin $display(" : 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 , 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 , test_vars ); 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 value board.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff; fork board.RP.tx_usrapp.TSK_TX_IO_READ(board.RP.tx_usrapp.DEFAULT_TAG, board.RP.tx_usrapp.BAR_INIT_P_BAR , 4'hF); board.RP.tx_usrapp.TSK_WAIT_FOR_READ_DATA; join if (board.RP.tx_usrapp.P_READ_DATA != 32'hdead_beef) begin $display(" : 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; end else begin $display(" : Test PASSED --- Write Data: %x successfully received", $realtime, board.RP.tx_usrapp.P_READ_DATA); end board.RP.tx_usrapp.TSK_TX_CLK_EAT(10); board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1; end 2'b10 : // MEM 32 SPACE begin $display(" : 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 = 8'h04; board.RP.tx_usrapp.DATA_STORE = 8'h03; board.RP.tx_usrapp.DATA_STORE = 8'h02; board.RP.tx_usrapp.DATA_STORE = 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 +8'h10, 4'h0, 4'hF, 1'b0);//Modified By Jerry board.RP.tx_usrapp.BAR_INIT_P_BAR +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 value board.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff; fork board.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 +8'h10, 4'h0, 4'hF);//Modified by Jerry board.RP.tx_usrapp.BAR_INIT_P_BAR +8'h08, 4'h0, 4'hF); board.RP.tx_usrapp.TSK_WAIT_FOR_READ_DATA; join if (board.RP.tx_usrapp.P_READ_DATA != {board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE }) begin $display(" : Test FAILED --- Data Error Mismatch, Write Data %x != Read Data %x", $realtime, {board.RP.tx_usrapp.DATA_STORE ,board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE ,board.RP.tx_usrapp.DATA_STORE }, board.RP.tx_usrapp.P_READ_DATA); test_failed_flag = 1; end else begin $display(" : Test PASSED --- Write Data: %x successfully received", $realtime, board.RP.tx_usrapp.P_READ_DATA); end board.RP.tx_usrapp.TSK_TX_CLK_EAT(10); board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1; end 2'b11 : // MEM 64 SPACE begin $display(" : 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 = 8'h64; board.RP.tx_usrapp.DATA_STORE = 8'h63; board.RP.tx_usrapp.DATA_STORE = 8'h62; board.RP.tx_usrapp.DATA_STORE = 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.BAR_INIT_P_BAR +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 value board.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff; fork board.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.BAR_INIT_P_BAR +8'h20}, 4'h0, 4'hF); board.RP.tx_usrapp.TSK_WAIT_FOR_READ_DATA; join if (board.RP.tx_usrapp.P_READ_DATA != {board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE }) begin $display(" : Test FAILED --- Data Error Mismatch, Write Data %x != Read Data %x", $realtime, {board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE , board.RP.tx_usrapp.DATA_STORE }, board.RP.tx_usrapp.P_READ_DATA); test_failed_flag = 1; end else begin $display(" : Test PASSED --- Write Data: %x successfully received", $realtime, board.RP.tx_usrapp.P_READ_DATA); end board.RP.tx_usrapp.TSK_TX_CLK_EAT(10); board.RP.tx_usrapp.DEFAULT_TAG = board.RP.tx_usrapp.DEFAULT_TAG + 1; end default : $display("Error case in usrapp_tx\n"); endcase end $display(" : 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 = 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文件中。
  • 热度 2
    2019-8-5 16:49
    632 次阅读|
    0 个评论
    仿真Xilinx的PCIe时使用pio_writeReadBack_test0测试问题分析
    Xilinx的参考设计仿真给出RP模型下3个测试函数,前两个仿真都通过,只有pio_writeReadBack_test0测试默认的MEM32写和读回的时候,写入和读回的数据不匹配,写入32b'04030201,读回来的却是32b'04030200。 如上图所示,RP发送32b'01020304到EP,并读回,EP也能正确收到该值。然后,在EP返回的时候,却变成了32b’04030200(注:自己颠倒是正常了,问题出在字节“01”变成了“00”)。如下图所示,RP确实收到是32b'00020304。 这个问题最终的解决,可以参考博文https://www.mianbaoban.cn/blog/1010859-407798.html,在比较BMD128和BMD64的时候,发现相同MEM32写+读回操作,Xilinx给出的基于K7系列参考设计测试激励发送的addr_i是“4”,而在BMD64模式下,该值是“2”。请对照上述博文中128与64位的仿真时序图查找addr_i值,这个参数在BMD_EP_MEM.v中用于解码不同的功能,在“2”时,对应MEM32写的值直接赋值到MEM32读的数据,所以如此仿真才会Test Passed,写入和读回的值相同。 我是修改测试激励中读写操作对应参数,使得addr_i得到一个“2”,问题是该测试激励是一直继承下来,根本解决方法应该不是修改测试激励,这个需要Xilinx给出答复。具体修改如下,一共需要修改2处,分别是MEM32写和MEM读,将“+8‘h10”修改为“+8’h08” //board.RP.tx_usrapp.BAR_INIT_P_BAR +8'h10, 4'h0, 4'hF);//Modified by Jerry board.RP.tx_usrapp.BAR_INIT_P_BAR +8'h08, 4'h0, 4'hF);
相关资源
  • 所需E币: 4
    时间: 2019-12-26 01:27
    大小: 110.45KB
    上传者: 2iot
    在简单介绍算术编码和自适应算术编码的基础上,介绍了利用FPGA器件并通过VHDL语言描述实现自适应算术编码的过程。整个编码系统在LTERA公司的MAX+plusⅡ软件上进行了编译仿真,测试结果表明:编码器各个模块的设计在速度和资源利用两方面均达到了较优的状态,可以满足实时编码的要求。……
  • 所需E币: 5
    时间: 2019-12-26 01:06
    大小: 6.58KB
    上传者: rdg1993
    插入导频法载波同步仿真……
  • 所需E币: 4
    时间: 2019-12-26 00:47
    大小: 129.47KB
    上传者: 978461154_qq
    Proteus仿真软件在单片机设计中的应用……
  • 所需E币: 4
    时间: 2019-12-25 23:00
    大小: 191.54KB
    上传者: 978461154_qq
    针对每个码元符号内有整数个扩频码周期序列的BPSK直扩系统,以时域分析为基础,详细推导了单频干扰在直扩系统中的误码率,讨论了单频干扰的误码性能,并在MATLAB环境下进行了仿真,得到了一些有用的结论。……
  • 所需E币: 5
    时间: 2019-12-25 22:46
    大小: 159.04KB
    上传者: 238112554_qq
    为了实现移动机器人越障运动过程的仿真,运用机械系统仿真软件ADAMS,构建虚拟传感器并编写脚本仿真程序。实例分析表明,基于脚该控制,可以完成复杂运动的仿真。通过三维动画既可以观察移动机器人越障运动过程,同时还可绘制仿真曲线,观察运动过程中可能出现的问题。……
  • 所需E币: 5
    时间: 2019-12-25 22:03
    大小: 259.5KB
    上传者: 二不过三
    本文档介绍了如何把ASM格式文件导入KEIL中进行编译和仿真。……
  • 所需E币: 5
    时间: 2019-12-25 21:58
    大小: 247.42KB
    上传者: 978461154_qq
    Mostapplicationsthatpresentdataonadisplayterminal,processandmanipulatethatdatainitsdigitalformbeforeconvertingitintotherecognizableanalogformthatappearsonthescreen.Devicessuchasvideocameras,infraredsensors,etc.receiveinformationasananalogsignal,convertitintodigitalformforprocessing,andthenreconvertittoanalogformfordisplay.……
  • 所需E币: 4
    时间: 2019-12-25 21:10
    大小: 143.5KB
    上传者: 978461154_qq
    单片机应用技术所涉及到的实验实践环节比较多,而且硬件投入比较大。在具体的工程实践中,如果因为方案有误而进行相应的开发设计,会浪费较多的时间和经费。本文以学校单片机课程的实验教学为背景,较为全面地阐述采用仿真实验的方法。……
  • 所需E币: 4
    时间: 2019-12-25 20:43
    大小: 120.9KB
    上传者: 二不过三
    仿真现实世界和设计实时应用的工具……
  • 所需E币: 4
    时间: 2019-12-28 21:05
    大小: 135.98KB
    上传者: 微风DS
    『GetOverIt』晶体管模拟电感电路,电路的Multisim仿真源文件,Multisim版本为10.0.144……
  • 所需E币: 4
    时间: 2019-12-28 21:35
    大小: 334.15KB
    上传者: 微风DS
    阐述了集群虚拟服务器的工作原理和三种负载均衡方式,通过实例讨论了虚拟服务器的仿真和建模方法,创建了测试和仿真系统性能的输入和系统模型,并依据Q-Q图和累积分布函数校验了其概率分布.……
  • 所需E币: 5
    时间: 2019-12-28 21:40
    大小: 1.34MB
    上传者: givh79_163.com
    DXP新手使用教程……
  • 所需E币: 3
    时间: 2019-12-28 21:42
    大小: 131.43KB
    上传者: 二不过三
    针对典型的BoostZCT-PWM变换器中存在的主开关管并非零电流开通的问题,对原有电路做了改进,提出了一种新的拓扑结构和控制方法,实现了主开关管的零电流开通和关断,改善了变换器的工作状况,降低了开通损耗.仿真结果表明,这种新型的改进电路确实达到了预期的效果.I电源攮求与谴用一一rsuppf,M删吲。刚∽p“嘲。一种新型韵BOOSTzCT―PWM变换器薄传海,李良光,汪舒生(安徽理工大学,安徽淮南232001)摘要:针对典型的BoostZCT―PwM变换器中存在的主开关管并非零电流开通的问题,对原有电路做了改进,提出了一种新的拓扑结构和控制方法,实现了主开关管的零电流开通和关断,改善了受换器的工作状况,降低了开通损耗。仿真结果表明,这种新型的改进电路确实达到了预期的效果。关键词:变换器脒宽调制软开关仿真AnimpmVedcircuitofb00stZCT―PWMconverterBOChuanHal,LI“angGua“g,WANGShuShe“g……
  • 所需E币: 4
    时间: 2019-12-25 16:50
    大小: 744.87KB
    上传者: 16245458_qq.com
    静态时序分析(StaticTimingAnalysis)基础及应用静态时序分析(StaticTimingAnalysis)基础及应用◎陈麒旭前言在制程进入深次微米世代之后,芯片(IC)设计的高复杂度及系统单芯片(SOC)设计方式兴起。此一趋势使得如何确保IC质量成为今日所有设计从业人员不得不面临之重大课题。静态时序分析(StaticTimingAnalysis简称STA)经由完整的分析方式判断IC是否能够在使用者的时序环境下正常工作,对确保IC质量之课题,提供一个不错的解决方案。然而,对于许多IC设计者而言,STA是个既熟悉却又陌生的名词。本文将力求以简单叙述及图例说明的方式,对STA的基础概念及其在IC设计流程中的应用做详尽的介绍。什么是STA?STA的简单定义如下:套用特定的时序模型(TimingModel),针对特定电路分析其是否违反设计者给定的时序限制(TimingConstraint)。以分析的方式区分,可分为Path-Based及Block-Based两种。先来看看Path-Based这种分析方式。如图一所示,信号从A点及B点输入,经由4个逻辑闸组成的电路到达输出Y点。套用的TimingModel标示在各逻辑闸上,对于所有输入端到输出端都可以找到相对应的延迟时间。而使用者给定的TimingConstraint为:1.信号A到达电路输入端的时间点为2(AT=2,AT为ArrivalTime)。2.信号B到达电路输入端的时间点为5(AT=5)。3.信号必须在时间点10之前到达输出端Y(RT=10,RT为Req……
  • 所需E币: 3
    时间: 2019-12-25 16:43
    大小: 24.22MB
    上传者: wsu_w_hotmail.com
    KeilC51是目前世界上最好的51单片机的汇编和c语言的开发工具。支持汇编,c语言以及混合编程。同时具备功能强大的软件仿真和硬件仿真(用mon51协议)。版本号v8.02开发平台,uv版本:uv3.30,评估版,有2k代码的大小限制。单片机开发必备软件。安装方法:点击c51v802.exe直接安装直到结束,安装路径最好选用默认的c:\keil……
  • 所需E币: 4
    时间: 2019-12-25 16:35
    大小: 909.84KB
    上传者: wsu_w_hotmail.com
    AlteraQuartusII用户指南QuartusII用户指南2001AlteraCorporation1设计描述设计输入设计修改设计编译功能确认命令行模式脚本延时确认器件编程在线确认生产2001AlteraCorporation2设计输入!多种设计输入方法……
  • 所需E币: 3
    时间: 2019-12-25 15:59
    大小: 7.84MB
    上传者: 978461154_qq
    qurtues-II中文教程QuartusII简介AlteraCorporation101InnovationDriveSanJose,CA95134(408)544-7000www.altera.comQuartusII简介版本5.0第一次修订2005年4月P25-09235-04Altera、Altera标识、FastTrack、HardCopy、MAX、MAX+PLUS、MAX+PLUSII、MegaCore、MegaWizard、NativeLink、Nios、OpenCore、Quartus、QuartusII、QuartusII标识和SignalTap是Altera公司在美国和其它国家的注册商标。Avalon、ByteBlaster、ByteBlasterMV、Cyclone,Excalibur,IPMegaStore,Jam,LogicLock,MasterBlaster,MegaLAB,PowerFit,SignalProbe,Stratix和USB-Blaster是Altera公司在美国和其它国家的商标以及服务标志。Altera公司使用的产品设计单元和助记符受版权法以及商标法的保护。Altera公司承认本文档提及的其它组织的产品或商标以及服务标志,特别是:ARM是注册商标,AMBA是ARM公司的商标。Mento……
  • 所需E币: 4
    时间: 2019-12-25 15:55
    大小: 2.63MB
    上传者: 16245458_qq.com
    QuartusII简介6.0中文版QuartusII简介6.0版AlteraCorporation101InnovationDriveSanJose,CA95134(408)544-7000www.altera.comQuartusII简介6.0版2006年3月P25-09235-05Altera、Altera标识、FastTrack、HardCopy、MAX、MAX+PLUS、MAX+PLUSII、MegaCore、MegaWizard、NativeLink、Nios、OpenCore、Quartus、QuartusII、QuartusII标识和SignalTap是Altera公司在美国和其它国家的注册商标。Avalon、ByteBlaster、ByteBlasterMV、Cyclone、Excalibur、IPMegaStore、Jam、LogicLock、MasterBlaster、MegaLAB、PowerFit、SignalProbe、Stratix和USB-Blaster是Altera公司在美国和其它国家的商标以及服务标志。Altera公司使用的产品设计单元和助记符受版权法以及商标法的保护。Altera公司承认本文档提及的其它组织的产品或商标以及服务标志,特别是:ARM是注册商标,AMBA是ARM公司的商标。MentorGraphics和ModelS……
  • 所需E币: 3
    时间: 2019-12-25 15:33
    大小: 200.26KB
    上传者: 978461154_qq
    针对319卷积编码,提出一种Viterbi译码器的FPGA实现方案.该方案兼顾了资源消耗和译码效率,通过有效的时钟和存储介质复用,实现了高速并行的译码功能,并利用Verilog语言在XilinxISE6.2中进行了建模仿真和综合实现.基于FPGA的高速并行Viterbi译码器的设计与实现童琦,何洪路,吴明森(中国科学院上海微系统与信息技术研究所,上海200050)摘要:针对319卷积编码,提出一种Viterbi译码器的FPGA实现方案。该方案兼顾了资源消耗和译码效率,通过有效的时钟和存储介质复用,实现了高速并行的译码功能,并利用Verilog语言在Xil-inxIsE6.2中进行了建模仿真和综合实现。关键词:Viterbi译码路径值回溯数字通信中,降低数据传输的误码率及提高通信质量是关键问题。为了避免通信过程中的突发错误,常常引入卷积码。卷积码的译码方式中,viterbi译码是一种最大似然译码算法,与序列译码算法相比具有译码效率高、速度快及译码器实现结构简单的优点,是一种有效的前向纠错方法。传统的Viterbi译码方法,译码需要存储的路径值等信息均随约束长度成指数增长【l】,且受到硬件水平的限制,不可能实现较高码率的译码。随着微电子技术的发展、可编L―.。.―.――――。―――――――l程器件的广泛使用、开发工具的逐渐完善,以及在此基图1并行译码器结构图础上算法的研究改进,更高码率的译码实现成为可能。……
  • 所需E币: 4
    时间: 2019-12-25 15:32
    大小: 229.38KB
    上传者: 二不过三
    一种基于DSP的视觉焊缝识别系统.采用ADSP21160实现了焊接图像焊缝识别算法,满足了信号实时处理的要求.・应用系统DSP在焊缝识别系统中的应用蔡志勇1’2,胡保安1,余伏章2,陈荣1(1.南昌大学信息工程学院电子系,江西南昌330029;2.洪都集团飞机设计所,江西南昌330024)摘要:一种基于DSP的视觉焊缝识别系统。采用ADSP21160实现了焊接图像焊缝识别算法,满足了信号实时处理的要求。关键词:焊缝识别系统ADSP21160焊缝识别算法仿真运算以工控机为核心的计算机视觉焊缝识别系统,虽然视频lI前级FLASH技术成熟,但其组成复杂(由工控机、图像采集卡、I,O卡DEcoDE卜-叫视频加载和显示器等器件组成),其抗振动和抗冲击能力差,不利KS0127l兀F0于外场使用。焊缝识别技术研究的目的是实现焊缝自动跟踪。受工控机的处理器限制,工控机处理一幅焊接图像一般需要100ms左右。当焊缝自动跟踪……
广告