题目
本题给出了两个一位(4bit)的BCD数加法器,要求编写一个100位(400bit)的BCD数加法器。
代码
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
reg cout_[399:0];
genvar i;
generate
begin:bcd
for(i=0;i<400;i=i+4)
begin:hj
if(i==0)
bcd_fadd s_c(a[i+3:i],b[i+3:i],cin,cout_[i],sum[i+3:i]);
else if(i==396)
bcd_fadd s_c(a[i+3:i],b[i+3:i],cout_[i-4],cout,sum[i+3:i]);
else
bcd_fadd s_c(a[i+3:i],b[i+3:i],cout_[i-4],cout_[i],sum[i+3:i]);
end
end
endgenerate
endmodule
解析
第一次用always语句一直报错,原因是该模块中需要实例化bcd_fadd模块100次,always语句不支持重复实例化的语法。因此使用generate语句。以下是在知乎csdn整理的generate语句用法。
Verilog中的generate语句常用于编写可配置的、可综合的RTL的设计结构。它可用于创建模块的多个实例化,或者有条件的实例化代码块。然而,有时候很困惑generate的使用方法,因此看下generate的几种常用用法。
我们常用generate语句做三件事情。一个是用来构造循环结构,用来多次实例化某个模块。一个是构造条件generate结构,用来在多个块之间最多选择一个代码块,条件generate结构包含if–generate结构和case–generate形式。还有一个是用来断言。
generate语法拓展:
generate语句主要有generate_for,generate_if 和generate_case三种语句。其中generate _if 和generate_case语句所表达的意思是一样的。
generate_for:首先使用genvar定义一个正整数变量,用来作为for循环中的变量,一般用i来表示。其次将需要复制的语句写到begin…end的模块中去。需要注意到的是begin…end模块必须为有名块,方便在代码中调用。
genvar i;//i为正整数变量
generate for()
begin:eg //begin...end的名字为eg
//需要复制的语句
end
endgenrate
generate_if和generate_case :这两者的语句不需要定义genvar语句,在电路中相当于判断电路。
generate
if(//判断表达式)
//判断表达式为1的被执行语句
else if(//判断表达式)
//判断表达式为1的被执行语句
else
endgenerate
generate
case(//控制表达式)
值1: 语句块1;
值2: 语句块2;
...
值n: 语句n;
default: 语句n+1;
endcase
endgenerate
部分代码数据来自:https://blog.csdn.net/weixin_46817835/article/details/124033309