我们从2011年坚守至今,只想做存粹的技术论坛,记录你的技术足迹,有空就回来看看。  由于网站在外面,点击附件后可能要20秒才弹出下载,请耐心等待,勿重复点击

 找回密码
 立即注册
搜索
查看: 970|回复: 1

[技术文章] Xilinx FPGA 学习笔记(1)

[复制链接]
  • TA的每日心情

    昨天 08:46
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1万

    主题

    8132

    回帖

    4万

    积分

    三级逆天

    积分
    43823

    终身成就奖特殊贡献奖原创先锋奖金点子奖优秀斑竹奖宣传大使奖

    发表于 2017-10-25 09:50:33 | 显示全部楼层 |阅读模式




    一、时序设计
    方法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)begina = b;c = a;end       执行结果a的值是b,c的结果也是b。
    一般我们使用的都是非阻塞的赋值语句,这样可以很好地控制同步性。


    3、预处理命令`include file1.v`define X=1;`define Y;`ifdef YZ = 1;`elseZ = 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;endmoduleRTL视图




    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 begina =0; b=0; cin=0;for(i=1;i<16;i=i+1)#10 a = i;endinitial beginfor(j=1;j<16;j=j+1)#10 b = j;endinitial begin$monitor($time,,,"%d + %d + %b = {%b,%d}",a,b,cin,cout,sum);#160 $finish; //160ns 后仿真结束endendmodule

    仿真波形



    打印输出结果


    回复

    使用道具 举报

    该用户从未签到

    13

    主题

    73

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    QQ
    发表于 2017-10-26 22:20:22 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表