写点什么

FPGA

用户头像
Kevin Z
关注
发布于: 2020 年 06 月 08 日
FPGA

在熟悉FPGA的过程中,准备用两个地方作为切入点。

  1. 从头实现power on sequence,用这个加强对verilog语法的熟悉

  2. 配置使用一个原厂的module,例如spi或者lpc再或者pcie这种




20200608

第一个目标基本实现,因为主要是对于对语言的熟悉,规则语法没有深究,主要在重温这种阻塞赋值以及小模块穿起来的方法。

但模块化编程最大的好处之一就是可以复用,这可能是为数不多的FPGA中可以复用的地方,基本上每一个power on的步骤都可以分为三步:

a. check if received sys_rst signal

b. make sure ex power rail is on and delay a certain time

c. make sure ex power rail is still and delay time is finished, then enable next power



代码如下所示(尴尬,InfoQ没支持verilog):

module power_on_bcm
(
input sys_clk,
input sys_rst,
input power_fg,
input reg power_on_count,
output reg power_en,
output reg syn_power_fg
);

reg [17:0] BCM_CNT;
always @(posedge sys_clk or negedge sys_rst) begin
if (~ sys_rst)
syn_power_fg <= 1'b0;
else
syn_power_fg <= power_fg;
end
end
always @(posedge clk or negedge sys_rst) begin
if (~ sys_rst)
BCM_CNT <= 18'b0;
else
begin
if (syn_power_fg == 1'b0)
BCM_CNT <= 18'b0;
else if (syn_power_fg == 1'b1 && BCM_CNT <= power_on_count)
BCM_CNT <= BCM_CNT + 1'b1;
else
BCM_CNT <= BCM_CNT;
end
end

always @(posedge clk or negedge sys_rst) begin
if (~ sys_rst)
power_en <= 1'b0;
else
begin
if (syn_power_fg == 1'b0)
power_en <= 1'b0;
else if (syn_power_fg == 1'b1 && BCM_CNT == power_on_count)
power_en <= 1'b1;
end
end
endmodule



如果采用这个方法,就只用更改这个module的输入入口,用generate方法去采用控制变量的方法来有一个统一的控制逻辑。

缺点就是如果有一些跨域跳转的地方要很小心的注明,后来者得先理解这种方法才能比较方便的进行更新,但优点就是代码简洁,比每个power rail重写一次上面的三步不知道高到哪里去了。



想到这里我突然更加明确了一些这段时间的目的,就是熟悉同一项目不同领域的工作方式,将他们的思路都归到自己心里,所以具体实现应该也不是必须的啦,只要确定此路可以通,我也基本走过一遍,那就够了,默默记下以后有机会的话为他们指明方向。




发布于: 2020 年 06 月 08 日阅读数: 46
用户头像

Kevin Z

关注

还未添加个人签名 2020.05.12 加入

还未添加个人简介

评论

发布
暂无评论
FPGA