2013-08-31 2 views
0

У меня есть разные модули, созданные в одном модуле. Я хочу выполнить их последовательно, у меня есть сигналы включения и подтверждения всех модулей, как я могу это сделать?Как включить встроенные модули в verilog

Ниже приводится код:

module memorycontroller(
    input [7:0] A, 
    input [7:0] B, 
    input [1:0] adrress, 
    input  clk, 
    output [7:0] A_mem, 
    output [7:0] B_mem 
); 
    reg   LMwrEnable, localmemEnable; 
    integer  LMwrack, localmemack; 
    reg [7:0] A1, B1; 

    initial 
    begin 
     LMwrEnable  = 1; 
     localmemEnable = 0; 
    end 

    memorywrite LMwr (
     .clk  (clk  ), 
     .A  (A   ), 
     .B  (B   ), 
     .adr  (adrress ), 
     .enable (LMwrEnable), 
     .ack  (LMwrack ) 
    ); 

    bram_tdp localmem (
     .a_clk (clk   ), 
     .a_wr (1'b0   ), 
     .a_addr (adrress  ), 
     .a_din (A1   ), 
     .a_dout (A_mem   ), 
     .b_clk (clk   ), 
     .b_wr (1'b0   ), 
     .b_addr (adrress+1'b1 ), 
     .b_din (B1   ), 
     .b_dout (B_mem   ), 
     .enable (localmemEnable), 
     .ack  (localmemack ) 
    ); 

    [email protected](posedge clk) 
    begin 
     if(LMwrack) 
     localmemEnable = 1; 
    end 


endmodule 

В первоначальном заявлении я включен только LMwr модуль в начальном блоке и на его Ack сигнала я включен модуль localmem в всегда блокировать, но это дает мне неправильный результат. Можете ли вы рассказать мне, как последовательно выполнять разные модули?

Ниже модуль memorywrite

module memorywrite(
    input clk, 
    input [7:0] A, 
    input [7:0] B, 
    input [1:0] adr, 
    input enable, 
    output ack 
    ); 
    wire [7:0] C,C1; 

bram_tdp localmem (
    .a_clk(clk), 
    .a_wr(1'b1), 
    .a_addr(adr), 
    .a_din(A), 
    .a_dout(C), 
    .b_clk(clk), 
    .b_wr(1'b1), 
    .b_addr(adr+1'b1), 
    .b_din(B), 
    .b_dout(C1), 
    .enable(enable), 
    .ack(ack) 
    ); 

endmodule 

Это выше код записывает в память.

Ниже фактический модуль памяти, которая записывается на 2-ом коде указано выше, и читать 1 код указанный выше

module bram_tdp #(
    parameter DATA = 8, 
    parameter ADDR = 2 
) (
    input enable, 
    output ack, 
    // Port A 
    input wire    a_clk, 
    input wire    a_wr, 
    input wire [ADDR-1:0] a_addr, 
    input wire [DATA-1:0] a_din, 
    output reg  [DATA-1:0] a_dout, 

    // Port B 
    input wire    b_clk, 
    input wire    b_wr, 
    input wire [ADDR-1:0] b_addr, 
    input wire [DATA-1:0] b_din, 
    output reg  [DATA-1:0] b_dout 
); 

// Shared memory 
reg [DATA-1:0] mem [(2**ADDR)-1:0]; 

// Port A 
always @(posedge a_clk) begin 
if(enable) begin 
    a_dout  <= mem[a_addr]; 
    if(a_wr) begin 
     a_dout  <= a_din; 
     mem[a_addr] <= a_din; 
    end 
    end 
end 

// Port B 
always @(posedge b_clk) begin 
if(enable) begin 
    b_dout  <= mem[b_addr]; 
    if(b_wr) begin 
     b_dout  <= b_din; 
     mem[b_addr] <= b_din; 
    end 

    end 
end 
assign ack=1; 
endmodule 

Здесь есть испытательный стенд:

module mmTesting; 

    // Inputs 
    reg [7:0] A; 
    reg [7:0] B; 
    reg [1:0] adrress; 
    reg clk; 

    // Outputs 
    wire [7:0] A_mem; 
    wire [7:0] B_mem; 

    // Instantiate the Unit Under Test (UUT) 
    memorycontroller uut (
     .A(A), 
     .B(B), 
     .adrress(adrress), 
     .clk(clk), 
     .A_mem(A_mem), 
     .B_mem(B_mem) 
    ); 

    initial begin 
     // Initialize Inputs 
     A = 0; 
     B = 0; 
     adrress = 0; 
     clk = 0; 

     // Wait 100 ns for global reset to finish 
     #100; 
     A = 5; 
     B = 5; 
     adrress = 0; 

     #100 A = 6; 
     B = 2; 
     adrress = 1; 


     // Add stimulus here 

    end 
    always #5 clk=!clk; 
endmodule 

Результат должен быть таким же, как то, что Я пишу в память.

+0

Каков неправильный результат, который вы получаете? Каков ожидаемый результат? Где ваш код testbench? – toolic

ответ

2

Чтобы уточнить, что Verilog - это аппаратное описание, и что оба экземпляра (а не модули как незакрепленный модуль не существуют) могут выполняться и существовать параллельно, в отличие от эквивалента C, который будет выполнять один, а затем другой.

Если у вас есть экземпляр A и B, вам просто нужен FSM (конечный автомат), чтобы включить ожидание его сигнала завершения, затем отключив A включить B, ожидая завершения и повторения B.

NB: если прокомментированный код не имеет отношения к вопросу, его можно удалить, это хорошая практика, чтобы уменьшить ваш вопрос до минимального количества кода, необходимого для воспроизведения проблемы.

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