|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 ve8736 于 2010-4-16 12:22 编辑
我这两天用verilog编的ARM7与CPLD总线连接的程序,编完后用Jlink查看过ARM收发的数据,总线是好使的,就是说源模块代码没问题。现在问题就出在编写testbench仿真总线inout口,能看到测试模块给源模块的总线输入数据,但是看不到总线输出数据。在网上找了下资料,发现有建议用"assign DATA = (~nWE)?treg_DATA:16'hzzzz;assign DATA_OUT=(~nOE)?DATA:16'hzzzz;"这种方式,通过treg_DATA输入数据,DATA_OUT观察输出数据,但是试验了发现不行,总线输出仍然是高阻态。后来在weizhiheng的这个帖子http://www.eetop.cn/bbs/thread-245831-1-1.html里找到另外一种方法,像这样reg [3:0] dirdata$inout$reg = 4'b0000;wire [3:0] dirdata = dirdata$inout$reg; ,通过dirdata 观察输出,但是发现也不行。所以只能上网求助大家了。我先粘贴源模块代码:
module lpcbus(clk,ADDR,DATA,nOE,nWE,nCS,led);
input clk,nOE,nWE,nCS;
output led;
input [7:0]ADDR;
inout [15:0]DATA;
reg [15:0]DATAOUT;
wire link_bus;
assign link_bus=!nOE;
assign DATA=(link_bus)?DATAOUT:16'hzzzz;
reg [25:0]cnt;
always@(posedge clk) begin
cnt<=cnt+1;
end
assign led=cnt[25];
reg [15:0]ram,ram2;
always@(nWE or nCS or ADDR) begin
if((nCS==0)&&(nWE==0)) begin
case(ADDR)
16'h55: begin ram<=DATA; end
16'h77: begin ram2<=DATA; end
default:begin end
endcase
end
end
always@(nOE or nCS or ADDR) begin
if((nCS==0)&&(nOE==0)) begin
case(ADDR)
16'h66: begin DATAOUT<=ram; end
16'h88: begin DATAOUT<=ram2; end
default: begin end
endcase
end
else begin
DATAOUT<=16'hzzzz;
end
end
endmodule
功能及其简单,就是往0X55写数时,能从0x66里读出来,是用来测试总线用的,试验结果验证好用。
下面是测试代码testbench和仿真波形图:
`timescale 1 ns/ 1 ns
module lpcbus_vlg_tst;
reg [7:0] ADDR;
reg [15:0] treg_DATA;
reg clk;
reg nCS;
reg nOE;
reg nWE;
wire [15:0] DATA;
wire [15:0] DATA_OUT;
wire led;
assign DATA = (~nWE)?treg_DATA:16'hzzzz;
assign DATA_OUT=(~nOE)?DATA:16'hzzzz;
initial begin
clk=0; nWE=1; nOE=1; nCS=1;
end
always #10 clk=~clk;
always begin
#50 ADDR=8'h55;treg_DATA=16'h1234; nWE=0; nCS=0;
#50 nWE=1; nCS=1; treg_DATA=16'hzzzz;
#50 ADDR=8'h66; nOE=0; nCS=0;
#50 nOE=1; nCS=1;
#100 ;
end
lpcbus i1 (
.ADDR(ADDR),
.DATA(DATA),
.clk(clk),
.led(led),
.nCS(nCS),
.nOE(nOE),
.nWE(nWE)
);
endmodule
仿真波形如图所示:可以看到,第一种方式时总线输出为高阻态ZZZZ,见红线那部分。
然后我按照weizhiheng的方式改了下测试代码:
`timescale 1 ns/ 1 ns
module lpcbus_vlg_tst;
reg [7:0] ADDR;
reg clk;
reg nCS;
reg nOE;
reg nWE;
reg [15:0] DATA$inout$reg = 16'h0000;
wire [15:0] DATA = DATA$inout$reg;
wire led;
initial begin
clk=0; nWE=1; nOE=1; nCS=1;
end
always #10 clk=~clk;
always begin
#50 ADDR=8'h55;DATA$inout$reg=16'h1234; nWE=0; nCS=0;
#50 nWE=1; nCS=1; DATA$inout$reg=16'hzzzz;
#50 ADDR=8'h66; nOE=0; nCS=0;
#50 nOE=1; nCS=1;
#50 ;
end
lpcbus i1 (
.ADDR(ADDR),
.DATA(DATA),
.clk(clk),
.led(led),
.nCS(nCS),
.nOE(nOE),
.nWE(nWE)
);
endmodule
仿真波形如下: 可以看到,DATA上面还是高阻态。
我把整个工程都已经粘贴出来了,麻烦大家帮看看是什么问题,多谢了 |
|