2013-08-31 109 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完成和重复。

注意:如果注释掉的代码是不相关的问题,可以将其除去,这是很好的做法,你的问题减少到重现该问题所需的代码的最小量。

相关问题