отзыв о мультиплексоре в verilog

Я выполняю расчет мультиплексора обратной связи с использованием Verilog. Но, тем не менее, система не отвечает (давая X) на один из входов, которым является B (вход, управляемый мультиплексором). Можете помочь мне указать, где ошибка и как ее исправить.

Вот коды:

module test(input sel,input [3:0]a,b,output [3:0]o);
localparam in_0 = 4'd0;
wire [3:0]w1;

assign w1 = a + b;
assign o = w1 | 4'd0;
assign b = (sel)?w1:in_0;

endmodule

Вот тестовый стенд:

module test_tb();

reg sel;
reg [3:0] a,b;
wire [3:0]o;

test U1(.sel(sel),.a(a),.b(b),.o(o));

initial begin
sel <= 1'b0;
a <= 4'd2;
#2;
sel <= 1'b1;
#2;
a <= 4'd1;
#2;
sel <= 1'b0;
a <= 4'd4;
#2;
end
endmodule

person Jack93    schedule 11.03.2015    source источник
comment
w1 имеет ширину всего 1 бит, должно быть 4.   -  person Morgan    schedule 11.03.2015
comment
@Morgan, извините за это, но все тот же результат после того, как w1 был изменен на 4-битную ширину.   -  person Jack93    schedule 11.03.2015
comment
b — вход, но вы опять пытаетесь написать (assign b = (sel)?w1:in_0;)   -  person Emman    schedule 11.03.2015
comment
@Emman, я хочу, чтобы b было равно 0, когда sel равно 0, а b является результатом предыдущего o, когда sel равно 1.   -  person Jack93    schedule 11.03.2015
comment
@ Jack93 Джек93 Эмманс сказал, что вы не можете перегружать ввод таким образом.   -  person Morgan    schedule 11.03.2015


Ответы (2)


По тестовому стенду (инициализация) кажется, что b не input (это просто выход мультиплексора)

Я думаю, вы хотите реализовать следующую схему:

введите здесь описание изображения

Но чтобы избежать создания циклов (когда sel=1), вы должны добавить в свой дизайн порт clk, чтобы управлять операцией:

module test(
    input  clk,
    input  sel,
    input  [3:0] a,
    output [3:0] o
);

    wire [3:0] b;
    reg  [3:0] w1;

    assign o = w1;
    assign b = (sel)?w1:4'd0;

    always @(posedge clk)
        w1 <= a + b;

endmodule
person Amir    schedule 11.03.2015
comment
Спасибо за помощь. Ваш метод работает хорошо, но я заметил, что в выводе есть задержка. Какой-нибудь метод побороть это? - person Jack93; 11.03.2015
comment
Можете ли вы объяснить больше о задержке? Выход обновляется при каждом переднем фронте тактового сигнала. Необходимо изменить входы и дождаться переднего фронта тактового сигнала, чтобы увидеть правильный результат, иначе (без тактового сигнала) будут созданы петли. - person Amir; 11.03.2015
comment
мой мультиплексор не работает в этом случае. Это из-за проблемы с синхронизацией? stackoverflow.com/ вопросы/29003167/ - person Jack93; 12.03.2015

Глядя на ваш пример:

module test(
  input sel,
  input [3:0] a,
  input [3:0] b,
  output [3:0]o
);
localparam in_0 = 4'd0;
wire [3:0]w1;

assign w1 = a + b;
assign o = w1 | 4'd0;
assign b = (sel)? w1 : in_0;

Обратите внимание, что с sel==1 у вас есть w1 = a+b и b =w1, что равно w1= a+w1; как комбинаторная петля. так не пойдет. Если бы внутри был триггер для разрыва петли, то он вел бы себя как аккумулятор.

Aa отметил Emman, что b является вводом и поэтому значение не может быть переопределено.

Эта строка assign b = (sel)? w1 : in_0; недействительна. Обратите внимание, что на самом деле он никогда не использует входное значение, поскольку оно полностью переопределяет его во всех ситуациях.

person Morgan    schedule 11.03.2015
comment
Добавив к этому, когда вы сделаете reg [3:0] b на своем тестовом стенде проводом [3:0] b, вы обнаружите бесконечный цикл (ошибки modelsim как: Предел итерации достигнут за время 2 нс.) см.: edaplayground.com/x/534 - person Emman; 11.03.2015