打印
[CPLD]

epm7128s做 arm芯片的外部扩展-附程序

[复制链接]
2181|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aray2000|  楼主 | 2007-3-26 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用Altera 的 epm7128s做 arm芯片的外部扩展,输入有地址add21-16, nGCS4, 数据线 data7-0, 控制线 nWe, nOe等。现在仿真出来JDQPORT输出不正常。 由于我手上只有夏宇闻的一本书,也许犯了不少错误? 希望能在这里得到指点。谁有用verilog HDL 语言编写的类似的MCU  IO扩展的例子?



//该处地址的格式:nGCS4+MCU_addr[5:0]  一共7位

`define JDQaddr 7'b001_0000 //继电器控制地址1
`define U22port1addr 7'b001_0100 //开关量输入口1
`define U22port2addr 7'b001_0101 //开关量输入口2
`define ExtendDatabusaddr1 7'b001_0110 //AD变换接口1
`define ExtendDatabusaddr2 7'b001_0111 //AD变换接口2
`define Ledaddr 7'b001_1000 //发光管地址



`define no_rw  3'h0
`define JDQ_rw 3'h1          //定义总线状态标志
`define U22port1_rw 3'h2 //开关量输入
`define U22port2_rw 3'h3
`define ExtendDatabus1_rw 3'h4
`define ExtendDatabus2_rw 3'h5
`define Led_rw 3'h6

module IOextend1(nGCS4,MCU_data,MCU_addr,
                    exint2,exint3,exint4,
                    nWe,nOe,nWait,nReset,
                    JDQPORT,// JDQPORT2,
                    extenddata_cs1,extenddata_cs2,
                    extenddata_oe,extenddata_dir,
                    led
                                                                                        
                    );
                    
    input nGCS4;
    reg nGCS4_reg;
    
    input nWe;
    input nOe;
    //reg nWe_reg,nOe_reg;
    input nWait;
    input nReset;
    input[5:0] MCU_addr;
    inout[7:0] MCU_data;
    reg[6:0] MCUaddr_reg;
    reg[7:0] MCU_data_reg;
    
    reg[3:0] addr_sel; //定义总线状态寄存器
        
    output exint2;
    output exint3;
    output exint4;
    reg exint2_reg;
    reg exint3_reg;
    reg exint4_reg;
    
    output[1:0] led;
    reg[1:0] led_reg;
    
    //====================
    // 继电器控制
    //====================
    output[7:0] JDQPORT;
    reg [7:0] JDQPORT_reg;
    
    
        
    //====================
    // AD控制口
    //====================

    output extenddata_cs1;
    output extenddata_cs2;
    output extenddata_oe;
    output extenddata_dir;
    reg extenddata_cs1_reg;
    reg extenddata_cs2_reg;
    reg extenddata_oe_reg;
    reg extenddata_dir_reg;
    
    
    

//在系统地址总线变化的时候,确定是否选中了CPLD所对应的相关接口地址

always @(nGCS4 or MCU_addr)
begin
    

    MCUaddr_reg={nGCS4,MCU_addr};
    
    extenddata_cs1_reg=1'b1;
    extenddata_cs2_reg=1'b1;
    extenddata_oe_reg=1'b1;    //只要地址发生变化,则16245芯片U9就置于高阻态,然后在接下去的步骤里面再对应地设置其工作状态


    if(MCUaddr_reg==`JDQaddr) addr_sel=`JDQ_rw;
    else if (MCUaddr_reg==`Ledaddr) addr_sel=`Led_rw;
    else if (MCUaddr_reg==`ExtendDatabusaddr1) 
        begin
            addr_sel=`ExtendDatabus1_rw;
            extenddata_oe_reg=1'b0;
            extenddata_cs1_reg=1'b0;
        end
    else if (MCUaddr_reg==`ExtendDatabusaddr2) 
        begin
            addr_sel=`ExtendDatabus2_rw;
            extenddata_oe_reg=1'b0;
            extenddata_cs2_reg=1'b0;
        end

//    if(nGCS4==0) addr_sel=`JDQ_rw;
    else  addr_sel=`no_rw;
    
end

///////////////////////
// Mar.26, 2007
///////////////////////
// 把 nWe, nOE放在一起
always @(negedge nWe or negedge nOe)
begin
    
    if (nWe==0)    //如果是在写总线周期
    begin
        if(addr_sel==`JDQ_rw) //继电器写
            JDQPORT_reg=MCU_data;
        
        //如果是写扩展数据总线1,则把16245的 OE使能, 并且让DIR为1,数据从A port 到B port //     
//        else if ((addr_sel==`ExtendDatabus1_rw) or (addr_sel==`ExtendDatabus2_rw))
//                extenddata_dir_reg=1; 
            
        extenddata_dir_reg=1;         
    end
    
    
    if (nOe==0)
    begin

        //如果是读取第1个AD芯片的值
        if ((addr_sel==`ExtendDatabus1_rw) || (addr_sel==`ExtendDatabus2_rw))
                extenddata_dir_reg=0; 
        
        else  
        begin 
                extenddata_dir_reg=1; 
    
        end

    end 
end


assign JDQPORT=JDQPORT_reg;
assign extenddata_oe=extenddata_oe_reg;
assign extenddata_dir=extenddata_dir_reg;         
assign extenddata_cs1=extenddata_cs1_reg;
assign extenddata_cs2=extenddata_cs2_reg;

// 如果CPLD不需要往数据总线上传数据的时候,
assign MCU_data=((nOe==1'b1)||(addr_sel==`no_rw))?8'hz : MCU_data_reg;

//assign led=led_reg;

//assign U22oe1=1;
//assign U22oe2=1;
//assign U22dir1=1;
//assign U22dir2=1;

//assign U22port1=8'b0000_0000;
//assign U22port2=8'b0000_0000;

//assign exint2=1'b1; //exint3,exint4,
//assign exint3=1'b1;
//assign exint4=1'b1;


endmodule

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

8

帖子

0

粉丝