2015-11-05 2 views
1

код стенда мультипликатора: -Пожалуйста, объясните этот код Verilog?

module ni(prod, a, b, busy, mc, mp, clk, start); 
output [15:0] prod; 
output [7:0] a, b; 
output busy; 
input [7:0] mc, mp; 
input clk, start; 
reg [7:0] A, Q, M; 
reg Q_1; 
reg [3:0] count; 
wire [7:0] sum, difference; 
always @(posedge clk) 
begin 
if (start) begin 

A <= 8'b0; 
M <= mc; 
Q <= mp; 
Q_1 <= 1'b0; 

count <= 4'b0; 
end 
else begin 

case ({Q[0], Q_1}) 
     2'b0_1 : {A, Q, Q_1} <= {sum[7], sum, Q}; 
     2'b1_0 : {A, Q, Q_1} <= {difference[7], difference, Q}; 
     default: {A, Q, Q_1} <= {A[7], A, Q}; 
     endcase 




count <= count + 1'b1; 
end 
end 
alu adder (sum, A, M, 1'b0); 
alu subtracter (difference, A, ~M, 1'b1); 
assign prod = {A, Q}; 
assign a = A; 
assign b = Q ; 
assign busy = (count < 8); 
initial 
    begin 
    $monitor($time,"prod=%b, A=%b, Q=%b, Q_1=%b, M=%d, sum=%d, difference=%d, busy==%b, mc=%b, mp=%b, clk=%b, start=%b", 
         prod, A, Q, Q_1, M, sum,difference, busy, mc, mp, clk, start); 
    end 
endmodule 
//The following is an alu. 
//It is an adder, but capable of subtraction: 
//Recall that subtraction means adding the two's complement-- 
//a - b = a + (-b) = a + (inverted b + 1) 
//The 1 will be coming in as cin (carry-in) 
module alu(out, a, b, cin); 
output [7:0] out; 
input [7:0] a; 
input [7:0] b; 
input cin; 

assign out = a + b + cin; 

endmodule 

я хочу знать, как эти строки кодов: -

case ({Q[0], Q_1}) 
      2'b0_1 : {A, Q, Q_1} <= {sum[7], sum, Q}; 
      2'b1_0 : {A, Q, Q_1} <= {difference[7], difference, Q}; 
      default: {A, Q, Q_1} <= {A[7], A, Q}; 
      endcase 

Объясните следующую логику: -

множитель и множимое помещают в регистрах Q и M соответственно. Существует также 1-битный регистр, помещенный логически справа от младшего значащего разряда (Q0) регистра Q и обозначенного Q-1; его использование объясняется в ближайшее время. Результаты умножения будут отображаться в регистрах A и Q . A и Q-1 - это , инициализированные до 0. Как и раньше, логика управления сканирует биты умножителя по одному за раз. Теперь, когда каждый бит проверяется, бит справа также рассматривается. Если два бита равны (1-1 или 0-0), то все биты регистров A, Q и Q-1 сдвигаются вправо 1 бит. Если два бита отличаются друг от друга, то умножитель добавляется к или , вычитается из регистра A , в зависимости от того, являются ли два бита 0-1 или 1-0. Следуя сложения или вычитания, происходит сдвиг вправо. В любом случае правый сдвиг таков, что крайний левый бит А, а именно An-1, не только смещается в An-2, но также остается в An-1. Требуется , чтобы сохранить знак числа в A и Q. Он известен как арифметический сдвиг , потому что он сохраняет бит знака.

+0

Если бы я был вами, я бы, вероятно, написал код testbench и смоделировал дизайн, чтобы увидеть, как модуль работает внутри. – vipin

+0

ya спасибо за ваш совет, я уже понял этот код, моделируя дизайн и внимательно наблюдая за результатами. –

ответ

0

Фактически оператор {} объединяет сумму [7], сумму и Q и присваивает их левым переменным в порядке, указанном i.e A, Q, Q-1. Слева бит A остается таким, какой он есть.

Смежные вопросы