module tff(t,i,qbprev,q,qb);
input t,i,qbprev;
output q,qb;
wire q,qb,w1;
begin
assign w1=qbprev;
if(w1==1)begin
not n1(i,i);
end
assign q=i;
not n2(qb,i);
end
endmodule
module counter(a,b,c,cin,x0,x1,x2);
input a,b,c,cin;
output x0,x1,x2;
reg a,b,c,x0,x1,x2,temp,q,qb;
always@(posedge cin)
begin
tff t1(.t(1) ,.i(a),.qbprev(1),.q(),.qb());
x0=q;
temp=qb;
tff t2(.t(1) ,.i(b),.qbprev(temp),.q(),.qb());
x1=q;
temp=qb;
tff t3(.t(1) ,.i(c),.qbprev(temp),.q(),.qb());
x2=q;
a=x0;
b=x1;
c=x2;
end
endmodule
这是我在verilog中的代码。我的输入是 - 初始状态 - a,b,c和cin
我遇到很多错误,其中第一个是“w1不是常数”这是什么意思?
我也得到错误“非网络端口a不能是模式输入”但是我想要一个输入!
谢谢。
答案 0 :(得分:3)
模块被实例化为硬件。它们不是软件调用,因此您无法动态创建和销毁硬件:
if(w1==1)begin
not n1(i,i);
end
考虑到这一点,我希望你能看到,除非w1是一个常量参数,这是'生成if'你的描述没有意义。
实例n1未根据需要调用或创建,它必须始终存在。
此外,您的输入和输出已连接到i
。 i
代表一条物理线,它不是我而不是我。这些需要用不同的名称来表示不同的物理线路。
在你的第二个模块中,你有:
input a,b,c,cin;
// ...
reg a,b,c; //...
警告说输入不能是regs,只是不要将它们声明为regs。
input a,b,c,cin;
output x0,x1,x2;
reg x0,x1,x2,temp,q,qb;