Цель состоит в том, чтобы использовать ALU и регистр с разрешением и сбросом для увеличения 12-битного числа на 2.
Основная проблема заключается в том, что на моем Q должно быть выходное значение инкрементора, который я получаюошибка
"incrementor_tb.v: 14: предупреждение: порт 7 (Q) инкрементора ожидает 12 бит, получил 1. incrementor_tb.v: 14 :: заполнение 11 старших бит порта."
В дополнение к этому это не работает, я просто получаю X, когда пытаюсь показать свой Q.
Имейте в виду, я понятия не имею, что я делаю. Так что, может быть, много ошибок. Главное, что я не могу понять, это то, почему, когда я подключаю Q к выходу f alu, который должен быть суммой входов a и b (оба из которых 12-битные), я получаю 1-битный ответ. Алу я тестировал и все работает. Реестр тоже должен работать.
У меня есть основания полагать, что способ установки параметров выбора и значение b в моем alu могут быть неправильными. Я попытался передать биты непосредственно в s в alu в его инстанции в инкременторе, например .s(3'b000)
, но это не сработало, и я не был уверен, было ли это разрешено, поэтому я изменил его на то, что имею сейчас, и все еще получаюОшибка.
Вот файлы:
//12 bit alu
module alu(
input [11:0] a,
input [11:0] b,
input [2:0] s,
output [11:0] f,
output take_branch,
output ovf
);
reg [11:0] f;
reg take_branch;
reg ovf;
always @(s, a, b)
case(s)
3'b000: begin // was add a and b
take_branch = 0;
f = a + b;
ovf = (a[7] & b[7] & ~f[7]) | (~a[7] & ~b[7] & f[7]);
end
3'b001: begin //was bitwise inverse
take_branch = 0;
f = ~b;
ovf = 0;
end
3'b010: begin //bitwise and of a and b
take_branch = 0;
f = a & b;
ovf = 0;
end
3'b011: begin //bitwise or of a and b
take_branch = 0;
f = a | b;
ovf = 0;
end
3'b100: begin //arithmetic shift right
take_branch = 0;
f = a >>> 1;
ovf = 0;
end
3'b101: begin //logical shift left
take_branch = 0;
f = a << 1;
ovf = 0;
end
3'b110: begin //branch if equal
take_branch = (a == b);
f = 0;
ovf = 0;
end
3'b111: begin //branch not equal
take_branch = (a != b);
f = 0;
ovf = 0;
end
default: begin
take_branch = 0;
f = 0;
ovf = 0;
end
endcase
endmodule
Регистрация
// 12 bit registyer with enable
module register (
input clk,
input reset,
input en,
input [11:0] d,
output [11:0] out
);
reg out;
//async reset, synchronoyus enable
always @ (negedge clk, negedge reset)
if (reset) out <= 12'b000000000000;
else if (en) out <= d;
endmodule
инкремент
//increment by 2
module incrementor(baseNumber, clk, clear, inc, sel, incBy, Q);
input [11:0] baseNumber;
input clk;
input clear;
input inc;
input [2:0] sel;
input [11:0] incBy;
output [11:0] Q;
wire [11:0] reg_out;
//wire [11:0] Q;
//reg ovf;
//instantiate alu
alu myalu (
.a(reg_out), //in to out
.b(incBy),
.s(sel),
.f(Q),
.take_branch(),
.ovf()
);
//instantiate register
register myregister (
.clk(clk),
.reset(clear),
.en(inc),
.d(baseNumber),
.out(reg_out)
);
//assign q behavior
//assign q = q;
endmodule
и, наконец, файл тестового стенда
module incrementor_tb();
reg [11:0] baseNumber;
reg clear;
reg clk;
reg inc;
parameter [2:0] sel = 000;
parameter [11:0] incBy = 12'b000000000010;
wire Q;
incrementor uut (
.baseNumber(baseNumber),
.clk(clk),
.clear(clear),
.inc(inc),
.sel(sel),
.incBy(incBy),
.Q(Q)
);
initial
begin
clk=1'b0;
repeat (20)
#5 clk = ~clk;
end
initial
begin
#0 clear = 1'b1;
baseNumber = 12'b000000000001;
inc = 1'b1;
clear = 0;
$display(Q);
#100 clear = 1'b0;
end
initial
$monitor("time = %0d: Q = %1h", $time, Q);
endmodule