FPGA设计中的模块化设计

时间:2025-04-28  作者:Diven  阅读:0

  模块化设计是FPGA设计中一个很重要的技巧,能够使一个大型设计的分工协作、仿真测试更加容易,代码维护或升级也更加便利。

FPGA设计中的模块化设计

  如图3.28所示,一般整个设计工程的顶层文件里只做例化,不做逻辑处理。顶层模块下会包含多个子模块,比如图中的模块A、模块B、模块C等等,而模块A、B、C下又可以再为分多个子模块实现,如A模块可以包含子模块A1、A2和A3等。

图3.28 模块设计示意图

  采用模块化的设计,就可以将大规模复杂系统按照一定规则划分成若干模块,然后对每个模块分别进行设计输入、综合与实现,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果进行整合集成,就能完成整个系统的设计。

  模块化设计的实现一般包含以下步骤。

●初始预算,本阶段是实现步骤的第一步,对整个模块化设计起着指导性的作用。在初始预算阶段,项目管理者需要为设计的整体进行位置布局,只有布局合理,才能够在最大程度上体现模块化设计的优势;反之,如果因布局不合理而在较后的阶段需要再次进行初始预算,则需要对整个实现步骤全面返工。

●子模块的设计实现,在该阶段,每个项目成员并行完成各自子模块的实现。

●模块的最终集成,在该阶段项目管理者将顶层的实现结果和所有子模块的实现结果进行整合集成,完成整个设计的实现。

  模块划分的基本原则是:各个子模块的功能相对独立,模块内部联系尽量紧密,模块间的连接尽量简单。对于那些难以满足模块划分准则的具有强内部关联的复杂设计,并不适合采用模块化设计方法。

  以工程note10_prj004为例,我们用模块复用的方式,在顶层模块vlg_design.v下定义了4个子模块uut1_pulse_counter.v、uut2_pulse_counter.v、uut3_pulse_counter.v和uut4_pulse_counter.v,这4个子模块虽然代码一样,都是pulse_counter.v这个模块的代码,但是由于引到顶层模块的接口信号不同,所以最终实现了4个完全独立的模块,即4个完全相同的硬件电路。

图3.29 代码的模块化层次视图

  顶层模块vlg_design.v中没有逻辑处理的代码,只有子模块的例化和接口的连接。代码如下。

Module vlg_design(

input i_clk,

input i_rst_n,

input[3:0]i_pulse,

input i_en,

output[15:0]o_pulse_cnt1,o_pulse_cnt2,

output[15:0]o_pulse_cnt3,o_pulse_cnt4

);

pulse_counter uut1_pulse_counter(

.i_clk                  (i_clk),

.i_rst_n             (i_rst_n),

.i_pulse             (i_pulse[0]),

.i_en                   (i_en),

.o_pulse_cnt    (o_pulse_cnt1)

);

pulse_counter uut2_pulse_counter(

.i_clk                  (i_clk),

.i_rst_n             (i_rst_n),

.i_pulse             (i_pulse[1]),

.i_en                   (i_en),

.o_pulse_cnt    (o_pulse_cnt2)

);

pulse_counter uut3_pulse_counter(

.i_clk                  (i_clk),

.i_rst_n             (i_rst_n),

.i_pulse             (i_pulse[2]),

.i_en                   (i_en),

.o_pulse_cnt    (o_pulse_cnt3)

);

pulse_counter uut4_pulse_counter(

.i_clk                  (i_clk),

.i_rst_n             (i_rst_n),

.i_pulse             (i_pulse[3]),

.i_en                   (i_en),

.o_pulse_cnt    (o_pulse_cnt4)

);

endModule

  下面是对pulse_counter.v模块的例化代码。

pulse_counter uut1_pulse_counter(

.i_clk                  (i_clk),

.i_rst_n             (i_rst_n),

.i_pulse             (i_pulse[0]),

.i_en                   (i_en),

.o_pulse_cnt    (o_pulse_cnt1)

);

  以上面这段代码为例,模块例化大体有下面几个要点:

● pulse_counter是原始工程源码本身的模块名称,同一个工程源码,可以多次被例化。

●uut1_pulse_counter的名称是可以随意起的,只要不和已有的名称重名即可,表示我们对当前例化模块pulse_counter.v的唯一识别名。在这个工程中,我们看到pulse_counter.v模块被例化了多次,但和uut1_pulse_counter对应位置的命名是不一样的,而且必须是不一样的,表示工程中有多个完全一样的功能模块。这和软件程序里面的调用不一样,软件程序由于运行起来总是串行的,所以多次调用同一个函数时,这个函数可以只占一个函数所需的物理存储空间即可;但是FPGA是并行处理的,模块例化,哪怕是完全一样的模块,往往也是需要多个完全一样的物理资源与其对应的。

●“. i_clk (i_clk),”是接口的映射,“.(),”是固定格式。点号后面的i_clk是pulse_counter.v模块内部的接口,括号内的i_clk是vlg_design.v模块的接口。

  pulse_counter.v模块是具体的逻辑处理源码,其代码如下。

module pulse_counter(

input i_clk,

input i_rst_n,

input i_pulse,

input i_en,

output reg[15:0]o_pulse_cnt

);

reg[1:0] r_pulse;

wire w_rise_edge;

//////////////////////////////////////////

//脉冲边沿检测逻辑

always @(posedge i_clk)

if(!i_rst_n)r_pulse <= 2'b00;

else r_pulse<= {r_pulse[0],i_pulse};

assign w_rise_edge = r_pulse[0] & ~r_pulse[1];

//////////////////////////////////////////

//脉冲计数逻辑

always @(posedge i_clk)

if(i_en) begin

if(w_rise_edge)o_pulse_cnt <= o_pulse_cnt+1;

else;

end

elseo_pulse_cnt <= 'b0;

endmodule


审核编辑:刘清

猜您喜欢

可调电容是电子元器件中常用的。在电路中起到调节电容值的作用。很多人对可调电容型号不太了解,尤其是方向问题。本文将为大家详细介绍可调电容型号怎么看方向。理解可调电...
2025-03-26 07:01:38

2008-04-09 00:00:00

随着夏季严酷气候出现的频率增高,全球多个国家和地区接连出现自然灾害,对于个人、企业和社会造成了巨大经济损失,极端的气候状况也会间接导致设备故障率升高,影响企业效...
2023-08-09 14:32:00

选择合适的贴片电阻供应商很重要,直接影响产品质量和生产效率。以下推荐几家业内领先的贴片电阻供应商,排名不分先后:国巨(Yageo): 全球领先的被动元件供应商,...
2024-11-29 10:25:58

电子元器件中,二极管是重要的元件,而SS110二极管因其优良的特性应用于各类电子电路中。了解如何测量SS110二极管的好坏是电子工程师和爱好者的基本技能。本文将...
2025-04-04 08:00:35

射频模块是用于处理高频信号的电子组件,应用于通信、雷达、卫星、以及其无线应用中。基本功能是接收、放大、调制和解调射频信号,以确保信息的有效传输和接收。射频模块通...
2010-12-10 00:00:00

你是否曾经想过,如何用较低的电压获得更高的电压?比如,用一颗普通的电池驱动需要更高电压的电子元件?这时,三倍电荷泵就派上用场了。就像一个电压放大器,巧妙地将输入...
2024-03-27 00:00:00

光敏电阻是一种利用光电效应制成的电阻器,应用于光电传感器、自动照明、光控开关等领域。的工作原理基于材料对光的敏感性,能够在受到光照时改变其电阻值,从而实现对光强...
2025-03-19 08:31:07

调心滚子轴承是应用于机械设备中的重要部件,根据不同的结构和应用场景,可以分为几种主要类型。按滚子形状分类,调心滚子轴承可分为圆柱滚子轴承和球面滚子轴承。圆柱滚子...
2012-09-21 00:00:00

夹纸器是常用的文具工具,主要用于将纸张固定在一起,防止其散落或混乱。通常由金属或塑料制成,外形呈夹子状,具有简单而实用的设计。夹纸器的工作原理是通过弹簧的力量,...
2022-06-01 00:00:00