用于SRAM接口的Verilog双向总线

用于SRAM接口的Verilog双向总线,verilog,bidirectional,Verilog,Bidirectional,我们正试图在Terasic DE1 FPGA板上写入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 Pr

我们正试图在Terasic DE1 FPGA板上写入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
模块ram\u写入程序(
输入时钟,
输入复位,
输入V_门廊EN,
输入逻辑,
输入逻辑,
输入[17:0]逻辑写入地址,
输入[15:0]逻辑写入数据,
输入VGA_OE_N,
输入VGA\u CE\N,
输入[17:0]VGA\u读取地址,
输出[15:0]VGA_读取数据,
输出寄存器SRAM\u OE\N,
输出寄存器SRAM\u WE\N,
输出寄存器SRAM\u CE\N,
输出寄存器SRAM\u LB\N,
输出寄存器SRAM\u UB\N,
输出寄存器[17:0]SRAM_地址,
inout wire[15:0]SRAM_数据
);
reg[15:0]写入数据;
始终@(posedge CLK)
开始
writeData我认为:

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; 
“wire”数据类型没有内存,因此必须使用连续赋值,而不是始终块来赋值

相反,在这里:

assign SRAM_LB_N = 0; 
assign SRAM_UB_N = 0; 
您不能通过连续分配来分配reg类型,它必须在always块中分配。

我认为:

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; 
“wire”数据类型没有内存,因此必须使用连续赋值,而不是始终块来赋值

相反,在这里:

assign SRAM_LB_N = 0; 
assign SRAM_UB_N = 0; 

您不能通过连续分配来分配reg类型,它必须在“始终”块中分配。

感谢您的帮助,我们已将SRAM_LB_N和SRAM_UB_N更改为导线类型,但是我们仍然不确定如何修复SRAM_数据错误?inout端口可以是reg吗?尝试创建一个reg类型的SRAM\U DATA\U reg,通过always块进行分配,然后“分配SRAM\U DATA=SRAM\U DATA\U reg;”或者将其作为一种导线类型,只需执行以下操作:分配SRAM\u DATA=LOGIC\u WE\N?16'bZ:写入数据;感谢您的帮助,我们已将SRAM_LB_N和SRAM_UB_N更改为导线类型,但是我们仍然不确定如何修复SRAM_数据错误?inout端口可以是reg吗?尝试创建一个reg类型的SRAM\U DATA\U reg,通过always块进行分配,然后“分配SRAM\U DATA=SRAM\U DATA\U reg;”或者将其作为一种导线类型,只需执行以下操作:分配SRAM\u DATA=LOGIC\u WE\N?16'bZ:写入数据;