我们通过创建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`函数并输出结果。