FPGA笔记(二)

      #对FPGA的一些理解


经过一周对FPGA的了解,对Verilog语法已经有一定的了解了,自己也写了些程序,但是感觉自己写出来的硬件描述语言程序不是那个味儿,就像一段式状态机跟三段式状态机相比一样,在我这所有的逻辑都放在一个always进程中,虽然目的都能达到,但是这么下去,越大的运用中会带来越大的问题(习惯的养成很重要)。我用Verilog建模(个人也倾向于不把Verilog的硬件描述当做写程序)跟写程序一样的感觉,在心中没有数电的思想,不能通过由逻辑电路图到Verilog描述(电路——>描述),不知啥时候才能有这种思路(我觉得这才是Verilog的真谛)。个人觉得FPGA更像是一堆pmos、nmos构成的电路,要一个非门就拿一个cmos,所有的逻辑门都可以由mos管构成,我们只是把他们通过一定的关系链接起来。所以,数电才是思想,Verilog只是实现手段,而FPGA是个试验台。


#一周的总结
永远的StreamLed!
学习51、avr等等各种单片机,都会以此为基础,虽然简单,但却是了解一款单片机的开始,学51时从这开始了解简单的delay,而后精确些的定时器,avr我没学,据说是操作每个端口的寄存器(51是直接操作端口),FPGA从此开始了解将时序逻辑加进去,并把并行的思想加进去。总觉得我不应该是单纯地在写代码,应该心中有电路(至少是个数据流程),然后用代码descripte整个数字逻辑,即想从RTL级出发,描述要实现的逻辑功能。
从最简单的入手吧,只是一个LED的闪烁,说起来简单,51里只要几句就行了,但是在FPGA里我用了老些篇幅了。
我的想法是,对于50M晶振的外部晶振,上升沿计数+1,计数满5000000,100ms变换一次,lED电平取反.ok,开始画RTL级流程图。我自己画的就不看了,画错了,画得也难看,大概就是如下图:
FPGA笔记(二)_第1张图片
感觉好low吧,哈哈,我也觉得。
module LedBlink(
CLK,
RST,
LED_OUT);

input CLK;
input RST;
output LED_OUT;

reg [22:0]Counter;

//wire LED_OUT;
reg LED_OUT_N;
//计数模块
always@(posedge CLK or negedge RST)
begin
if(!RST)
Counter<=23'd0;
else if(Counter==23'd5_000_000)
Counter<=23'd0;
else
Counter<=Counter+23'd1;
end

//LED显示模块
always@(posedge CLK or negedge RST)
begin
if(!RST)
LED_OUT_N<=1'b1;
else if(Counter==23'd5_000_000)
LED_OUT_N<=~LED_OUT;
end

assign LED_OUT=LED_OUT_N;

endmodule
看看这个RTL级视图与代码的关系,ADDER加法器直接用行为级描述“+”就行,Counter<=Counter+23'd1;实现的,Counter的D触发器是用always进程块(上升沿 or 下降沿触发)中Counter的非阻塞赋值来实现的,EQUAL比较器用行为描述是if(Counter==23‘d5_000_000),判断完之后重新给counter赋值,0 or 原数,此为俩路选择器,判断结果作为下一个D触发器(LED_OUT_N<=~LED_OUT)的使能端,进一次取反一次。
一次小小的尝试,过程坎坷,我会继续尝试,先用RTL级建模,然后用Verilog描述。


书上有路勤为径,学海无涯苦作舟!Just Fighting!

你可能感兴趣的:(FPGA)