精华内容
下载资源
问答
  • fpga数字信号处理
    千次阅读
    2019-05-28 16:04:52

    本文是导航目录,以记录自己的FPGA学习历程。

    每章节内容,后期空闲时,会逐步更新!

     

    刚开始接触这方面,先附上博客专家的网址:https://blog.csdn.net/FPGADesigner

     

     

     

     

    预期,后期逐渐补充内容:

    一、FPGA实现FIR数字滤波器

    二、FPGA实现IIR数字滤波器

    三、FPGA实现FFT

     

     

     

     

     

     

     

    给自己,一个努力前行的方向。

    学习,总是会有收获的!

    更多相关内容
  • 本书从硬件描述语言(VHDL和Verilog HDL)、Simulink环境下的模型构建以及Xilinx高级综合工具下的C/C++程序设计3个角度,对采用Xilinx FPGA平台构建数字信号处理系统的方法进行详细的介绍与说明。全书内容涵盖了数字...
  • XILINX FPGA数字信号处理权威指南 从HDL到模型和C的描述pdf高清版本
  • XILINX FPGA数字信号处理权威指南-从HDL到模型和C的描述,高清pdf,配有详细的目录
  • XILINX FPGA数字信号处理权威指南.pdf,何宾写的,非常的好!
  • XILINX FPGA数字信号处理权威指南-从HDL到模型和C的描述,高清pdf,配有详细的目录
  • FPGA数字信号处理与工程应用实践 [张春生,苏开友 编著] 2013年版
  • xiliix_FPGA数字信号处理设计教程,systerm generator入门与提高
  • FPGA数字信号处理实现原理及方法 FPGA数字信号处理实现原理及方法
  • 从硬件描述语言(VHDL和Verilog HDL)、Simulink环境下的模型构建以及Xilinx高级综合工具下的C/C++程序设计3个角度,对采用Xilinx FPGA平台构建数字信号处理系统的方法进行详细的介绍与说明。全书内容涵盖了数字信号...
  • XILINX FPGA数字信号处理权威指南 从HDL到模型和C的描述
  • Verilog基本电路设计(包括:时钟域同步、无缝切换、异步FIFO、去抖滤波))fpga数字信号处理Verilog根本电路设计之一:单bit跨时钟域同步\\\插播一条:自己在今年整理一套单片机单片机相关论文800余篇(附送网盘链接...

    Verilog基本电路设计(包括:时钟域同步、无缝切换FIFO、去抖滤波))


    fpga数字信号处理

    Verilog根本电路设计之一:单bit跨时钟域同步

    \\\插播一条:

    自己在今年整理一套单片机单片机相关论文800余篇(附送网盘链接)

    论文制作思维导图

    原理图+源代码+开题报告+正文+外文资料

    想要的同学私信找我。

    首先介绍异步信号的跨时钟域同步问题。一般分为单bit的控制信号同步,以及多bit的数据信号同步。多bit的信号同步会使用异步FIFO完成,而单bit的信号同步,又是时钟没缝切换电路以及异步FIFO电路的设计根底,这里先介绍单bit信号同步处理。
    clka域下的信号signal_a,向异步的clkb域传递时,会产生亚稳态问题。所有的亚稳态,归根结底就是setup/hold时长不满足导致。在同一个时钟域下的信号,综合以及布线工具能够在data路径或者clock路径上插入buffer使得每一个DFF的setup/hold时长都满足;但是当signal_a在clkb域下使用时,由于clka与clkb异步,它们的相位关系不确定,那么在clkb的时钟沿到来时,没法确定signal_a此时是否处于稳定没变化状态,也即setup/hold时长没法确定,从而产生亚稳态。这种异步信号在前后端流程里面是没法做时序分析的,也就是静态时序分析里常说的false_path。
    打消亚稳态,就是采用多级DFF来采样来自另一个时钟域的信号,级数越多,同步过来的信号越稳定。对于频次很高的设计,建议至少用三级DFF,而两级DFF同步则是所有异步信号处理的最根本要求。
    单bit的信号跨时钟域同步,又分成电平信号同步以及脉冲信号同步。电平信号,就是说clka下的信号signal_a在clkb看来,是一个很宽的信号,会保持多个clkb的时钟周期,一定能被clkb采到。这种情况,只须要使用clkb用至少两级DFF不间断抓signal_a即可,特别须要强调的是,此时signal_a必需是clka下的寄存器信号,假如signal_a是clka下的组合逻辑信号,一定要先在clka下用DFF抓一拍,再使用两级DFF向clkb传递。这是由于clka下的组合逻辑信号会有毛刺,在clka下使用时会由setup/hold时长保证毛刺不会被clka采到,但由于异步相位不确定,组合逻辑的毛刺却极有可能被clkb采到。电平信号的同步处


    私信我绿色软件airuimcu

    理,一般用于知道确定的时钟频率大小关系或者极慢时钟下的信号向极快时钟域传递时使用,简单处理如下:

    always @ (posedge clkb or negedge rst_n)begin
    if (!rst_n) begin
    levl_b_d1
    levl_b_d2
    levl_b_d3
    end
    else begin
    levl_b_d1
    levl_b_d2
    levl_b_d3
    endend

    assign puls_b_pos = levl_b_d2 & (~levl_b_d3);

    assign puls_b_neg = levl_b_d3 & (~levl_b_d2);
    assign levl_b_out = levl_b_d2;

    上面三个输出分别是经过同步之后,clkb下可以使用的0变1脉冲信号,1变0脉冲信号以及电平信号。再次强调:levl_a_in必须是clka的DFF信号!下面是更常见的,clka下的脉冲信号,同步到clkb时钟域下,它对于clka与clkb的时钟频率关系没有任何限制,快到慢,慢到快都没问题。其主要原理就是先把脉冲信号在clka下展宽,变成电平信号,再向clkb传递,当确认clkb已经“看见”信号同步过去之后,再清掉clka下的电平信号。脉冲信号同步处理电路,有两个地方使用了上面的电平信号同步处理原则,请仔细揣摩原因。详细见下面的RTL,其中省略了信号定义声明:

    module sync_pulse (
    // input
    rst_n, // system reset
    clka, // clockA
    clkb, // clockB
    puls_a_in, // pulse input from clka
    // output
    puls_b_out, // pulse output in clkb
    levl_b_out // level output in clkb
    );

    parameter DLY = 1; //

    always @ (posedge clka or negedge rst_n)
    begin
    if (rst_n == 1'b0)
    signal_a
    else if (puls_a_in)
    signal_a
    else if (signal_b1_a2)
    signal_a
    else ;
    end

    always @ (posedge clkb or negedge rst_n)
    begin
    if (rst_n == 1'b0)
    signal_b
    else
    signal_b
    end

    always @ (posedge clkb or negedge rst_n)
    begin
    if (rst_n == 1'b0) begin
    signal_b_b1
    signal_b_b2
    end
    else begin
    signal_b_b1
    signal_b_b2
    end
    end

    always @ (posedge clka or negedge rst_n)
    begin
    if (rst_n == 1'b0) begin
    signal_b1_a1
    signal_b1_a2
    end
    else begin
    signal_b1_a1
    signal_b1_a2
    end
    end

    assign puls_b_out = signal_b_b1 & (~signal_b_b2) ;
    assign levl_b_out = signal_b_b1 ;

    endmodule

    下一篇讲时钟切换电路。

    留下一个思考题:clka下的同一个寄存器信号signal_a,电平宽度对clkb而言足够长,如果同时调用两个相同的电平同步模块向clkb时钟传递,分别得到levl_b1和levl_b2,那么在clkb时钟域下看到的lev_b1和levl_b2信号是否一样?
    这个问题是实际设计中一不小心就会犯错的,如果能够想明白正确回答这个问题,异步信号的理解就可以过关了。

    Verilog基本电路设计之二:时钟无缝切换

    时钟切换分成两种方式,普通切换和去毛刺无缝切换。

    普通切换,就是不关心切出的时钟是否存在毛刺,这种方式电路成本小。如果时钟切换时,使用此时钟的模块电路处于非工作状态,或者模块内电路被全局复位信号reset住的,即使切出毛刺也不会导致DFF误触发,这样的模块可以选择用此种切换方式。
    写法很简单 assign clk_o = sel_clkb ? clkb : clka ,当sel_clkb为1时选择clkb,否则选择clka。不过在实际设计中,建议直接调用库里的MUX单元set_dont_touch,不要采用这里的assign写法,因为这种写法最后综合得到的可能不是MUX而是复杂组合逻辑,给前后端流程的时钟约束和分析带来不便。

    无缝切换,就是切换时无毛刺时钟平稳过渡。在时钟切换中,只要出现比clka或者clkb频率更高的窄脉冲,不论是窄的高电平还是窄的低电平,都叫时钟毛刺。工作在切换后时钟clk_o下的电路模块,综合约束是在max{clka,clkb}频率下的,也就是说设计最后signoff的时候,只保证电路可以稳定工作的最高频率是max{clka,clkb},如果切换中出现更高频的时钟毛刺,电路可能出现无法预知的结果而出错。无缝切换,一般用在处于工作状态的模块需要调频或者切换时钟源,比如内部系统总线,CPU等。你刚用手机打完游戏后马上关屏听音乐,这两种场景中,CPU在满足性能前提下为了控制功耗,其工作频率会动态地从很高调至较低,此时就可能是在CPU一直处于工作状态下,通过无缝切换时钟源头实现的。

    在无缝切换电路中,切换信号sel_clkb可以是任意时钟域下的信号,包括但不限于clka或者clkb域,但是sel_clkb必须是一个DFF输出信号;clka与clkb的频率大小相位关系可以任意。无缝切换需要解决两个问题,一是异步切换信号的跨时钟域同步问题,这里需要使用《Verilog基本电路设计之一》里的同步电路原理消除亚稳态;二是同步好了的切换信号与时钟信号如何做逻辑,才能实现无毛刺。

    下面写出无缝切换电路的主体部分,忽略了内部信号的定义声明等。

    module clk_switch (
    rst_n,
    clka,
    clkb,
    sel_clkb,
    clk_o
    );
    always @ (posedge clka or negedge rst_n)
    begin
    if (!rst_n) begin
    sel_clka_d0
    sel_clka_d1

    end
    else begin
    sel_clka_d0
    sel_clka_d1
    end
    end

    // part2
    //always @ (posedge clka_n or negedge rst_n)
    always @ (posedge clka or negedge rst_n)
    begin
    if (!rst_n) begin
    sel_clka_dly1
    sel_clka_dly2
    sel_clka_dly3
    end
    else begin
    sel_clka_dly1
    sel_clka_dly2
    sel_clka_dly3
    end
    end

    // part3
    //always @ (posedge clkb_n or negedge rst_n)
    always @ (posedge clkb or negedge rst_n)
    begin
    if (!rst_n) begin
    sel_clkb_d0
    sel_clkb_d1
    end
    else begin
    sel_clkb_d0
    sel_clkb_d1
    end
    end

    // part4
    //always @ (posedge clkb_n or negedge rst_n)
    always @ (posedge clkb or negedge rst_n)
    begin
    if (!rst_n) begin
    sel_clkb_dly1
    sel_clkb_dly2
    sel_clkb_dly3
    end
    else begin
    sel_clkb_dly1
    sel_clkb_dly2
    sel_clkb_dly3
    end
    end

    // part5
    clk_gate_xxx clk_gate_a ( .CP(clka), .EN(sel_clka_dly3), .Q(clka_g) .TE(1'b0) );
    clk_gate_xxx clk_gate_b ( .CP(clkb), .EN(sel_clkb_dly3), .Q(clkb_g) .TE(1'b0) );
    //assign clka_g = clka & sel_clka_dly3 ;
    //assign clkb_g = clkb & sel_clkb_dly3 ;
    assign clk_o = clka_g | clkb_g ;
    endmodule

    上面是我认为比较合理的无缝切换电路,其他切换方式跟这个会有些许出入,但基本大同小异原理是一样的。有几点说明:
    1、抛开注释掉的电路不看,由于part5部分直接调用库里的clock gating cell,使得整个切换电路全部只需要用到时钟上升沿,无需额外定义反向时钟,精简了DC综合的时钟约束;直接调用gating cell的另一个好处是,前后端工具会自动检查gating cell的CP信号与EN信号的setup/hold时间,使得gating后的Q时钟输出无毛刺尖峰。TE端可以根据实际需要接上scan测试模式信号。如果使用part5部分的gating cell实现,前面的part1,2,3,4全部替换成注释掉的反相时钟也是没有问题。

    2、part2和part4部分,具体需要多少级DFF,甚至完全不要也是可以的,这就回到了《Verilog基本电路设计之一》里讨论的到底多少级DFF消除亚稳态才算合理的问题。时钟频率很低可能无所谓,如果时钟频率达到GHz,这部分建议至少保留三级DFF,因为三级DFF延时也仅仅只有3ns的时间裕度。没必要为了省这么几个DFF降低电路可靠性,在复杂IP以及大型SOC系统中,你会发现多几十个DFF,面积上可以忽略,系统可靠性和稳定性才是首要的。

    3、如果part5部分希望使用注释掉的两行“与”逻辑实现时钟gating,此时part1与part3使用正相或者反相时钟都可以,但是必须把part2和part4部分改为注释掉的反相时钟实现,目的是初步从RTL设计上避免“与”逻辑的毛刺,同时还需要后端配合,因为很多后端工具对时钟“与”逻辑的clock gating check未必会检查。用clk下降沿拍出的en信号,再跟clk做与逻辑得到的门控时钟,在RTL仿真阶段看到的一定不会有毛刺,但是布线完成后,如果clk相对en后移,那与逻辑得到的门控时钟就有毛刺了。这就是用与逻辑做门控的缺点,由于后端工具可能不会去检查这个与门的时序关系而导致出错。但直接调用库里的gating cell,工具天然就会去检查这个时序,免去人工确认的后顾之忧。

    最后,请大家仔细看看sel_clka_d0 和sel_clkb_d0 这两处逻辑,按理说,sel_clkb跟sel_clka_dly3以及sel_clkb_dly3之间相互都是异步的,而按照异步信号同步处理原则,两个不同时钟域下的信号是不允许直接做组合逻辑的,为什么这里可以这样使用?

    Verilog基本电路设计之三:异步FIFO

    FIFO用于为匹配读写速度而设置的数据缓冲buffer,当读写时钟异步时,就是异步FIFO。多bit的数据信号,并不是直接从写时钟域同步到读时钟域的,而是读写时钟域分别派遣了一个信使,去通知对方时钟域,当前本方所处的读写情况,来判断还能不能写以及可不可以读,这两个信使就是读写指针。

    在《Verilog基本电路设计之一》里已讨论过,即使单bit的异步信号,通过两个相同的同步电路,达到clkb域时都可能“长”的不是一个模样,更加不用说多bit的异步信号同时传递到clkb域会变成什么五花八门的模样了。这里读写指针不是单bit信号,它们如何向对方时钟域去同步呢?格雷码!它的特点是每次只有一个bit发生变化,这样就把多bit信号同步转变为了单bit信号同步,这也是为什么多bit的格雷码信号,可以类似于单bit信号那样,直接使用两级DFF去同步的根本原因。

    下面给出异步FIFO的主体部分,同样,省略了信号声明定义。

    module asyn_fifo (
    // input
    af_wclk , // async-FIFO clear in write clock
    af_rclk , // async-FIFO clear in read clock
    rst_n, // system reset
    af_wr_en, // async-FIFO write enable
    af_rd_en, // async-FIFO read enable
    af_dati, // async-FIFO data in
    //output 
    af_full , // Async-FIFO full flag
    af_empty, // Async-FIFO empty flag
    af_dato // Async-FIFO data out
    );

    //------------------------- data input --------------------------
    assign nxt_wptr_wclk = (af_wr_en && !af_full) ? (wptr_wclk + 1'b1) : wptr_wclk ;
    assign nxt_wptr_gray = (nxt_wptr_wclk >> 1) ^ nxt_wptr_wclk ;

    always @ (posedge af_wclk or negedge rst_n)
    begin
    if (rst_n == 1'b0) begin
    wptr_wclk
    wptr_gray
    end
    else begin
    wptr_wclk
    wptr_gray
    end
    end

    reg [31:0] ram[15:0] ; //
    always @ (posedge af_wclk)
    begin
    if (af_wr_en == 1'b1)
    ram[wptr_wclk[3:0]]
    else ;
    end

    //------------------------ data output ---------------------------
    assign nxt_rptr_rclk = (af_rd_en && !af_empty) ? (rptr_rclk + 1'b1) : rptr_rclk ;
    assign nxt_rptr_gray = (nxt_rptr_rclk >> 1) ^ nxt_rptr_rclk ;

    always @ (posedge af_rclk or negedge rst_n)
    begin
    if (rst_n == 1'b0) begin
    rptr_rclk
    rptr_gray
    end
    else begin
    rptr_rclk
    rptr_gray
    end
    end

    assign af_dato = ram[rptr_rclk[3:0]] ;

    // sync read pointer
    always @ (posedge af_wclk or negedge rst_n)
    begin
    if (rst_n == 1'b0) begin
    rptr_sp1
    rptr_sp2
    end
    else begin
    rptr_sp1
    rptr_sp2
    end
    end

    // sync write pointer
    always @ (posedge af_rclk or negedge rst_n)
    begin
    if (rst_n == 1'b0) begin
    wptr_sp1
    wptr_sp2
    end
    else begin
    wptr_sp1
    wptr_sp2
    end
    end

    assign af_full = (wptr_gray == {~rptr_sp2[4],~rptr_sp2[3],rptr_sp2[2:0]}) ;
    assign af_empty = (rptr_gray == wptr_sp2) ;

    assign wptr_bin[4] = wptr_sp2[4] ;
    assign wptr_bin[3] = (^wptr_sp2[4:3]) ;
    assign wptr_bin[2] = (^wptr_sp2[4:2]) ;
    assign wptr_bin[1] = (^wptr_sp2[4:1]) ;
    assign wptr_bin[0] = (^wptr_sp2[4:0]) ;

    assign rptr_bin[4] = rptr_sp2[4] ;
    assign rptr_bin[3] = (^rptr_sp2[4:3]) ;
    assign rptr_bin[2] = (^rptr_sp2[4:2]) ;
    assign rptr_bin[1] = (^rptr_sp2[4:1]) ;
    assign rptr_bin[0] = (^rptr_sp2[4:0]) ;

    assign af_wlevel = wptr_wclk - rptr_bin ;
    assign af_rlevel = wptr_bin - rptr_rclk ;
    assign af_half_full = (af_rlevel >= 5'h7) ;

    endmodule

    上面给出的是深度16,宽度32的示例,大家可以使用parameter参数化定义深度和宽度,方便不同需求下的调用。除了空满信号标志,也可以根据需要做出半空半满之类信号。上面需要注意的一点就是,格雷码必须在本时钟域下DFF输出,再往另一个时钟域同步。同步FIFO呢,就不用有格雷码转换,设计更加简单,就不专门开贴描述了。

    Verilog基本电路设计之四:去抖滤波

    debounce电路,就是常说的去抖滤波,主要用在芯片的PAD输入信号,或者模拟电路输出给数字电路的信号上。

    parameter BIT_NUM = 4 ;
    reg [BIT_NUM-1 : 0] signal_deb ; //
    always @ (posedge clk or negedge rst_n)
    begin
    if (rst_n == 1'b0)
    signal_deb
    else
    signal_deb
    end

    always @ (posedge clk or negedge rst_n)
    begin
    if (rst_n == 1'b0)
    signal_o
    else if (signal_deb[3:1]==3'b111)
    signal_o
    else if (signal_deb[3:1]==3'b000)
    signal_o
    else ;
    end

    上面的电路,第一个always,还兼顾了去亚稳态作用。它可以滤掉的宽度是两个clk的cycle,对于大于两个cycle而小于三个cycle的信号,有些可以滤掉,有些不能滤掉,这与signal_i相对clk的相位有关。

    根据希望滤除的宽度相关,换算到clk下是多少个cycle数,从而决定使用多少级DFF。如果希望滤除的宽度相对cycle数而言较大,可以先在clk下做一个计数器,产生固定间隔的脉冲,再在脉冲信号有效时使用多级DFF去抓signal_i;或者直接将clk分频后再使用。

    展开全文
  • FPGA数字信号处理设计教程 SystemGenerator入门与提高+光盘源码!不仅仅是PDF的,还有光盘源码的。用vivado system generator 2016.4 配合maltab2016b是可以打开,用sysgen设计自适应滤波器、自适应均衡器、自适应...
  • 最新XILINX FPGA数字信号处理权威指南 从HDL到模型和C的描述 文字清晰,欢迎下载。
  • 基于FPGA数字信号处理方法
  • FPGA数字信号处理的FFT FIR IIR各种代码 VHDL Verilog
  • 全面、系统地介绍了宽带移动通信系统中先进的信道编码技术的软硬件实现,即Turbo码和LDPC码的MATLAB软件实现代码和FPGA硬件实现代码。
  • FPGA数字信号处理设计教程:SystemGenerator入门与提高 纪志成,高春能,吴定会
  • 今天给大侠带来“FPGA数字信号处理设计教程-system generator入门与提高电子版”,获取电子版资料,请在“FPGA技术江湖”公众号内回复“FPGA数字信号处理设计教程-system generator入门与提高”,即可获取。...

    今天给大侠带来“FPGA数字信号处理设计教程-system generator入门与提高电子版”,获取电子版资料,请在“FPGA技术江湖”公众号内回复“FPGA数字信号处理设计教程-system generator入门与提高”,即可获取。

    下面给各位大侠列一下目录,电子版方便携带,可也省去一笔开销,不过学习起来没有实体书籍得劲,学习要认真哦。

    FPGA数字信号处理设计教程-system generator入门与提高电子版目录如下:

     

     

     

     

     

    - End -

     

     

    后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

    大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

     

     

    往期精选 

    荐读解惑 | FPGA是有门槛的,零基础并不是你想的那样,不要再被忽悠了!

    深度分析 | 5G时代下的FPGA

    笔记连载 | Day9【xilinx ZYNQ7000系列之《PS端 》串口打印】

    MicroBlaze串口设计(附源工程)

    基于 FPGA Vivado 信号发生器设计(附源工程)

    时序分析理论和timequest使用_中文电子版

    回馈福利 | FPGA寒假班最大羊毛,FPGA精品课程等你来薅!

    展开全文
  • 基于FPGA数字信号处理.doc
  • 使用FPGA入门硬件DE2-115,开发环境为quartus,资料含指导步骤以及代码非常详细+高先生写的用fpga实现数字信号处理算法,写的很好,工程师写的比教师写的实在
  • 数字信号处理FPGA实现(第3版)中文pdf及源码
  • 掌握FPGA数字信号处理设计需满足三个条件:熟悉FPGA设计方法、理解数字信号处理理论、掌握理论的工程实现方法。对初学者来讲,每个条件看似都难以逾越。杜勇老师完美融合课程教学与工程设计的需求特点,以独特的视角...

      掌握FPGA数字信号处理设计需满足三个条件:熟悉FPGA设计方法、理解数字信号处理理论、掌握理论的工程实现方法。对初学者来讲,每个条件看似都难以逾越。杜勇老师完美融合课程教学与工程设计的需求特点,以独特的视角精心编写章节内容,深入浅出讲解设计的原理、方法、步骤和关键技术,逐步引领读者步入FPGA数字信号处理设计的殿堂。

     

    -----------前言---------------------------

     

    为什么要写这本书

         记得上中学时,每周五下午是作文课,老师常常会要求大家在两节课内完成一篇命题作文。写作文最难的是不知何开头,后来一提笔,无论写什么题目,感觉不写“弹指一挥间,匆匆十几年”就引不出后面的内容。

         弹指一挥间,匆匆近十年。从2012年写第一本数字通信技术的FPGA实现系列著作《数字滤波器的MATLAB与FPGA实现》开始,至今已十年!

        这十年间,先后完成数字滤波器的MATLAB与FPGA实现、数字通信同步技术的MATLAB与FPGA实现、数字调制解调技术的MATLAB与FPGA实现三本图书的出版,并完成这一系列图书的Xilinx/VHDL及Altera/Verilog版的改版工作。

      这一系列图书的出版后得到了广大读者的支持与厚爱,为实现与读者的有效沟通交流,我先后在CSDN网站开设了个人博客、开设个人微信公众号“杜勇FPGA”发布图书相关信息,同时与读者就书中一些技术问题进行探讨。系列图书编著初期,由于立足于从工程应用的角度阐述数字信号处理、数字通信知识的MATLAB与FPGA实现的技术问题,主要以高年级本科生、研究生、以及企业工程技术人员为读者对象,图书内容对初学者,尤其自学的读者有一定难度。不少读者感觉这一系列的图书起点较高,内容比较专业和复杂,需要有较好的理论基础和FPGA设计基础才能完成学习,希望能够有更基础及简单的数字信号处理FPGA设计入门图书,以方便自学。在完成入门知识学习,掌握一般数字信号处理的FPGA实现相关知识之后,再深入学习多速率滤波、自适应滤波、通信同步、数字调制解调等知识就容易得多了。

      为此,经过一年的准备,总算完成了《Xilinx FPGA数字信号处理设计——基础版》图书的编写,并计划后续陆续推出《Xilinx FPGA数字信号处理设计——综合版》、《Altera FPGA数字信号处理设计——基础版》、《Altera FPGA数字信号处理设计——综合版》几本图书,以满足有志于从事FPGA数字信号处理设计的初学读者的学习需求。同时,为了便于读者对书中的设计实例进行板载测试,本书的所有FPGA设计实例均与数字滤波器、数字通信同步技术、数字调制解技术的Xilinx版图书采用相同的CXD301硬件开发板平台进行验证。

     

    本书的内容安排

      全书分为上、下两篇,共9章。上篇共4章,主要包括FPGA基本概念、设计语言及环境、FPGA设计流程、常用接口设计等内容。通过上篇的学习,使对读者初步建立FPGA设计的概念和基本方法,了解数字信号处理FPGA设计的常用知识。下篇共5章,主要包括FPGA中数字的运算、典型IP核设计、FIR滤波器设计、IIR滤波器设计和FFT变换设计。数字信号处理设计的基石是滤波器设计和频谱分析。

      掌握原理是完成FPGA设计的基础,与其它几本图书相比,在编写本书过程中对这部分重点内容进行了大幅的简化,并着重从概念和基本运算规则入手,以简单的实例逐步讲解FPGA设计的原理、方法、步骤及仿真测试过程。通过下篇的学习,使读者掌握数字信号FPGA设计的核心基础知识:滤波器设计和频谱分析,从而为继续学习数字信号处理的综合设计打下坚实的基础。

      第1章介绍了FPGA技术的基本概念及特点。有对比,对设计平台才能有更精准的把握和理解。FPGA、ARM、DSP、ASIC等常用数字信号处理平台各有特点,在详细了解FPGA器件的结构特点之后,才能明了FPGA技术在数字信号处理领域里独特的优势地位。

      第2章介绍了VerilogHDL设计语言及ISE14.7开发环境。工欲善,必先利其器。全面了解FPGA设计环境,熟知我们所要利用的工具,用最简单的招式加上你独特的思想,才能完成最完美的FPGA工程设计。

      第3章用一个完整的流水灯FPGA设计实例,详细讲解从读硬件原理图、形成设计方案、进行代码设计、建立测试激励文件、进行ModelSim仿真、完成程序综合、完成程序下载、完成系统测试,这一系列复杂又充满挑战和乐趣的FPGA项目设计流程。

      第4章详细讨论了常用接口程序的FPGA设计。我们设计的FPGA产品不只是一个孤岛,要与外界实现无缝对接。接口是对外交流的窗口。掌握了串口、AD/AD、数码管等常用接口,才有机会尽情地向世界展示设计作品的美妙。

      第5章讨论FPGA中的数字运算。数的运算就是加、减、乘、除。FPGA中只能对二进制数进行运算,生活中我们更习惯于对十进制的实数进行运算。运算的本质和规律是相同的,彻底掌握FPGA中的符号数、小数、数据位扩展等设计方法,才有可能完成更为复杂的数字信号处理算法。其实我们已经掌握了运算的本质,只是需要将这些规律运用到FPGA设计中去而已。

      第6章介绍了典型的IP(Intellectual Property)核设计方法。IP核,就是知识产权核,很高大上的名字,就是一个个功能完备、性能优良、使用简单的功能模块。我们所要做的主要工作是理解它的用法,直接拿过来用到设计中就可以了。

      第7章详细讨论了FIR(Finite Impulse Response,有限脉冲响应)滤波器设计。滤波器设计和频谱分析是数字信号处理中最为基础的专业设计。所谓专业,因其为经典的信号处理专业知识;所谓基础,是说这是应用最为广泛的必备知识。而FIR滤波器因其结构简单、严格的线性相位特性等优势,几乎成为信号处理中的必备电路。

      第8章讨论了IIR(Infinite Impulse Response,无限脉冲响应)滤波器设计。滤波器中的“无限”两个字,听起来有点高深,其实与FIR的结构没有太大的差别。虽然IIR的应用没有FIR广泛,但自有其特点,有FIR无法比拟的优势。IIR因其反馈结构,使得设计中的数字运算更具有挑战性,也更有趣味性。掌握了FIR、IIR滤波器设计,才算对经典的滤波器设计有比较全面的了解。

      第9章讨论了FFT变换设计。频谱分析和滤波器设计是数字信号处理的两大基石。DFT(Discrete Fourier Transform,离散傅里叶变换)的理论很早就非常成熟了,后期出现的FFT(Fast Fourier Transform,快速傅里叶变换)快速算法才使得这DFT的理论在工程中得以应用。FFT的算法和FPGA实现结构相当复杂,幸运的是有免费的IP核可以应用。设计者的工作只不过是理解信号的频谱分析原理,调用现成的FFT核完成设计而已。

     

    关于FPGA开发环境的说明

        众所周知,目前两大厂商Xilinx和Altera的产品约占据全球90%以上的FPGA市场。可以说,在一定程度上正是由于两家FPGA公司的相互竞争态势,有力地推动了FPGA技术的不断发展。虽然硬件描述语言(HDL)的编译及综合环境可以采用第三方公司所开发的产品,如ModelSim、Synplify等,但FPGA器件的物理实现必须采用各自公司开发的软件平台,无法通用。Xilinx公司推出的开发平台是Vivado和ISE系列套件,Altera公司目前的主流开发平台是Quartus系列套件。与FPGA开发平台类似,HDL也存两种难以取舍的选择:VHDL和VerilogHDL。

        学习FPGA开发技术的难点之一即在于掌握开发工具,无论是Xilinx还是Altera公司,为了适应不断更新的开发需求,主要是适应不断推出的新型器件,开发工具的版本更新速度很快。

          Xilinx自最初推出ISE 3.x版以来,历经十余年,已形成强大的用户群。虽然Xilinx公司自2013年10月2日发布最新的ISE 14.7版本后,宣布不再对ISE进行更新,由于ISE 14.7仍然支持Xilinx公司的Spartan-6、Virtex-6、Artix-7、Kintex-7、Virtex-7等中高端主流器件,因此仍然是广大FPGA工程师的首选设计工具。Vivado是Xilinx公司于2012年开始推出的平台,与ISE相比在架构及界面方面都有很大的变化,版本的更新主要是为了解决设计套件本身的功能性问题,Vivado设计套件自2012年首次推出后,几乎每年都会推出3~4个版本,截止目前已陆续推出20余个版本之多!过多的软件版本不可避免地增加了FPGA工程师适应开发工具的难度。

        如何选择开发平台以及HDL语言呢?其实,对于有志于从事FPGA开发的技术人员,选择哪种平台及HDL语言并不重要,因为两种平台具有很多相似的地方,精通一种HDL语言后,再学习另一种HDL语言也不是一件困难的事。通常来讲,可以根据周围同事、朋友、同学或公司的主要使用情况进行选择,这样在学习的过程中,可以很方便地找到能够给你指点迷津的专业人士,从而加快学习进度。

        本书采用的是Xilinx公司的FPGA器件作为开发平台,采用ISE 14.7作为开发环境,采用VerilogHDL语言作为实现语言,采用XST综合工具,使用ModelsimSE 10.1进行仿真测试。由于VerilogHDL语言并不依赖于某家公司的FPGA产品,因此本书的Verilog HDL程序文件可以很方便地移植到Altera公司的FPGA产品上。如果程序中应用了IP核资源,由于两家公司的IP核不能通用,这就需要根据IP核的功能参数,在另外一个平台上重新生成IP核,或编写Verilog HDL代码来实现。

        有人曾经说过,“技术只是一个工具,关键在于思想”。将这句话套用过来,对于本书来讲,具体的开发平台和HDL语言只是实现技术的工具,关键在于设计的思路和方法。读者完全不必要过于在意开发平台的差别,相信只要掌握本书所讲述的设计思路和方法,加上读者已经具备的FPGA开发经验,采用任何一种FPGA平台都可以很快地设计出满足用户需求的产品。

     

    本书的目标

        数字信号处理FPGA设计知识的学习难度较大,不仅需要读者具有较扎实的理论知识,还要具备一定的FPGA设计经验。本书的目的正是架起一座教科书理论与工程设计实践之间的桥梁,通过具体的设计实例,详细讲解从理论到工程实现的方法、步骤和过程,以便于工程技术人员尽快掌握利用FPGA平台实现数字信号处理技术的基本方法,提高学习效率,为后续继续学习数字信号处理、数字通信技术FPGA设计等综合知识打下坚实的基础。

        通常来讲,一名电子通信专业的技术人员,在从业之初都会遇到类似的困惑:如何将从教材中所学的理论与实际中的工程设计结合起来?如何能够将这些教材中的理论转换成实际的电路?绝大多电子信息类教材对原理讲解十分透彻,但理论与实践之间显然需要有一些可以顺利通过的桥梁。一个常用的方法是通过采用MATLAB等工具进行软件仿真的方法来加深对理论的理解,但更好的方法是直接参与工程的设计与实现。

        然而,刚毕业的工科院校学生极少有机会参加实际工程设计,工作中往往感到学校所学的理论知识很难与实际工程产品的实现联系起来。教科书上多是讲解原理性的内容,即使可以很好地解答教材后面的习题,或者说能够熟练地对书中的基本公式进行推导,在实际进行产品设计时,如何将这些理论及公式用具体的电路或硬件平台实现出来,仍然是摆在广大工程师面前的一个巨大难关。尤其对于数字信号处理专业来讲,由于涉及的理论知识比较复杂,真正进行工程设计时才发现根本无从下手。采用MATLAB、System View等软件对理论进行仿真,虽然可以直观地验证算法的正确性,并查看仿真结果,但这类软件的仿真毕竟只停留在算法或模型的仿真上,与真正的工程设计及实现完全是两个不同的概念。FPGA技术很好地解决了这一问题。FPGA技术本来就是基于工程应用的技术,其仿真技术可以很好地仿真产品实际的工作情况,尤其是时序仿真技术,在计算机上通过了时序仿真的程序设计,几乎不再需要修改就可以直接应用到工程中。这种设计、验证、仿真的一体化方式可以极好的将理论与工程应用结合起来,从而提高学习兴趣。

         目前,市场上已有很多介绍ISE、Vivado、Quartus等FPGA开发环境,以及VHDL、Verilog HDL等硬件编程语言的书籍。如果我们仅仅是使用FPGA来实现一些数字逻辑电路,或者理论性不强的控制电路设计,掌握FPGA开发工具及Verilog HDL语法就可以开始工作了。数字信号处理技术的理论性要强得多,采用FPGA平台实现数字信号技术的前提条件是对理论知识首先要有深刻的理解。在理解理论知识的基础上,关键的问题是根据这些理论或公式,利用FPGA的特点,找到合适的算法实现结构,理清工程实现的思路,并采用Verilg HDL等硬件编程语言对其进行正确的实现。

      在写作本书的过程中,兼顾数字信号处理的理论,以及工程设计过程的完整性,重点突出FPGA设计方法、结构、实现细节,以及仿真测试方法。在讲解理论知识的时候,重点从工程应用的角度进行介绍,主要介绍设计时必须掌握和理解的知识点,并且结合FPGA的特点进行讨论,便于读者尽快地找到理论与工程实现之间的结合点。在讲解实例的FPGA实现时,不仅绝大多数实例给出了完整的Verilog HDL程序代码,并且从思路和结构上对每段代码均进行了详细的分析和说明。根据作者的理解,针对一些似是而非的概念,结合工程实例的仿真测试加以阐述,希望能够对读者提供更多有用的参考。相信读者按照书中讲解的步骤完成一个个工程实例时,会逐步感觉到理论与工程实现之间完美结合的畅快。随着读者掌握的工程实现技能的提高,对数字信号处理理论知识的理解也必将越来越深刻,重新阅读以前学过的数字信号处理原理时,头脑里就更容易构建起理论与工程实现之间的桥梁。

     

    如何使用本书

        完成数字信号处理FPGA设计知识的学习,需要读者同时具备一定的FPGA设计和数字信号处理理论知识。为便于读者快速熟悉FPGA设计知识,本书前4章对Verilog HDL语言、ISE14.7开发环境等内容进行了精心编排,并以一个完整的流水灯设计实例详细介绍了FPGA设计的流程,为读者阅读后续章节打下基础。

        与普通的逻辑电路不同,数字信号处理的专业性强,掌握原理是完成FPGA设计的前提。MATLAB是完成数字信号处理设计不可或缺的工具,由于其易用性和强大的功能,在工程设计中的应用十分广泛。为准确理解数字信号处理知识的相关原理,书中部分实例采用MATLAB完成了理论仿真,并对代码进行了注释和说明,读者即使完全没有MATLAB设计基础,也很容易理解MATLAB程序的设计思路。

        完整的数字信号处理FPGA设计过程一般包括几个步骤:先采用MATLAB对需要设计的工程进行仿真,一方面仿真算法过程及结果,另一方面生成FPGA测试仿真所需的测试输入数据;而后在ISE14.7平台上编写Verilog HDL程序对实例进行设计实现;编写测试激励文件,采用ModelSim软件对Verilog HDL程序进行仿真;查看ModelSim仿真波形结果,验证程序功能的正确性;完成FPGA程序综合及布线,将程序下载到开发板上最终验证FPGA设计的正确性。

        验证工程实例程序是否正确,最直观的方法是采用示波器测试AD/DA端口的模拟信号,观察信号处理前后的变化是否满足要求。例如验证FIR低通滤波器电路,示波器通道1测试滤波前端DA信号的波形,通道2测试滤波处理后DA端信号的波形,对比分析滤波前后信号的波形就可以验证FIR低通滤波器功能是否正确。如果读者没有示波器,即使ModelSim仿真正确,毕竟不是真实的电路工作波形,这种情况下如何验证板载测试电路的功能呢?

          ISE14.7提供了功能强大的在线逻辑分仪软件工具ChipScope。将FPGA程序下载到开发板上以后,ChipScope可以实时地读取FPGA芯片的内部信号,以及指定管脚信号的波形。也就是说,采用ChipScope观察到的波形是电路实际工作的波形,而不是仿真的波形。因此,读者可以采用ChipScope工具测试工程实例下载到开发板上的工作情况。本书第4章介绍AD/DA接口设计时,详细讨论了ChipScope的使用方法和步骤,读者在掌握了ChipScope的使用方法之后,可以在板载测试程序中添加ChipScope核,实现电路工作波形的在线测试。

    致谢

        有人说,每个人都有他存在的使命,如果迷失他的使命,就失去了他存在的价值。不只是每个人,每件物品也都有其存在的使命。对于一本书来讲,其存在的使命就是被阅读,并给阅读者带来收获。数字信号处理的FPGA设计系列图书,能够对读者在工作及学习中有所帮助,是作者莫大的欣慰。

    作者在写作本书的过程中查阅了大量的资料,在此对资料的作者及提供者表示衷心的感谢。

        时间过得太快,大女儿这段时间正在全力准备中考,本书与读者见面时,她已经踏入高中阶段的学习了;小女儿正在牙牙学语,每天都在以她独特的语言和行为与这个世界进行友好交流。祝愿她们快乐成长。

          FPGA技术博大精深,数字信号处理技术理论难度大。本书虽尽量详细讨论了FPGA实现数字信号处理基本理论技术的相关内容,仍感觉到难以详尽叙述工程实现所有细节。相信读者在实际工程应用中经过不断的实践、思考及总结,一定可以快速掌握数字信号处理技术的工程设计方法,提高应用FPGA进行工程设计的能力。由于作者水平有限,不足之处在所难免,敬请读者批评指正。欢迎大家就相关技术问题进行交流,或对本书提出改进意见及建议。建议读者关注我的微信公众号以获得与该书相关的资料及信息,也可以发邮件与我进行交流。

     

    交流邮箱:duyongcn@sina.cn

    杜勇   

    2020年6月

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,738
精华内容 5,495
关键字:

fpga数字信号处理

友情链接: c++ student.rar