FPGA设计技巧:
1:一款好用的编辑软件:
其实我们完全可以使用Vivadao或者Quartus自带的编辑代码软件。这两个我都用过,但是说实在的我是都用过了,着实一搬般。然后推荐一下我一直在用的编辑软件:Notepaid++。体积小,插件多,字体可调,语法高亮。
2:Verilog基本语法:
现在我们来复习一下Verilog的基本语法吧:
module…endmodule(每个模块,必不可少的)
input output inout (端口声明语句)
wire reg (声明数据类型,默认是wire型)
parameter (常量定义)
if…else if…else…(条件判断语句)
!= , == , >= (等逻辑判断条件)
case…default…endcase(状态机)
always (块)
task…endtask(任务语句)
3:if…else 和 case 的区别:
其实二者之间并没有区别。形式上来看,if…esle 有明显优先级,case 则是并行运行的。但是现阶段,综合逻辑的功能足够强大,那么两者之间就没有明显的区别了,所消耗的资源和执行的速度是一样的。注意一下case 是可以用拼接的形式做组合的。少用优先级的语句,因为他们更加的占用资源。
4:inout:
inout 其使用的比较少,需要注意的是,我们不能同时把inout 即作为输入,又同时作为输出。
5:4输入LUT结构
这个涉及到查找表的相关知识,就是我们应该如何最大限度的发挥FPGA的能力,充分的利用FPGA的资源。四个输入当然是最大程度的利用了资源,但是我们在实际的使用过程中很难真的满足这个需求。
6:状态机的设计
什么是状态机,其实简单来说,我认为就是描述状态变化的逻辑电路。很典型的就是SDRAM控制器的设计,我们需要控制SDRAM的不同状态满足SDRAM(IDEL,WR,RD)的不同设计功能。
状态机又分为:一段式状态机,二段式状态机,三段式状态机。单纯从形式上来区分的:那就是看有几个always块了,但是请搞清楚他们之间最显著的区别在于内在的逻辑:
一段式状态机(逻辑简单,大包大揽,不利维护,最好不用):
always@(posedge clk or negedge rst)
if(!rst)begin
cstate <= IDEL;
cmd <= 3'b111;
end
else
case(cstate)
IDEL:
if(wr_req)begin
cstate <= WR_S1;
cmd <= 3'b011;
end
else if (rd_req)begin
cstate <= RD_S1;
cmd <= 3'b011;
end
else begin
cstate <= IDEL;
cmd <= 3'b111;