相关文章推荐
细心的桔子  ·  魔棒工具_百度百科·  4 月前    · 
重情义的毛巾  ·  yaml-cpp Tutorial - 知乎·  1 年前    · 

我们通过创建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

通过wire变量达成不同子模块的互相连接我们通过创建wire变量互通这几个子模块的q→d,然后通过端口名称互联子模块与顶层模块:程序如下:写出这个程序你需要知道的知识:①子模块的定义,声明和调用(实例化)。②子模块与顶层的连接方法(by name)。③wire变量存放二进制信号,由此起到承接作用。【练习地址链接:Module shift】稍复杂一些的例子注意:①此例不仅需要互联子模块,而且需要传输多位的信号。②关键性的一步在最后四个8位信号经过“信号选择器”(梯形元件),并由 mod_a instance1 ( wa, wb, wc ); 通过端口位置一一对应,以此来实现 两个 模块 之间的 连接 ,但当其中一个 模块 的端口位置发生改变,就需要对相应 连接 的线进行重新 连接 。及线 连接 的对象会因为端口位置的变化而变化。 By name mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) ); 该方法是...
问题 描述: 假设当前有 两个 verilog 模块 M1和M2,分别完成不同的工作,但是二者使用了相同的硬件信号线,比如相同的输入data_in ,输出信号线 data_out。在硬件 连接 层面的确只有两根信号线,data_in 和data_out ,但是在特定情况下,比如需要使用M1 模块 时,那么应当将信号线的输入输出 连接 到M1的响应信号上,怎样和M2区别开呢? 首先,在一个工程中何时运行M1,何时运行
//第二种写法是更加提倡的,因为这样会更加清楚对应关系 module_a u_name(a,b,c); module_a u_name(.in1(a),.in2(b),.out(c)); # 去除注释 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`函数并输出结果。