有心情就赶紧多写几篇
根据我的学习习惯呢,总要先简单的搞个好玩的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
关于【描述】这个词:这段代码就是用一种HDL(硬件描述语言)的规则来描述了这堆电路,所以我们称之为描述。