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

  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/chengqi521/p/7727483.html
Copyright © 2011-2022 走看看