tag 标签: if

相关博文
  • 热度 22
    2016-3-30 20:56
    1612 次阅读|
    5 个评论
    这是刚开始学习FPGA时候,积累的一点资料。 具体如下,其实作者强调了在用FPGA做设计的时候,要注意同步设计,盲目的使用 信号做时钟,在时序分析上有很大问题,隐含着很大风险。   来到本论坛后发现一些同仁提出上升沿和下降沿计数的问题,工作中也碰到一些同事问及此问题。现在我把我多年来一直采用的办法奉上,但愿对初学者有所帮助。 以一个最简单的计数器为例: Port(       clock:in  std_logic;       pulse:in  std_logic;       q:    out std_logic_vector(3 downto 0)     ); --q输出为对pulse跳变沿的递增计数。clock为系统高速时钟。 Process(clock) begin   if rising_edge(clock) then     dly1pul = pulse;     dly2pul = dly1pul;   end if; End process; en = dly1pul and not dly2pul;  --上升沿 --en = not dly1pul and dly2pul;--下降沿 --en = dly1pul xor dly2pul;    --上升沿和下降沿 Process(clock) begin   if rising_edge(clock) then     if en = '1' then       cnt = cnt + 1;     end if;   end if; End process; q = cnt;   我看到的一些设计中,动辄采用某一信号作为时钟,应该说这种做法是欠妥的。因为不是全局时钟的时钟信号最大扇出是有限的,其很难保证时钟延时应小于信号延时的基本要求。当遇到要对某个信号的跳变沿处理时,建议采用上述小例子中en信号的处理办法。  
  • 热度 23
    2014-9-16 11:25
    1849 次阅读|
    0 个评论
      #include stdio.h   int main(void) {     union{         short s;         char c ;     }un;       un.s = 0x0102;     //printf("%s: ", CPU_VENDOR_OS);       if (sizeof(short) == 2){         if (un.c == 1 un.c == 2)             printf("big-endian\n");         else if (un.c == 2 un.c == 1)             printf("little-endian\n");         else             printf("unknow\n");     } else         printf("sizeof(short) = %d\n", sizeof(short));       return 0; }
  • 热度 18
    2014-9-4 19:01
    1739 次阅读|
    0 个评论
      6.3.2 软件跟踪 假如U-Boot没有任何串口打印信息,手头又没有硬件调试工具,那样怎么知道U-Boot执行到什么地方了呢?可以通过开发板上的LED指示灯判断。 开发板上最好设计安装八段数码管等LED,可以用来显示数字或者数字位。 U-Boot可以定义函数show_boot_progress (int status),用来指示当前启动进度。在include/common.h头文件中声明这个函数。   #ifdef CONFIG_SHOW_BOOT_PROGRESS void    show_boot_progress (int status); #endif   CONFIG_SHOW_BOOT_PROGRESS是需要定义的。这个在板子配置的头文件中定义。CSB226开发板对这项功能有完整实现,可以参考。在头文件include/configs/csb226.h中,有下列一行。   #define CONFIG_SHOW_BOOT_PROGRESS       1   函数show_boot_progress (int status)的实现跟开发板关系密切,所以一般在board目录下的文件中实现。看一下CSB226在board/csb226/csb226.c中的实现函数。   /** 设置CSB226板的0、1、2三个指示灯的开关状态  * csb226_set_led: - switch LEDs on or off  * @param led:   LED to switch (0,1,2)  * @param state: switch on (1) or off (0)  */ void csb226_set_led(int led, int state) {       switch(led) {              case 0: if (state==1) {                               GPCR0 |= CSB226_USER_LED0;                     } else if (state==0) {                             GPSR0 |= CSB226_USER_LED0;                     }                     break;              case 1: if (state==1) {                               GPCR0 |= CSB226_USER_LED1;                     } else if (state==0) {                               GPSR0 |= CSB226_USER_LED1;                     }                     break;              case 2: if (state==1) {                               GPCR0 |= CSB226_USER_LED2;                   } else if (state==0) {                           GPSR0 |= CSB226_USER_LED2;                   }                   break;       }       return; } /** 显示启动进度函数,在比较重要的阶段,设置三个灯为亮的状态(1, 5, 15)*/ void show_boot_progress (int status) {       switch(status) {             case  1: csb226_set_led(0,1); break;             case  5: csb226_set_led(1,1); break;             case 15: csb226_set_led(2,1); break;       }       return; }   这样,在U-Boot启动过程中就可以通过show_boot_progresss指示执行进度。比如hang()函数是系统出错时调用的函数,这里需要根据特定的开发板给定显示的参数值。   void hang (void) {       puts ("### ERROR ### Please RESET the board ###\n"); #ifdef CONFIG_SHOW_BOOT_PROGRESS       show_boot_progress(-30); #endif       for (;;); } 6.3.3  U-Boot启动过程 尽管有了调试跟踪手段,甚至也可以通过串口打印信息了,但是不一定能够判断出错原因。如果能够充分理解代码的启动流程,那么对准确地解决和分析问题很有帮助。 开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。函数调用顺序如图6.3所示。 看一下board/smsk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于这个程序中。下面详细分析一下程序跳转和函数的调用关系以及函数实现。 1.cpu/arm920t/start.S 这个汇编程序是U-Boot的入口程序,开头就是复位向量的代码。 图6.3  U-Boot启动代码流程图   _start: b       reset        //复位向量        ldr   pc, _undefined_instruction        ldr   pc, _software_interrupt        ldr   pc, _prefetch_abort        ldr   pc, _data_abort        ldr   pc, _not_used        ldr   pc, _irq      //中断向量        ldr   pc, _fiq      //中断向量 …  /* the actual reset code  */ reset:          //复位启动子程序        /* 设置CPU为SVC32模式 */        mrs   r0,cpsr        bic   r0,r0,#0x1f        orr   r0,r0,#0xd3        msr   cpsr,r0 /* 关闭看门狗 */   /* 这些初始化代码在系统重起的时候执行,运行时热复位从RAM中启动不执行 */ #ifdef CONFIG_INIT_CRITICAL        bl    cpu_init_crit #endif   relocate:                       /* 把U-Boot重新定位到RAM */        adr   r0, _start          /* r0是代码的当前位置 */        ldr   r1, _TEXT_BASE      /* 测试判断是从Flash启动,还是RAM */        cmp     r0, r1          /* 比较r0和r1,调试的时候不要执行重定位 */        beq     stack_setup    /* 如果r0等于r1,跳过重定位代码 */        /* 准备重新定位代码 */        ldr   r2, _armboot_start        ldr   r3, _bss_start        sub   r2, r3, r2          /* r2 得到armboot的大小   */        add   r2, r0, r2          /* r2 得到要复制代码的末尾地址 */ copy_loop: /* 重新定位代码 */        ldmia r0!, {r3-r10}   /*从源地址 复制 */        stmia r1!, {r3-r10}   /* 复制到目的地址 */        cmp   r0, r2          /* 复制数据块直到源数据末尾地址 */        ble   copy_loop          /* 初始化堆栈等    */ stack_setup:        ldr   r0, _TEXT_BASE              /* 上面是128 KiB重定位的u-boot */        sub   r0, r0, #CFG_MALLOC_LEN     /* 向下是内存分配空间 */        sub   r0, r0, #CFG_GBL_DATA_SIZE /* 然后是bdinfo结构体地址空间  */ #ifdef CONFIG_USE_IRQ        sub   r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) #endif        sub   sp, r0, #12     /* 为abort-stack预留3个字 */ clear_bss:        ldr   r0, _bss_start      /* 找到bss段起始地址 */        ldr   r1, _bss_end        /*  bss段末尾地址   */        mov   r2, #0x00000000     /* 清零 */ clbss_l:str r2,        /* bss段地址空间清零循环...  */        add   r0, r0, #4        cmp   r0, r1        bne   clbss_l        /* 跳转到start_armboot函数入口,_start_armboot字保存函数入口指针 */        ldr   pc, _start_armboot _start_armboot: .word start_armboot     //start_armboot函数在lib_arm/board.c中实现 /* 关键的初始化子程序 */ cpu_init_crit: ……  //初始化CACHE,关闭MMU等操作指令        /* 初始化RAM时钟。        * 因为内存时钟是依赖开发板硬件的,所以在board的相应目录下可以找到memsetup.S文件。        */        mov   ip, lr        bl    memsetup        //memsetup子程序在board/smdk2410/memsetup.S中实现        mov   lr, ip        mov   pc, lr   2.lib_arm/board.c start_armboot是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令。     void start_armboot (void) {        DECLARE_GLOBAL_DATA_PTR;        ulong size;        init_fnc_t **init_fnc_ptr;        char *s;        /* Pointer is writable since we allocated a register for it */        gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));        /* compiler optimization barrier needed for GCC = 3.4 */        __asm__ __volatile__("": : :"memory");        memset ((void*)gd, 0, sizeof (gd_t));        gd-bd = (bd_t*)((char*)gd - sizeof(bd_t));        memset (gd-bd, 0, sizeof (bd_t));        monitor_flash_len = _bss_start - _armboot_start;        /* 顺序执行init_sequence数组中的初始化函数 */        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {               if ((*init_fnc_ptr)() != 0) {                       hang ();               }        }        /*配置可用的Flash */        size = flash_init ();        display_flash_config (size);        /* _armboot_start 在u-boot.lds链接脚本中定义 */        mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);        /* 配置环境变量,重新定位 */        env_relocate ();        /* 从环境变量中获取IP地址 */        gd-bd-bi_ip_addr = getenv_IPaddr ("ipaddr");        /* 以太网接口MAC 地址 */        ……        devices_init ();      /* 获取列表中的设备 */        jumptable_init ();        console_init_r ();    /* 完整地初始化控制台设备 */        enable_interrupts (); /* 使能例外处理 */        /* 通过环境变量初始化 */        if ((s = getenv ("loadaddr")) != NULL) {                load_addr = simple_strtoul (s, NULL, 16);        }        /* main_loop()总是试图自动启动,循环不断执行 */        for (;;) {                main_loop ();      /* 主循环函数处理执行用户命令 -- common/main.c */        }        /* NOTREACHED - no way out of command loop except booting */ }   3.init_sequence 数组保存着基本的初始化函数指针。这些函数名称和实现的程序文件在下列注释中。   init_fnc_t *init_sequence ) {        ulong addr, rc;        int     rcode = 0;        if (argc 2) {               printf ("Usage:\n%s\n", cmdtp-usage);               return 1;        }        addr = simple_strtoul(argv , NULL, 16);        printf ("## Starting application at 0x%08lX ...\n", addr);        /*         * pass address parameter as argv (aka command name),         * and all remaining args         */        rc = ((ulong (*)(int, char * );        if (rc != 0) rcode = 1;          printf ("## Application terminated, rc = 0x%lX\n", rc);        return rcode; }   go命令调用do_go()函数,跳转到某个地址执行的。如果在这个地址准备好了自引导的内核映像,就可以启动了。尽管go命令可以带变参,实际使用时一般不用来传递参数。 2.bootm命令的实现   /* common/cmd_bootm.c */ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv );        image_header_t *hdr = header;          s = getenv ("verify");        verify = (s (*s == 'n')) ? 0 : 1;        if (argc 2) {               addr = load_addr;        } else {               addr = simple_strtoul(argv , NULL, 16);        }        SHOW_BOOT_PROGRESS (1);        printf ("## Booting image at %08lx ...\n", addr);        /* Copy header so we can blank CRC field for re-calculation */        memmove (header, (char *)addr, sizeof(image_header_t));        if (ntohl(hdr-ih_magic) != IH_MAGIC)        {               puts ("Bad Magic Number\n");               SHOW_BOOT_PROGRESS (-1);               return 1;        }        SHOW_BOOT_PROGRESS (2);        data = (ulong)header;        len  = sizeof(image_header_t);          checksum = ntohl(hdr-ih_hcrc);        hdr-ih_hcrc = 0;          if(crc32 (0, (char *)data, len) != checksum) {               puts ("Bad Header Checksum\n");               SHOW_BOOT_PROGRESS (-2);               return 1;        }        SHOW_BOOT_PROGRESS (3);        /* for multi-file images we need the data part, too */        print_image_hdr ((image_header_t *)addr);        data = addr + sizeof(image_header_t);        len  = ntohl(hdr-ih_size);        if(verify) {               puts ("   Verifying Checksum ... ");               if(crc32 (0, (char *)data, len) != ntohl(hdr-ih_dcrc)) {                      printf ("Bad Data CRC\n");                      SHOW_BOOT_PROGRESS (-3);                      return 1;               }               puts ("OK\n");        }        SHOW_BOOT_PROGRESS (4);        len_ptr = (ulong *)data; ……        switch (hdr-ih_os) {        default:                /* handled by (original) Linux case */        case IH_OS_LINUX:              do_bootm_linux  (cmdtp, flag, argc, argv,                          addr, len_ptr, verify);              break;        …… }   bootm命令调用do_bootm函数。这个函数专门用来引导各种操作系统映像,可以支持引导Linux、vxWorks、QNX等操作系统。引导Linux的时候,调用do_bootm_linux()函数。 3.do_bootm_linux函数的实现   /* lib_arm/armlinux.c */ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv , NULL, 16);               printf ("## Loading Ramdisk Image at %08lx ...\n", addr);               /* Copy header so we can blank CRC field for re-calculation */               memcpy (header, (char *) addr, sizeof (image_header_t));               if (ntohl (hdr-ih_magic) != IH_MAGIC) {                       printf ("Bad Magic Number\n");                       SHOW_BOOT_PROGRESS (-10);                       do_reset (cmdtp, flag, argc, argv);               }               data = (ulong) header;               len = sizeof (image_header_t);               checksum = ntohl (hdr-ih_hcrc);               hdr-ih_hcrc = 0;               if(crc32 (0, (char *) data, len) != checksum) {                      printf ("Bad Header Checksum\n");                      SHOW_BOOT_PROGRESS (-11);                      do_reset (cmdtp, flag, argc, argv);               }               SHOW_BOOT_PROGRESS (10);               print_image_hdr (hdr);               data = addr + sizeof (image_header_t);               len = ntohl (hdr-ih_size);               if(verify) {                      ulong csum = 0;                      printf ("   Verifying Checksum ... ");                      csum = crc32 (0, (char *) data, len);                      if (csum != ntohl (hdr-ih_dcrc)) {                             printf ("Bad Data CRC\n");                             SHOW_BOOT_PROGRESS (-12);                             do_reset (cmdtp, flag, argc, argv);                      }                      printf ("OK\n");               }               SHOW_BOOT_PROGRESS (11);               if ((hdr-ih_os != IH_OS_LINUX) ||                      (hdr-ih_arch != IH_CPU_ARM) ||                      (hdr-ih_type != IH_TYPE_RAMDISK)) {                      printf ("No Linux ARM Ramdisk Image\n");                      SHOW_BOOT_PROGRESS (-13);                      do_reset (cmdtp, flag, argc, argv);               }               /* Now check if we have a multifile image */        } else if ((hdr-ih_type == IH_TYPE_MULTI) (len_ptr )) {                ulong tail = ntohl (len_ptr ) % 4;                int i;                SHOW_BOOT_PROGRESS (13);                /* skip kernel length and terminator */                data = (ulong) (len_ptr );                /* skip any additional image length fields */                for (i = 1; len_ptr ; ++i)                        data += 4;               /* add kernel length, and align */               data += ntohl (len_ptr );               if (tail) {                        data += 4 - tail;               }               len = ntohl (len_ptr );        } else {                /* no initrd image */               SHOW_BOOT_PROGRESS (14);               len = data = 0;        }        if (data) {                initrd_start = data;                initrd_end = initrd_start + len;        } else {                initrd_start = 0;                initrd_end = 0;        }        SHOW_BOOT_PROGRESS (15);        debug ("## Transferring control to Linux (at address %08lx) ...\n",                (ulong) theKernel); #if defined (CONFIG_SETUP_MEMORY_TAGS) || \       defined (CONFIG_CMDLINE_TAG) || \       defined (CONFIG_INITRD_TAG) || \       defined (CONFIG_SERIAL_TAG) || \       defined (CONFIG_REVISION_TAG) || \       defined (CONFIG_LCD) || \       defined (CONFIG_VFD)       setup_start_tag (bd); #ifdef CONFIG_SERIAL_TAG       setup_serial_tag (¶ms); #endif #ifdef CONFIG_REVISION_TAG       setup_revision_tag (¶ms); #endif #ifdef CONFIG_SETUP_MEMORY_TAGS       setup_memory_tags (bd); #endif #ifdef CONFIG_CMDLINE_TAG       setup_commandline_tag (bd, commandline); #endif #ifdef CONFIG_INITRD_TAG       if (initrd_start initrd_end)                setup_initrd_tag (bd, initrd_start, initrd_end); #endif       setup_end_tag (bd); #endif       /* we assume that the kernel is in place */       printf ("\nStarting kernel ...\n\n");       cleanup_before_linux ();         theKernel (0, bd-bi_arch_number, bd-bi_boot_params); }      
  • 热度 24
    2014-8-12 16:28
    1705 次阅读|
    1 个评论
            笔者是在看了特权同学玩转fpga入门视频之后,觉得不错,才拜读的他的《深入浅出玩转FPGA》这本书,在看到第31页对if..else和case语句进行分析时,觉得部分分析可能缺乏可比性,容易造成误解,斗胆在这里做一些讨论和补充。         该书中首先引用两段代码EX1和EX2说明if...else结构和case结构在verilog逻辑代码逻辑相同时,将导致RTL级视图不同,但最后映射资源利用和扇出却是相同的。        后来又举例两段读写控制代码,来说明case语句比if...else语句占用资源更少,但这两段代码其实没有可比性,或者说不应该像书中那样比较,因为容易导致误解。书中的两段代码如下:     第一段代码  EX3:   input clk;   input rst_n;   input close,wr,rd;   output db;     reg dbr;     always @(posedge clk or negedge rst_n)begin   if(!rst_n)begin          dbr=3'd0;   end   else begin          if(close)dbr=3'b111;          else if(rd)dbr=3'b101;          else if(wr)dbr=3'b011;          else dbr=3'd0;    end end assign db=dbr;   第二段代码EX4:  input clk;  input rst_n;  input close,wr,rd;  output db;    reg dbr;    always @(posedge clk or negedge rst_n)begin          if(!rst_n)begin                dbr=3'd0;          end         else begin                case({close,rd,wr})                3'b100:dbr=3'b111;                3'b010:dbr=3'b101;                3'b001:dbr=3'b011;               default:dbr=3'd0;              endcase        end end assign db=dbr;      书中直接对比以上两段代码的RTL视图,以及映射后的资源利用和扇出情况。但其实第二段代码,并没有将所有case列全,若想使两段代码逻辑一致,显然第二段代码需如下将所有case列出: case({close,rd,wr}) 3'b100:dbr=3'b111; 3'b110:dbr=3'b111; 3'b101:dbr=3'b111; 3'b111:dbr=3'b111; 3'b010:dbr=3'b101; 3'b011:dbr=3'b101; 3'b001:dbr=3'b011; default:dbr=3'd0; endcase         而如果第二段代码将所有case列出,则虽然RTL视图不同,但映射后的资源利用以及平均扇出其实仍是一致的。         很显然根据示例代码EX1~EX4,我们不难发现,在RTL级实现中,case语句一般是先经过译码器(decode),将所有可能的case情况译码出来,然后将最终输出相同的情况直接取或,而if-else结构的RTL级实现则与此不同,一般会采用选通器(MUX)互连的形式。         此外,最终映射优化的过程,其实类似于数字电路设计中的卡诺图优化,因此只要if...else和case的逻辑完整,其实映射后的资源利用和扇出应当是一致的,但是我们在设计中,往往有些信号或者说case情况其实是隐含不可能出现的,类似于数字电路中所说的约束项,例如上面的3'b110,3'b101,3'b111,3'b011这四种情况可能在实际中并不会出现,那么以上两段代码在功能上最终表现就会是相同的,但这隐含了以上四种情况实际上不会发生的约束。考虑到一般情况下,if...else结构较case结构可能隐含更多的约束项,因此可能导致更简化的最简逻辑表达式的产生,而一般逻辑表达式越简化,对细节的约束就越少,所使用的门也就相对要少,因而,一般所使用的逻辑资源也就少一些。        使用if...else结构,以及以上第二段完整的case语句结构,所产生的资源映射情况都将如该书中39页图2.7所示。      
  • 热度 23
    2013-10-31 21:02
    1366 次阅读|
    0 个评论
    My grandparents' TV went dead. My dad, a radio and TV repair person, took a quick look and thought the damage was caused by a line spike, maybe from lightning. The tuner didn't appear to be damaged. He didn't have the time to take on this repair, although more likely he thought it was a lost cause. He issued me a challenge to fix it. Wait a minute, pop! You want me to rebuild a TV that was possibly hit by lightning? Cool! I knew it wouldn't be pretty, but I accepted. My dad was correct. Only the IF section was toast. Really, fried remains of resistors, coils, and caps burnt to a crisp. It looked like someone had taken a torch to the IF section. I got out the SAMS service manual. I can't remember the exact make. The TV may have been a Philco, RCA, or Magnavox. I started the rebuild with the easy stuff first, replacing the tubes, resistors, and caps. I had to match up the resistor values from the schematic, since the colour codes were different shades of burnt umber... pun intended. The IF coils were my biggest worry. Luckily the coils had only minor smoke damage with a couple of open windings. I carefully cleaned up the coil forms and re-wound the open ones with the same size copper wire. Six weeks had elapsed since I started, and finally the work was done. It was time for the smoke test. It was the most nerve-wracking moment: Would my Frankenstein TV come to life or... just smoke? I carefully flipped on the switch, standing well back, just in case. It was ALIVE! NO smoke! It really worked. The picture and sound were both functional. Actually, very functional indeed considering what I had done to the IF section. On Thanksgiving day my grandparents had their TV back. Note: To protect the innocent the exact details and names have been changed. Plus this happened about 40 years ago, when I was 15 years old and just starting 10th grade! Dave Grindel submitted this article as part of Frankenstein's Fix, a design contest hosted by EE Times (US).  
相关资源
  • 所需E币: 0
    时间: 2021-3-25 17:48
    大小: 899.22KB
    上传者: Argent
    全志方案在消费类电子占有很大的市场,随着产品的不断升级优化,全志方案不仅仅在安卓平板,视频监控、广告应用等领域崭露头角,本人收集些有关全志方案的开发资料,希望对正在使用全志方案的网友有所帮助。
  • 所需E币: 0
    时间: 2020-12-22 16:21
    大小: 410.49KB
    上传者: samewell
    ADI_AN-851一种WiMax双下变频IF采样接收机设计方案[中文版]
  • 所需E币: 0
    时间: 2020-9-18 17:25
    大小: 25.79KB
    上传者: LGWU1995
    用if语句控制P0口8位LED的流水方向
  • 所需E币: 2
    时间: 2020-6-19 21:49
    大小: 421.73KB
    上传者: Goodluck2020
    AN-851一种WiMax双下变频IF采样接收机设计方案[中文版](Rev.0).pdf
  • 所需E币: 4
    时间: 2019-12-27 20:33
    大小: 1.14MB
    上传者: givh79_163.com
    增益模块增益模块是通用宽带放大器,工作频率为低频至6GHz。所有器件均与集成内部偏置电路以50Ω电阻内部匹配,因此极大地减少了对外部元件的需求。请注意,由于存在内部线性化电路,P1dB与OIP3之间的10dB分离规则已不再适用。ADI公司的增益模块提供1kV1C等级或更高等级的全面静电保护(ESD),而且除提供业界标准SOT-89封装外,还提供最小面积的LFCSP封装。高性能RF/IF放大器RF/IF放大器:针对频率、温度和电源电压详细说明的规格参数条件最小值典型值最大值单位增益频率=900MHz18.619.921.1dB对频率869MHz至894MHz±0.125dB对温度40°C至+85°C±1dB对电压5V@5%(4.75V至5.25V)±0.1dBP1dB频率=900MHz27.327.9dBm对频率869MHz至894MHz±0.1dBm对温度40°C至+85°C±1dBm对电压5V@5%(4.75V至5.25V)±0.4dBmOIP3频率=900MHz45.3dB……
  • 所需E币: 5
    时间: 2019-12-28 23:34
    大小: 110.5KB
    上传者: 微风DS
    利用集成CMOSRF前端GPS接收机MAX2742,附加极少的外部元件,即可构成一个完整的GPS解决方案……
  • 所需E币: 5
    时间: 2019-12-25 16:26
    大小: 484.74KB
    上传者: wsu_w_hotmail.com
    此套FPGA视频教程由华清远见FPGA师资团队老师精心制作,非常适合FPGA初学者,是华清远见推出的第一期嵌入式公益活动资料集锦,共分7讲(包括视频以及PDF文档),推荐!!第1讲、FPGA设计基础(PDF、视频)第2讲、FPGA设计入门(视频、课后习题)第3讲、VerilogHDL基础(PDF、视频、课后习题)第4讲:VerilogHDL中的组合逻辑设计方法(PDF、视频)第5讲:ModelSim软件使用方法和技巧(视频)第6讲、Sopc硬件系统(视频)第7讲、sopc软件系统(视频)……
  • 所需E币: 4
    时间: 2019-12-24 22:46
    大小: 237.38KB
    上传者: givh79_163.com
    摘要:蜂窝发送器的设计依赖于能够保持高线性度和高动态范围的高性能RF调制器。随着多载波发送器的增长,RF调制器必须保持低噪声基底,从而提供较高的性能指标,通常取决于二阶或三阶互调。本文讨论了这些需求,并说明MAX2022能够满足典型四载波WCDMA发送架构的要求。高性能射频调制器促成多载波通信发送器设计Jun20,2005摘要:蜂窝发送器的设计依赖于能够保持高线性度和高动态范围的高性能RF调制器。随着多载波发送器的增长,RF调制器必须保持低噪声基底,从而提供较高的性能指标,通常取决于二阶或三阶互调。本文讨论了这些需求,并说明MAX2022能够满足典型四载波WCDMA发送架构的要求。概述现有的蜂窝基站大多采用超外差结构发送或接收射频信号。这种结构需要两次变频或更多的上、下变频级、中间滤波和模拟信号处理。图1的上半部分给出了一个两级转换蜂窝基站的典型超外差发送框图,很多此类发送器已经被应用在单载波系统。因为多载波发送器是从单载波发送器复制得到的,所以引入了更多的系统硬件。为了努力降低发送器的成本,许多系统设计者开始转向多载波发送器和简单的直接变换射频结构。点击这里,了解典型射频收发器设计的无线器件图1.超外差变换和直接变换结构框图多载波结构的设计挑战多载波结构降低了发射通道数,直接变换结构由基带信号直接变换成射频信号,从而减少了每个通道的元器件数量。这两种结构都要求宽动态范围和高线性度的元器件来满足整个系统的要求。图2给出了一个直接变换发送器结构。这种特殊结构大大降低了转换处理的级数。多级混频器、放大器、中频和射频滤波都由一个单片集成方案所替代。图2.直接变换结构直到近期,数模转换器(DAC)和直接变换调制器的性能还不足以支持3G多载波蜂窝基站的要求。新一代通信基站的发送器设计即要求低成本又要求更加灵活的解决方案,在搭建基础发射架构的过程中,射频调制器的选择起着举足轻重的作用。用单发……
  • 所需E币: 3
    时间: 2019-12-24 22:46
    大小: 125.58KB
    上传者: quw431979_163.com
    摘要:本应用笔记比较了集成RF混频器与无源混频器方案的整体性能,论述了两种方案的主要特征,并指出集成方案相对于无源方案的主要优点。集成RF混频器与无源混频器方案的性能比较Sep06,2006摘要:本应用笔记比较了集成RF混频器与无源混频器方案的整体性能,论述了两种方案的主要特征,并指出集成方案相对于无源方案的主要优点。过去,RF研发人员在高性能接收器设计中使用无源下变频混频器取得了较好的整体线性指标和杂散指标。但在这些设计中使用分立的无源混频器也存在一些缺点。为了达到接收器整体噪声系数的指标要求,需要在射频(RF)增益级或中频(IF)增益级补偿无源混频器的插入损耗。与集成混频器相比,使用无源混频器时,用户不仅要考虑其输入三阶截点(IIP3),还要考虑输出三阶截点(OIP3)。无源混频器的二阶线性指标一般都比集成平衡混频器的差,而该指标在考虑接收器的半中频杂散性能时非常重要。由于混频器的线性度与本振驱动电平直接相关,所以必须产生相当大的本振注入,然后通过PCB布线馈入无源混频器的本振端口。此点击这里,了解典型射频收发器设计的无线器件外,还需要外部RF放大级对这些信号进行放大,使整个设计对本振辐射和干扰非常敏感。由于无源混频器是一个全分立方案,成本更高、PCB尺寸更大,由于分立元件之间的偏差也会导致性能上的差异。集成(或有源)混频器设计可以获得与无源混频器相媲美的性能,因而备受欢迎。集成混频器包含一个真正的平衡混频器(Gilbert单元)或带有中频放大的无源混频器,借助增益补偿了损耗。由于集成混频器具有增益级,不再像无源混频器那样需要外部中频放大器补偿损耗。对于噪声系数指标非常好的集成混频器,如Maxim的MAX9993、MAX9981和MAX9982,在混频电路前端需要较小的RF增益,从而改善了接收器的整体线性指标。值得强调的是,如果通过在混频器前端提高增益来改善串联噪声系数,也必须提高混频器的线性度,以保持接收器的整体线性指标……
  • 所需E币: 4
    时间: 2019-12-24 14:52
    大小: 48.55KB
    上传者: 微风DS
    帖子《IfvsCase语句》http://forum.eepw.com.cn/thread/226689/1所介绍的源代码(工程文件),未包含stellaris固件库……