【Verilog】子模块连接相关问题(加法器及其优化)

一.通过wire变量达成不同子模块的互相连接

在这里插入图片描述

我们通过创建wire变量互通这几个子模块的q→d,然后通过端口名称互联子模块与顶层模块:
在这里插入图片描述

程序如下:
在这里插入图片描述
写出这个程序你需要知道的知识:
①子模块的定义,声明和调用(实例化)。
②子模块与顶层的连接方法(by name)。
③wire变量存放二进制信号,由此起到承接作用。
【练习地址链接:Module shift


二.稍复杂一些的例子

在这里插入图片描述
注意:
①此例不仅需要互联子模块,而且需要传输多位的信号。
②关键性的一步在最后四个8位信号经过“信号选择器”(梯形元件),并由一个二位信号sel控制输出。信号选择器的实现需要借助alway@(*)语句。

下图是wire和实例的一些名称规定:
在这里插入图片描述
程序如下:
在这里插入图片描述
【练习地址链接:Module shift8


三.加法器的设计

在这里插入图片描述
如图所示的32位加法器是将一个32位的信号拆分成“高16位”和“低16位”,分别运算再整合。其中cin和cout管控“进位”:低16位运算的进位通过cout传输给cin,低16位初始没有进位值,所以低16位加法器传入的cin==0。因此,每一个加法器实际上在运算a+b+cin。

上述的加法器其实是“全加器”,其内部是由多个“半加器”复合而成的:
在这里插入图片描述
每一个半加器(图中的add1)只能操作两个1位信号的加法运算。不难看出,一个“16位全加器”是由8个“半加器”复合而成的。

半加器输入两个一位信号,输出两个信号:“和”和“进位”,逻辑门如下:

sum = a ^ b ^ cin
cout = a&b | a&cin | b&cin

现在,我们通过代码来实现“半加器”:
(需要考虑半加器的逻辑门设计,不需要考虑半加器之间的连接)
在这里插入图片描述
【练习地址链接:Module fadd


四.加法器优化

“低16位”加法器通过cout向“高16位”传输进位信号,这个过程延迟相当大,需要优化:
在这里插入图片描述
优化方法即:多复制一份”高16位“加法器,不过一个cin=1,另一个cin=0。通过“低16位”输出的进位信号控制一个“选择器”,选择其中一个“高16位”的运算结果,最后再进行整合。这样就避免了“高16位”和“低16位”加法器之间的信号传输,降低了延时。

规定名称如下:
在这里插入图片描述

顶层程序如下:
在这里插入图片描述
【练习地址链接:Module cseladd

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
可以使用Python的os模块和正则表达式来实现统计Verilog代码行数的脚本。以下是一个示例代码: ```python import os import re def count_verilog_code_lines(file_path): """ 统计Verilog代码行数 """ with open(file_path) as f: content = f.read() # 去除注释 content = re.sub(r'//.*', '', content) content = re.sub(r'/\*.*\*/', '', content, flags=re.S) # 统计行数 lines = content.split('\n') code_lines = len([line for line in lines if line.strip() and not line.strip().startswith('//')]) return code_lines def count_verilog_module_code_lines(file_path): """ 统计Verilog模块及其模块的代码行数 """ # 统计当前文件的代码行数 code_lines = count_verilog_code_lines(file_path) # 统计模块的代码行数 with open(file_path) as f: content = f.read() # 匹配模块 modules = re.findall(r'module\s+(\w+)\s*\(', content) for module in modules: module_path = os.path.join(os.path.dirname(file_path), module + '.v') if os.path.exists(module_path): code_lines += count_verilog_module_code_lines(module_path) return code_lines if __name__ == '__main__': file_path = 'top.v' # Verilog文件路径 code_lines = count_verilog_module_code_lines(file_path) print('Verilog代码行数:', code_lines) ``` 在这个示例代码中,`count_verilog_code_lines`函数用于统计一个Verilog文件的代码行数,其中使用正则表达式去除了注释。`count_verilog_module_code_lines`函数用于统计一个Verilog模块及其模块的代码行数,它递归地调用了`count_verilog_code_lines`函数来统计代码行数。最后,在`main`函数中调用`count_verilog_module_code_lines`函数并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值