2015-05-26 4 views
-1

Мне нужно создать блок блокировки прав, который имеет 4 модуля (логика, поворот, поворот с переносом и арифметический сдвиг). Я написал каждый модуль индивидуально, и все они работают, но мне нужен мультиплексор, чтобы вспоминать каждый модуль в модуле сдвига.Подмодули мультиплексирования

module lshr(a,lout); 
    input [7:0]a; 
    output [7:0]out; 
    assign lout[7]=0; 
    assign lout[6:0]= a[7:1]; 
endmodule 

module rshr(a,rout); 
    input [7:0]a; 
    output [7:0]rout; 
    assign rout[7]=a[0]; 
    assign rout[6:0]= a[7:1]; 
endmodule 

module rcshr(a,cin,rcout); 
    input [7:0]a; 
    input cin; 
    output [7:0]rcout; 
    assign rcout[7]=cin; 
    assign rcout[6:0]= a[7:1]; 
endmodule 

module ashr(a,aout); 
    input [7:0]a; 
    output [7:0]aout; 
    assign aout[7]=a[7]; 
    assign aout[6:0]=a[7:1]; 
endmodule 

module mux418bit(a,b,c,d,s0,s1,e); 
    input[7:0]a,b,c,d; 
    input s0,s1; 
    output[7:0]e; 

module sru(a,cin,s0,s1,out); 
    input[7:0]a; 
    input cin 
    input s0,s1; 
    output[7:0]out; 
    ????? i dont know what to do here! 
endmodule 

ответ

0

Что вам нужно сделать, это использовать модули, которые вы создали, как подмодули в sru модуле, а именно:

module sru(a,cin,s0,s1,out); 
    input[7:0]a; 
    input cin; 
    input s0,s1; 
    output [7:0]out; 

    wire [7:0] lshr_out, rshr_out, rcshr_out, ashr_out; 

    lshr m1(a, lshr_out); 
    rshr m2(a, rshr_out); 
    rcshr m3(a, cin, rcshr_out); 
    ashr m4(a, ashr_out); 

    mux418bit m5(lshr_out, rshr_out, rcshr_out, ashr_out, s0, s1, out); 

endmodule 

Как вы можете видеть, ваш четыре модуля (lshr, rshr, rcshr, ashr) были объявлены как подмодули внутри sru (m1, ..., m5). Выход из этих модулей мультиплексируется (внутри m5 подмодуль) в зависимости от s0 и s1 значения (case за это отвечает за конструкцию).

Вы можете проверить, что данный код компилируется без ошибок here.

Еще одна вещь, ваш модуль mux418bit еще не закончен. Возможно, вы хотите добиться чего-то вроде этого:

module mux418bit(a,b,c,d,s0,s1,e); 
    input[7:0]a,b,c,d; 
    input s0,s1; 
    output reg [7:0]e; 

    always @(*) begin 
    case({s0,s1}) 
     2'b00 : e = a; 
     2'b01 : e = b; 
     2'b10 : e = c; 
     2'b11 : e = d; 
    endcase 
    end 

endmodule 

В ситуации, когда вы не можете использовать конструкцию case:

module mux418bit(a,b,c,d,s0,s1,e); 
    input[7:0]a,b,c,d; 
    input s0,s1; 
    output [7:0]e; 

    assign e = ({s0,s1} == 2'b00) ? a : 
      ({s0,s1} == 2'b01) ? b : 
      ({s0,s1} == 2'b10) ? c : d; 
endmodule 
+0

Спасибо за ответ, но мне сказали, что мой профессор не использовать случай и. ... Мне просто нужно добавить мультиплексор, чтобы указать вывод, но я не знаю, как это сделать! –

+0

@ZG: Я немного изменил ответ. Можете ли вы использовать 'case' внутри модуля' mux418bit'? Конструкция 'case' будет синтезирована для мультиплексора. – Qiu

+0

Нет, извините, я не профессионал в программировании с verilog. это пример, который она написала и попросила нас написать такой код. moduleAU (а, б, s0, s1, из, соиЬ, CIN); ввод [7: 0] a, b; вход cin, s0, s1; выход [7: 0]; выход cout; провод [7: 0] e; mux418bit mux (8'b00000000, b, ~ b, 8'b00000001, s0, s1, e); fulladder8bit fa8 (a, e, cin, cout, out); endmodule –

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