zoukankan      html  css  js  c++  java
  • Xilinx FPGA 学习笔记

    一、时序设计

    方法1.通过状态机来实现,通过verilog控制FPGA,让它该快的时候快,该慢的时候慢。

    方法2.FPGA中运行CPU

           把逻辑控制顺序复杂的事情用C代码来实现,而实时处理部分用verilog实现,并且verilog这部分可以被C代码控制。Xilinx的FPGA目前支持的CPU有Microblaze,ARM9,POWERPC,其中Microblaze是软核,其余的两款是硬核。

      (1)软核就是用代码实现的CPU核,配置灵活;

       (2)硬核就是一块电路,已经做好了,不能再发生变化;

    软核灵活性好,但是要占用FPGA的资源。硬核不占用FPGA的资源,速度和性能更好。比如Xilinx的DDR内存控制器,就是一种硬核,其运行速度很高。

    二、基础语法

    1. always @(),括号里是*,表明是一直敏感的;

    2.   (1)   <=  非阻塞赋值,在一个always模块中,所有语句一起更新

        (2) =   阻塞赋值,或者给信号赋值,如果在always模块中,这条语句被立刻执行。

    非阻塞赋值

    always @(posedge clk)begin
          a <= b;
           c <= a;     
    end

    执行结果是a的值是b,c的结果依旧是a

    阻塞赋值

    always @(posedge clk)begin
         a = b;   
          c = a;
    end

           执行结果a的值是b,c的结果也是b。

    一般我们使用的都是非阻塞的赋值语句,这样可以很好地控制同步性。

    3、预处理命令
    `include file1.v
    `define X=1;
    `define Y;
    `ifdef Y
         Z = 1;   
    `else
          Z = 0;
    `endid

          有时候需要一些公共的宏参数,我们可以放在一个文件中,比如文件名XXX.v,。那么我们就可以 `include XXX.v ,就可以包含文件中定义的宏参数

    三、小练习

    1.加法器的设计

    module adder(
    input [3:0] a,
    input [3:0] b,
    input cin,
    output [3:0] sum,
    output cout
    );
    
    assign {cout,sum} = a + b + cin;
    endmodule

    RTL视图

    RTL 技术原理图

    仿真代码

    `timescale 1ns / 1ps  //1ns的仿真刻度,1ps的仿真精度
    //////////////////////////////////////////////////////////////////////////////////
    // Company:
    // Engineer:
    //
    // Create Date: 2017/10/22 10:47:58
    // Design Name:
    // Module Name: simu
    // Project Name:
    // Target Devices:
    // Tool Versions:
    // Description:
    //
    // Dependencies:
    //
    // Revision:
    // Revision 0.01 - File Created
    // Additional Comments:
    //
    //////////////////////////////////////////////////////////////////////////////////
    
    
    module simu(
    
    );
    
    reg [3:0] a;
    reg [3:0] b;
    reg cin;
    
    wire cout;
    wire [3:0] sum;
    
    reg [4:0] i,j; //中间变量
    
    adder inst(
    .a(a),
    .b(b),
    .cin(cin),
    .cout(cout),
    .sum(sum)
    
    );
    
    initial begin
    a =0; b=0; cin=0;
    for(i=1;i<16;i=i+1)
    #10 a = i;
    end
    
    initial begin
    for(j=1;j<16;j=j+1)
    #10 b = j;
    end
    
    initial begin
    $monitor($time,,,"%d + %d + %b = {%b,%d}",a,b,cin,cout,sum);
    #160 $finish; //160ns 后仿真结束
    end
    
    endmodule
    
    

    仿真波形

    打印输出结果

    转载自:https://www.mianbaoban.cn/blog/post/205279?utm_source=EETC%20Forum%20Alert&utm_medium=Email&utm_campaign=2017-10-25

  • 相关阅读:
    Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)
    不分享,用户很少,什么都没有,没有秒传
    Entity Framework 5.0系列之约定配置
    学习SQL关联查询
    SQL语句调优
    数组总结篇(上)
    实现同一套代码针对不同平台工程的编辑和编译
    dispatch队列
    SOCKET网络编程快速上手(一)
    Javascript判断两个日期是否相等
  • 原文地址:https://www.cnblogs.com/chengqi521/p/7727483.html
Copyright © 2011-2022 走看看