2013-08-31 61 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模塊中的初始塊,並在其確認信號我已經啓用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碼以上的規定,並經上述

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

什麼是你得到錯誤的結果?你想要的結果是什麼?你的測試平臺代碼在哪裏? – toolic

回答

2

只是爲了闡明Verilog是一個硬件描述,並且兩個實例(不是模塊,作爲一個未被實例化的模塊都不存在)可以並行執行並存在,不像C等價物將會一個執行另一個。

如果您有實例A和B,你只需要一個FSM(有限狀態機),以使等待其完成信號,然後禁用啓用B,等待B完成和重複。

注意:如果註釋掉的代碼是不相關的問題,可以將其除去,這是很好的做法,你的問題減少到重現該問題所需的代碼的最小量。

相關問題