想询问下这段组合逻辑综合后,为什么GPMEMRD_o和GPMEMWR_o被提前上拉了呢
clk, rst, gpcs6, gpcs6_o, rd, wr, addr, data,
GPMEMRD_o,GPMEMWR_o,GPALE_o
);
//------------input-------------------------------------
input clk; // 时钟信号
input rst; // 复位信号
//input cs; // 片选信号
input rd; // 读信号
input wr; // 写信号
input [14:1] addr; // 地址线
input gpcs6;
//------------output-------------------------------------
output gpcs6_o;
output GPMEMRD_o; // 读信号
output GPMEMWR_o; // 写信号
output GPALE_o; // ale信号
//------------bidirection--------------------------------
inout [15:0]data; //
//-----------insinside use def------------
reg GPMEMRD_o; // 读信号
reg GPMEMWR_o; // 写信号
reg GPALE_o; // ale信号
reg gpcs6_o; // cs
//=====================================
parameter
Addr_DS_ADDR = 'h7a0, // option set reg
Addr_DS_RD = 'h7b0, // input data
Addr_DS_WR = 'h7c0, // crc result reg
Addr_DS_RST = 'h7d0;
reg addr_mark;
always @(rst or gpcs6 or addr[14:1] or wr or rd)// or AS_CNT_H or AS_CNT_L or RW_CNT or DS_CNT)
begin
if(!rst)
begin
gpcs6_o <= 1'b1; //CS
GPMEMRD_o <= 1'b1; //DS //RD
GPMEMWR_o <= 1'b1; //RW //WR
GPALE_o <= 1'b1; //AS
addr_mark <= 1'b1;
end
else
begin
if((addr == Addr_DS_ADDR) && (!gpcs6) )
begin
if(addr_mark)
begin
gpcs6_o <= 1'b0; //CS
if((!wr))
begin
gpcs6_o <= 1'b0; //CS
GPMEMRD_o <= 1'b1; //DS //RD
GPMEMWR_o <= 1'b1; //RW //WR
GPALE_o <= 1'b0; //AS
addr_mark <= 1'b0;
end else
begin
gpcs6_o <= 1'b1; //CS
GPMEMRD_o <= 1'b1; //DS //RD
GPMEMWR_o <= 1'b1; //RW //WR
GPALE_o <= 1'b1; //AS
addr_mark <= 1'b1;
end
end
//
//as_mark_H <= 1;
end
else
if((addr == Addr_DS_RD) && (!gpcs6) && (!rd))
begin
GPMEMRD_o <= 1'b0; //DS //RD
GPMEMWR_o <= 1'b1;
end
else
if((addr == Addr_DS_WR) && (!gpcs6) && (!wr))
begin
GPMEMWR_o <= 1'b0; //RW //WR
GPMEMRD_o <= 1'b1;
end
else
if((addr == Addr_DS_RST) && (!gpcs6))
begin
gpcs6_o <= 1'b1; //CS
GPMEMRD_o <= 1'b1; //DS //RD
GPMEMWR_o <= 1'b1; //RW //WR
GPALE_o <= 1'b1; //AS
addr_mark <= 1'b1;
end
end
end
endmodule
每次都是在GPMEMWR_o、和GPMEMRD_o拉低后大概140ns左右被拉高呢,确认不是被if((addr == Addr_DS_RST) && (!gpcs6))这段代码设置的,
顶起来啊,
不知道帮顶下
你的这段组合逻辑两处使用了锁存,也就是if else分支没有写完整,一处是if(addr_mark),
另一处是if((addr == Addr_DS_ADDR) && (!gpcs6) )的最后分支,
由于没有tb,不清楚波形图,你可以先检查这两处,看是不是你想要的电路。
哦哦,把tb奉上,谢谢楼上啊,
`timescale 1ns/1ns
module top_tb;
reg clk;
reg rst;
reg [14:1]addr;
reg [15:0]data;
reg rd;
reg wr;
reg gpcs6;
initial
begin
clk=1;
rst=1;
rd =1;
wr =1;
gpcs6 =1;
#1000
rst=0;
#1000
rst=1;
#1000//strat 7a0
gpcs6 = 0;
wr = 0;
rd = 1;
addr = 'h7a0;
data = 16'h09;
#450 //read 7b0
gpcs6 = 0;
wr = 1;
rd = 0;
addr = 'h7b0;
#300 //reset 7d0
gpcs6 = 0;
wr = 0;
rd = 1;
addr = 'h7d0;
data = 16'h00;
#300
gpcs6 = 1;
wr= 1;
rd= 1;
addr = 'h000;
end
always #10 clk=~clk;
ds12cr887 I_UUT(
.clk(clk),
.rst(rst),
.gpcs6(gpcs6),
.gpcs6_o(gpcs6_o),
.rd(rd),
.wr(wr),
.addr(addr),
.data(data),
.GPMEMRD_o(GPMEMRD_o),
.GPMEMWR_o(GPMEMWR_o),
.GPALE_o(GPALE)
);
endmodule
太长了 没时间看
