5722|7

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个关于 verilog 层次化设计的简单问题 -- 如何调用底层模块? [复制链接]

假设三个模块module top_m, bottom1_m, bottom2_m  分别存在于三个文件top.v, bottom1.v, bottom2.v  请问我要在top_m 模块内调用两个底层模块bottom1_m, bottom2_m  如何实现,如何链接?   实现后是否可综合?

请教各位大侠了!……

最新回复

`timescale        1ns/100ps module test();     parameter size=11;     reg[size:0]  d;     reg clk;                        wire[size:0] q;         always #5        clk=~clk;//100 is so long time         initial     begin             clk=0;             #10 d=0;             #10 d=1;             #10 d=2;             #10 d=3;             #10 d=4;             #10 $stop;     end                             reg12  t(.d(d),.clk(clk),.q(q)); // 位置映射 endmodule 以上示例代码  详情 回复 发表于 2007-10-16 00:58
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在Verilog中,调用底层模块的语法结构为:
   底层模块名 实例名 参数定义
比如在top_m里,如果已经全部源文件加到了同一个工程里,那么可以直接

bottom1_m bottom1_m(A,B,C)
注意 A,B,C这些参数的顺序,要和底层定义的是一致的。名字可以不一致。
如果没有加到同一个工程,可以使用
'include "bottom1.v"

可不可以综合,这个得看你代码怎么写的,和层次无关。
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
链接没问题了,但是我发现底层模块的调用是不能用在顶层模块的always语句后面的,那我想在顶层模块中重复调用底层module应该怎么办呢?
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
你得先把逻辑给出来,最好把你的代码贴出来。
always重复调用是有条件的,比如某个信号发生变化了。。。
抓住这个逻辑条件,就可以实现了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
module uart_top(clk, nreset, rec, send, data);
    input clk;
    input nreset;
    input rec;
    output send;
         
         
         parameter len = 16;
         output [len:0]data;

         uart_rec rec1( //底层模块1
         .rec(rec),
         .clk(clk),
         .nreset(nreset),
         .data(data)
         );
         
          uart_send send1(//底层模块2
          .data(data),
          .clk(clk),
          .nreset(nreset),
          .send(send)
          );         

endmodule

我就想 无条件循环调用uart_rec 和 uart_send   
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
原来是使用UART啊。你连什么时候需要收数据,什么时候需要发数据都没弄明白,呵呵。
你的子模块 uart_rec和uart_send模块我不知道具体的实现,只能告诉你:
第一,模块实例化以后,相当于一个实际的电路,是物理上存在的实体,并非函数。所以,不存在always调用这一说。如果你的子模块设计得当,那么,只要输入的信号满足你的条件,模块就有相应输出;
第二,你要看子模块的相关文档,如果是自己写的,要搞清楚UART时序;
第三,不要把接收寄存器(data)和发送寄存器用同一个,而且,17位的寄存器有点怪;
第四,你可以在代码里用always来完成判断什么时候该去从模块中读取数据(或者写入),什么时候复位等等。always后面的条件,可能是9个时钟(看你的UART设置),又或者是data被赋值或清空,这个要看子模块如何设计的;
第五,网络上有verilog或者VHDL实现UART的代码,google一下很容易找到,可以用来做参考,学习的效果应该比在这里问问题要强一点,也要连续一些。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
嗯 多谢指导 虚心接受  不过我的程序已经调通了  多谢多谢!!!
加分……
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
`timescale        1ns/100ps
module test();

    parameter size=11;

    reg[size:0]  d;
    reg clk;
                  
    wire[size:0] q;

   
    always #5        clk=~clk;//100 is so long time
   
    initial
    begin
            clk=0;
            #10 d=0;
            #10 d=1;
            #10 d=2;
            #10 d=3;
            #10 d=4;
            #10 $stop;
    end                        
    reg12  t(.d(d),.clk(clk),.q(q)); // 位置映射
endmodule
以上示例代码
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表