2012-04-17 9 views
1

Мы пытаемся записать на чип SRAM на плате Terasic DE1 FPGA, однако мы получаем ошибки, связанные с управлением с тремя состояниями. Ошибки заключаются в следующем:Двунаправленная шина Verilog для интерфейса SRAM

Error (10137): Verilog HDL Procedural Assignment error at inputOutputControl.v(32): object "SRAM_DATA" on left-hand side of assignment must have a variable data type 
Error (10137): Verilog HDL Procedural Assignment error at inputOutputControl.v(33): object "SRAM_DATA" on left-hand side of assignment must have a variable data type 
Error (10219): Verilog HDL Continuous Assignment error at inputOutputControl.v(52): object "SRAM_LB_N" on left-hand side of assignment must have a net type 
Error (10219): Verilog HDL Continuous Assignment error at inputOutputControl.v(53): object "SRAM_UB_N" on left-hand side of assignment must have a net type 

Модуль мы имеем проблемы с показано ниже, может кто-нибудь пролить свет на то, как мы можем получить эту работу?

module ram_writer(
input    CLK, 
input    RESET_N, 
input    V_PORCH_EN, 
input    LOGIC_WE_N, 
input    LOGIC_CE_N, 
input  [17:0] LOGIC_WRITE_ADDRESS,   
input  [15:0] LOGIC_WRITE_DATA, 
input    VGA_OE_N, 
input    VGA_CE_N, 
input  [17:0] VGA_READ_ADDRESS,  
output  [15:0] VGA_READ_DATA, 
output reg   SRAM_OE_N, 
output reg   SRAM_WE_N, 
output reg   SRAM_CE_N, 
output reg   SRAM_LB_N, 
output reg   SRAM_UB_N, 
output reg [17:0] SRAM_ADDRESS,  
inout wire [15:0] SRAM_DATA 
); 

reg [15:0] writeData; 

always @(posedge CLK) 
begin 
    writeData  <= LOGIC_WRITE_DATA;      
    VGA_READ_DATA <= SRAM_DATA; 
end 

always @((posedge LOGIC_WE_N or writeData)) 
begin 
    if(LOGIC_WE_N == 1) SRAM_DATA = 16'bZ; 
    else SRAM_DATA = writeData; 
end 

always @(posedge CLK) 
begin 
    if(V_PORCH_EN == 1) begin 
    SRAM_ADDRESS <= LOGIC_WRITE_ADDRESS; 
    SRAM_CE_N <= LOGIC_CE_N; 
    SRAM_WE_N <= LOGIC_WE_N; 
    SRAM_OE_N <= 1; 
    end 
    else begin 
    SRAM_ADDRESS <= VGA_READ_ADDRESS; 
    SRAM_CE_N <= VGA_CE_N; 
    SRAM_OE_N <= VGA_OE_N; 
    SRAM_WE_N <= 1; 
    end 
end 

assign SRAM_LB_N = 0; 
assign SRAM_UB_N = 0; 

endmodule 

ответ

1

Я думаю, что это:

Error (10137): Verilog HDL Procedural Assignment error at inputOutputControl.v(32): object "SRAM_DATA" on left-hand side of assignment must have a variable data type 
Error (10137): Verilog HDL Procedural Assignment error at inputOutputControl.v(33): object "SRAM_DATA" on left-hand side of assignment must have a variable data type 

Относится к этому:

if(LOGIC_WE_N == 1) SRAM_DATA = 16'bZ; 
else SRAM_DATA = writeData; 

'провод' Тип данных A не имеет памяти, так что вы должны назначить его с помощью непрерывного назначения, не всегда блокировать.

С другой стороны здесь:

assign SRAM_LB_N = 0; 
assign SRAM_UB_N = 0; 

Вы не можете назначить тип рег через непрерывное задание, он должен быть назначен в всегда блоке.

+0

Спасибо за помощь, мы изменили типы SRAM_LB_N и SRAM_UB_N на типы проводов, однако мы все еще не уверены в том, как исправить ошибку SRAM_DATA? Может ли inout port быть рег? –

+0

Попробуйте создать регрессивный тип SRAM_DATA_REG, который вы назначаете с помощью всегда блока, а затем назначьте SRAM_DATA = SRAM_DATA_REG; – Tim

+0

Или Сохраните его как тип провода и просто выполните: Назначить SRAM_DATA = LOGIC_WE_N? 16'bZ: writeData; – Morgan

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

  • Нет связанных вопросов^_^