一步一步开始FPGA逻辑设计-快速上手篇

来源:互联网 发布:mac系统怎么看电脑空间 编辑:程序博客网 时间:2024/06/16 22:46

也许是我不会用吧,CSDN的Markdown太难用了,写起来太难看了,这是最后一篇用Markdown写

 根据我的学习习惯呢,总要先简单的搞个好玩的HelloWorld之流简单项目,先体验一把,有个整体的感性认识,然后开始系统学习。
 其实吧,我实在是想不起来我当初上手玩的是样的小练手了,但是我觉得流水灯应该是做过了,从51单片机,到430,到STM32,到ARM,到FPGA,我想流水灯应该是可以作为硬件界的HelloWorld吧。

那我们就开始流水灯吧!


流水灯就是这个东西

 当然我们做的流水灯不会这么高级的,可以说是一个简单的序列生成器,生成如下序列

时钟周期 序列 0 0000_0001 1 0000_0010 2 0000_0100 3 0000_1000 4 0001_0000 5 0010_0000 6 0100_0000 7 1000_0000

 反应在波形上就应该是这样的,上升沿我们作为时钟的有效沿,每次上升沿到来的时候波形变化。理想情况如下图,这幅图就是功能仿真时序图。


需要完成的波形图

 注意LEDs这一行(最后一行),序列是按照我们预想的方式变化,那么下面我们看这样子功能该如何描述成电路
注意:这里我使用【描述】,不适用【编程】,算是逻辑设计人员的小洁癖吧,我不喜欢称之为编程,虽然也没什么问题。后面再解释为什么要使用描述这个词吧

代码

 module top( // 定义一个名称为top的模块      input clk, // 定义一个输入端口,用来输入时钟      input rst, // 定义一个输入端口,用来输入复位      output reg [7:0]led // 定义一组输出总线,用来输出LED灯的序列,0:灭,1:亮       );      // 下面这个叫做 always块,描述了一组逻辑      always@(posedge clk)begin        if(rst)          led <= 8'b0000_0001; // 复位情况下输出        else         led <= {led[6:0],led[7]}; // 循环向左移位       end    endmodule // 所有代码必须组成一个module,用module/endmodule包含

就这么简单!
就这么简单!
就这么简单!

电路

 既然使用了【描述】,那么我们看一下这段代码出来的电路时什么样的。你可以将之理解为编译的结果,只是在逻辑里头,我们称之为综合Synthesis,综合的结果成为网表netlist


TOP模块的综合结果


模块内部是一对D触发器按照一定规则级联

 关于【描述】这个词:这段代码就是用一种HDL(硬件描述语言)的规则来描述了这堆电路,所以我们称之为描述。

0 0