首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在Verilog里的问题

在Verilog里的问题

我在用MAX+PLUS II编一个单片机和CPLD综合运用的程序。
在仿真后出现:
Warning: GLOBAL primitive on node 'wr' feeds logic - non-global signal usage may result
Warning: GLOBAL primitive on node 'rd' feeds logic - non-global signal usage may result
想请教一下该怎么改啊!
cpld.v
///////////////////////////////////////////////////////////////////////////////////////////
`define lcd_wi_addr 16'hff09        //LCD模块写命令地址
`define lcd_wd_addr 16'hff0b        //LCD模块写数据地址
`define lcd_rd_addr 16'hff0a        //LCD模块读数据地址
`define lcd_ri_addr 16'hff0e        //LCD模块读命令地址
`define key_addr 16'hff03           //键盘模块地址


`define no_rw  3'h0                //总线状态标志
`define key_rw 3'h1
`define ram_rw 3'h3
`define lcd_ri 3'h4
`define lcd_rd 3'h5
`define lcd_wi 3'h6
`define lcd_wd 3'h7

module cpld
(MCU_data,MCU_address,keyin,lcd,int,wr,rd,ale,lcd,lcd_d_i,lcd_r_w,lcd_e);
        input[7:0] MCU_address;        //单片机地址线
        inout[7:0] MCU_data;           //单片机数据线
        input[7:0] keyin;              //键盘
        //input[12:0] RAM_address;     //外部RAM地址线
        //inout[8:1] RAM_data;         //外部RAM数据线
    //output RAM_oe;               //RAM的OE控制线
        //output RAM_we;               //RAM的WE控制线
        inout[7:0] lcd;               //LCD数据线
        output lcd_d_i;                //LCD的D/I控制线
        output lcd_r_w;                //LCD的R/W控制线
        output lcd_e;                  //LCD使能端
        //output lcd_cs1;
        //output lcd_cs2;
        //output lcd_ret;
        output int;                    //键盘中断输出口
        input wr;
        input rd;
        input ale;                     //地址锁存

        reg[1:0] addr_sel;             //总线状态寄存器
        reg[7:0] lcd_reg;              //LCD状态寄存器
        reg lcd_di_reg;                //写时:LCD数据/命令选择寄存器
        reg lcd_rw_reg;                //写时:LCD读/写选择寄存器
        reg lcd_di_reg1;                //读时:LCD数据/命令选择寄存器
        reg lcd_rw_reg1;                //读时:LCD读/写选择寄存器
        reg lcd_e_reg;                                        //LCD使能端寄存器
        reg[7:0] MCU_data_reg;         //总线寄存器
        reg[7:0] key_status;           //键盘状态寄存器
        //reg[12:0] RAM_address_reg;     //RAM地址寄存器
        //reg[8:1] RAM_data_reg;         //RAM数据寄存器
        reg int_reg;                   //中断信号寄存器

/////////////////////////////////////////////////
always @(negedge ale)               
begin
        if({MCU_address,MCU_data}==`key_addr)         //键盘操作
                addr_sel=`key_rw;
        else if({MCU_address,MCU_data}==`lcd_wi_addr)  //LCD操作
                addr_sel=`lcd_wi;
        else if({MCU_address,MCU_data}==`lcd_wd_addr)
                addr_sel=`lcd_wd;
        else if({MCU_address,MCU_data}==`lcd_ri_addr)
                addr_sel=`lcd_ri;
        else if({MCU_address,MCU_data}==`lcd_rd_addr)
                addr_sel=`lcd_rd;
        //else if({MCU_address,MCU_data}==`ram_addr)
        //        addr_sel=`ram_rw;
        else
                addr_sel=`no_rw;                          //挂起总线
end


/////////////////////////////////////////////////
always @(keyin)           //键盘中断处理
begin
        if(keyin==key_status)
                int_reg=1;
        else
                int_reg=0;
end


/////////////////////////////////////////////////
always @(negedge wr)
begin
    /////向LCD写入命令字///
        if(addr_sel==`lcd_wi)         
                begin
                        assign lcd_di_reg=0;
                        assign lcd_rw_reg=0;
                        lcd_reg=MCU_data;
                end
        else if(addr_sel==`lcd_wd)
                begin
                        assign lcd_di_reg=1;
                        assign lcd_rw_reg=0;
                        lcd_reg=MCU_data;
                end
        /////向外部RAM写数据//////???????
        //  else if(addr_sel==`ram_rw)
        //            begin
        //                        assign RAM_we=1'b0;
        //            end
        /////////////////////////       
end


/////////////////////////////////////////////////
always@(negedge rd)
begin
        /////从LCD读入数据////
        if(addr_sel==`lcd_ri)
                begin
                        assign lcd_di_reg1=0;
                        assign lcd_rw_reg1=1;
                        MCU_data_reg=lcd;
                end
        else if(addr_sel==`lcd_rd)
                begin
                        assign lcd_di_reg1=1;
                        assign lcd_rw_reg1=1;
                        MCU_data_reg=lcd;
                end
        else if(addr_sel==`key_rw)   //读取键盘的状态
                begin
                        MCU_data_reg=keyin;
                        key_status=keyin;
                end
        //////////////////从外部RAM读出数据/////?????
        //        else if(addr_sel==`ram_rw)
        //                begin
        //                        assign RAM_oe=1'b0;
        //          assign RAM_we=1'b1;
        //                end
        ////////////////////////////////////////       



end

//////////////////////////////////////////
always@(wr or rd)
begin
        lcd_e_reg=!(wr&&rd);
end
///////////////////////////////////////////////

assign lcd_e=lcd_e_reg;
assign MCU_data=((rd==1'b1)||(addr_sel==`no_rw))?8'hz:MCU_data_reg;
assign lcd=(lcd_e==1'b1)?lcd_reg:8'hz;
assign int=int_reg;
assign lcd_d_i=(wr==1'b0)?lcd_di_reg:lcd_di_reg1;
assign lcd_r_w=(wr==1'b0)?lcd_rw_reg:lcd_di_reg1;
// assign RAM_data=(addr_sel==`ram_rw)?RAM_data_reg:8hz;  //若RAM没有占用总线则设RAM数据线位高阻态
endmodule



[此贴子已经被作者于2005-4-4 10:00:51编辑过]

返回列表