Verilog - проблема с основным модулем для сумматора - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь написать код, который моделирует входной регистр с 8 битами, который выводит сумму входных данных.Модель также содержит часы, активируют и сбрасывают вывод.

Я начал эту проблему, сначала создав 1-битный и 8-битный сумматор, как показано ниже.(Следует отметить, что меня не интересует вывод для MSB).

module adder_1bit(A,B,Cin,S,Cout);

input A,B,Cin;
output  Cout,S;
wire   W1, W2, W3;
assign W1 = A ^ B;
assign W2 = Cin & W1;
assign W3 = A & B;
assign S = Cin ^ W1;
assign Cout = W2 | W3;

endmodule

module adder_8bit(Din,Sum);
input [7:0] Din;
output [7:0] Sum;
wire [7:0] C;

adder_1bit M1(Din[0],Din[0],1'b0,Sum[0],C[0]);
adder_1bit M2(Din[1],Din[1],C[0],Sum[1],C[1]);
adder_1bit M3(Din[2],Din[2],C[1],Sum[2],C[2]);
adder_1bit M4(Din[3],Din[3],C[2],Sum[3],C[3]);
adder_1bit M5(Din[4],Din[4],C[3],Sum[4],C[4]);
adder_1bit M6(Din[5],Din[5],C[4],Sum[5],C[5]);
adder_1bit M7(Din[6],Din[6],C[5],Sum[6],C[6]);
adder_1bit M8(Din[7],Din[7],C[6],Sum[7],C[7]);

endmodule

Затем я сделал тестовый стенд, и все работало нормально.Моя основная проблема заключается в объединении этих модулей с моим кодом clk, enable и rst.Это было у меня сейчас.Когда мой вывод сброса высокий, мой выходной сигнал равен 0. Я также должен проверить, является ли MSB отрицательным, чтобы убедиться, что я преобразовал его в положительное значение (часть моей проблемы).

module Main(Data_in,Start,rst,clk,Sum_Abs);

input rst, clk, Start;
input [7:0] Data_in;
output  [7:0] Sum_Abs;
reg [7:0] Sum_Abs;
reg [7:0] Data_in_buffer;

adder_8bit M9(Data_in_buffer,Sum_abs);

always @(posedge clk)
begin
    if(rst == 1'b1)
        begin
            Sum_Abs = 8'b00000000;      
        end 
    else if(Start == 1'b1)
        begin
            case(Data_in)
            8'b1xxxxxxx: Data_in_buffer = ~Data_in + 1'b1;
            8'b0xxxxxxx: Data_in_buffer = Data_in;
            endcase     
        end 
end
endmodule

Этогде моя проблема возникает.Когда я создаю тестовый стенд, как показано ниже, мой вывод для суммы всегда равен 'x'.Моя проблема должна быть из основного модуля, так как мои предыдущие тесты у меня не было этой проблемы.Я относительно новичок в Verilog, и любые советы или помощь будут благодарны, спасибо!

module Main_tb;

integer k;
reg signed [7:0] Din_tb;
reg str, rst_tb, clk_tb;
wire signed [7:0] Sum_tb; 

Main DUT(Din_tb,str,rst_tb,clk_tb,Sum_tb);

initial begin
$display("\tData,\tOutput");
$monitor("\t%d,\t%d",Din_tb,Sum_tb); 
Din_tb = 8'b00000001;
clk_tb = 0;
str = 1'b1;
rst_tb = 1'b0;

#5 clk_tb = 1;
#5 Din_tb = 8'b00000010;
#5 clk_tb = 0;
#5 Din_tb = 8'b00000100;
#5 clk_tb = 1;
#5 Din_tb = 8'b00001000;
#5 clk_tb = 0;
#5 Din_tb = 8'b00100000;
#5 clk_tb = 1;

end

endmodule 

1 Ответ

0 голосов
/ 19 мая 2018

У вас есть ошибки в нескольких местах:

В модуле Main Sum_Abs управляется из двух мест.По сбросу и выходит из модуля М9.Вы не можете сделать это.Подумайте о HDL как об аппаратном: вы только что соединили два выходных порта вместе, используя один и тот же провод.
Просто сделайте это:

if(rst == 1'b1)
   Data_in_buffer <= 8'b00000000;      

Затем вы допустите орфографическую ошибку в Main:

output  [7:0] Sum_Abs;
//                ^Upper case!
adder_8bit M9(Data_in_buffer,Sum_abs);
//                               ^ Lower case

Следующая ошибка понятна, и она здесь:

case(Data_in)
8'b1xxxxxxx: Data_in_buffer = ~Data_in + 1'b1;
8'b0xxxxxxx: Data_in_buffer = Data_in;
endcase     

Вы предполагаете, что биты LS 7 игнорируются.Но оператор case действительно ищет буквальное значение 8'b1xxxxxxx, таким образом с x-es.
Вы можете использовать:

casez(Data_in)
8'b1zzzzzzz: Data_in_buffer <= ~Data_in + 1'b1;
8'b0zzzzzzz: Data_in_buffer <= Data_in;
endcase     

Но гораздо проще взглянуть набит MS:

if (Data_in[7]=1'b1)
  ....

Четвертая ошибка заключается в том, что вы используете блокирующие назначения в синхронизированной секции.Если вы обратили внимание, то увидите, что я заменил все ваши = на <= в новом коде.</p>

Пятая ошибка в вашем тестовом стенде: вы недостаточно быстро меняете время.Код только смотрит на передний фронт, и вы меняете входной сигнал на переднем и заднем фронтах.Это не лучший способ сделать часы.Что, если вам нужно смоделировать миллион часов?

Вот как вы делаете часы:

initial
begin
   clk_tb= 1'b0;
   forever
      #50 clk_tb= ~clk_tb; // clock period of 100 time units
end

После всего, что что-то выходит, но я не проверял, выходят ли правильные значения,Я оставляю это тебе.

...