#对FPGA的一些理解
#一周的总结
永远的StreamLed!
学习51、avr等等各种单片机,都会以此为基础,虽然简单,但却是了解一款单片机的开始,学51时从这开始了解简单的delay,而后精确些的定时器,avr我没学,据说是操作每个端口的寄存器(51是直接操作端口),FPGA从此开始了解将时序逻辑加进去,并把并行的思想加进去。总觉得我不应该是单纯地在写代码,应该心中有电路(至少是个数据流程),然后用代码descripte整个数字逻辑,即想从RTL级出发,描述要实现的逻辑功能。
从最简单的入手吧,只是一个LED的闪烁,说起来简单,51里只要几句就行了,但是在FPGA里我用了老些篇幅了。
我的想法是,对于50M晶振的外部晶振,上升沿计数+1,计数满5000000,100ms变换一次,lED电平取反.ok,开始画RTL级流程图。我自己画的就不看了,画错了,画得也难看,大概就是如下图:
感觉好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的心得,从简单的LED闪烁开始,通过RTL级建模和Verilog描述实现逻辑功能。文章介绍了计数模块和LED显示模块的设计,强调了理解数字逻辑并用代码描述的重要性。
&spm=1001.2101.3001.5002&articleId=51453552&d=1&t=3&u=fa8fd0982c434d43bbf065ed2d6001a7)
6万+

被折叠的 条评论
为什么被折叠?



