0

关于投票
点击下载Study-2812增强版上Verilog源码

点击下载Study-2812增强版上Verilog源码(maxplus2环境下):点击下载

主要修改内容:

1.规范了LCD的访问:

如:

void LcdObj::SendCommand(char cCommand)
{
 if ((SpiRclkRegs & 0xff)  == 0xa5)
 {
  LCDRS = 0;//设置命令方式//RS
  LCDRW = 0;//写LCD//RW
  LCDE = cCommand;//写LCD命令//E,DB7~0

    if (cCommand == 0x01)//清除显示命令,需要等待时间相对较长
  {
   _delay_loop_(1600);//st7920要求等待1.6mS
  }
    else
  {
   _delay_loop_(72);//st7920要求等待72uS
  }
 }
 else//LCD非正规模式
 {
  LcdComH = cCommand;
  LcdComL = cCommand;
    if (cCommand == 0x01)//清除显示命令,需要等待时间相对较长
  {
   _delay_loop_(1600);//st7920要求等待1.6mS
  }
    else
  {
   _delay_loop_(72);//st7920要求等待72uS
  }
 }
}

void LcdObj::SendData(char cData)
{
 if ((SpiRclkRegs & 0xff)  == 0xa5)
 {
  LCDRS = 1;//设置数据方式//RS=1
  LCDRW = 0;//写LCD//RW=0
  LCDE = cData;//写LCD数据//E=1->0,DB7~0
     _delay_loop_(72);//st7920要求等待72uS
 }
 else//LCD非正规模式
 {
  LcdDatH = cData;
  LcdDatL = cData;
     _delay_loop_(72);//st7920要求等待72uS
 }
}

2.发送74HC595的RCLK脉冲加入了密码

interrupt void ISRTimer2(void)
{
//以下定义为共阳数码管
static const unsigned char LedTab[] =
{//显示字符表存放在ROM中
  LedChar0, LedChar1, LedChar2, LedChar3,
  LedChar4, LedChar5, LedChar6, LedChar7,
  LedChar8, LedChar9, LedCharA, LedCharB,
  LedCharC, LedCharD, LedCharE, LedCharF
};
 if ((Timer.Count1 & 0x0f) == 0)
 {
  System.SpiReadWrite(~LedTab[Timer.Count2 & 0x0f]);
  Timer.Count2++;
  if ((SpiRclkRegs & 0xff)  == 0xa5)
  {
   SpiRclkRegs = Paddword;//直接产生74HC595密码的RCLK脉冲
  }
  else//CPLD旧版本需要模拟RCLK信号
  {
   SpiRclkRegs = 0;
   SpiRclkRegs = 1;
  }
 }
}

 

哈哈~~~虽然Verilog的程序很简单,但很实用~~~

系统分类: CPLD/FPGA
用户分类: CPLD
标签: 无标签
来源: 整理
发表评论 阅读全文(96) | 回复(0)

0

关于投票
在Study-2812增强版上改写CPLD增加键盘测试功能

/*------------------------------------------------------------------
 在Study-2812增强版上改写CPLD增加键盘测试功能
1.改压KEY1~KEY8时LED1~LED8亮为8位键盘测试,LED位单独控制
  读0x5f00为读键盘
  写0x5f00为写LED
2.增加CPLD版本号测试功能,按INT1键时LCD显示"CPLD可键盘测试"

菜农HotPower@126.com  2008.4.25  于西安大雁塔菜地
--------------------------------------------------------------------*/
//2006-06-15 还有5个输入信号未分配管脚,分别是PWM7,PWM8,PWM9,PWM10,CANRX0,CANTX,此芯片内部资源不足。
module DEV2812(EXINT5,A,D,INT1,CS1,NMI,SE,ME,IOPE6,IOPE5,CS_6963,SPICS,K1,L1,K2,L2,K3,L3,K4,L4,K5,PWM7,PWM8,PWM9,PWM10,CANRX0,CANTX,L5,K6,L6,K7,L7,K8,L8,NMI1,NMI2,EXINT1,EXINT2,EXINT3,EXINT4,WR,RD,DIR,OUT1,OUT2,OUT3,OUT4,OUT5,OUT6,OUT7,OUT8,IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,OE485,SICLK,SIDIN,ACICS,CS1581,RS1581,CANTX0,CANRX);
   
    output INT1,NMI,SE,ME,IOPE6,IOPE5,CS_6963,SPICS,L1,L2,L3,L4,L5,L6,L7,L8,DIR,OUT1,OUT2,OUT3,OUT4,OUT5,OUT6,OUT7,OUT8,OE485,SICLK,SIDIN,ACICS,CS1581,RS1581,CANTX0,CANRX;
   
    input EXINT5,CS1,K1,K2,K3,K4,K5,K6,K7,K8,NMI1,NMI2,IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,EXINT1,EXINT2,EXINT3,EXINT4,WR,RD,CANRX0,CANTX,PWM7,PWM8,PWM9,PWM10;
    input [5:0] A;
    inout [7:0] D;

    reg [7:0] D_reg;
    reg [7:0] Int_Data_reg;
    reg Int_WR_reg;
    reg RD_reg;
    reg [7:0] OUT_reg;
    reg INT1_reg,NMI_reg;
    reg L1_reg,L2_reg,L3_reg,L4_reg,L5_reg,L6_reg,L7_reg,L8_reg;
    reg CS1581_reg,RS1581_reg,CS_6963_reg,DIR_reg,IOPE5_reg;//SE_reg,ME_reg,IOPE6_reg,RD_reg,WR_reg;
    reg SICLK_reg,SIDIN_reg,ACICS_reg;
    //reg CS_DA_reg,LOAD_DA_reg;
    reg OE485_reg,SPICS_reg;
    reg [7:0] LED_Data_reg;
   
    reg CANTX0_reg;
    reg CANRX_reg;


initial//初始化模块好像无?
begin
 CS1581_reg=1;      //上电时1581不片选
 RS1581_reg=1;//1581上电后不处于复位状态
 Int_Data_reg=0;
 RD_reg=0;
 Int_WR_reg=0;
 OUT_reg=0;
 SICLK_reg=1;
 SIDIN_reg=1;
 ACICS_reg=1;
CS_6963_reg=1;
IOPE5_reg=1;
DIR_reg=1;
//LED_Data_reg=8'b11111111;
LED_Data_reg=8'h00;//开机LED全灭
end

always @ (  CS1)
begin
    if(CS1==1'b0)  
        if(A==6'b010111)
         CS1581_reg=0;  //片选1581,地址为0x5700,读写地址相同。
        else
         CS1581_reg=1;                             
    else
         CS1581_reg=1;

end


always @ (  negedge RD  )       
 begin 
       
        if(CS1==1'b0)
         begin
          if( A==6'b011110)        //1581复位低地址为0x5e00,读操作;
             RS1581_reg=0;
          else if(A==6'b011101)    //1581复位高地址为0x5d00,读操作。
             RS1581_reg=1;
          else if(A==6'b011100)   //外部中断读地址为0x5c00,读操作。
             begin
             RD_reg=1;
             D_reg=Int_Data_reg;
             end
          else if(A==6'b011011)//8路开关量输入,地址为0x5b00,读操作。
             begin
             RD_reg=1;
             D_reg={IN8,IN7,IN6,IN5,IN4,IN3,IN2,IN1};
             end
/*-------------------------------------------------------------
    在此加入键盘测试功能,//8个按键地址,0x5f00
--------------------------------------------------------------*/
          else if(A==6'b011111)
             begin
             RD_reg=1;
             D_reg={K8,K7,K6,K5,K4,K3,K2,K1};
    end
/*-------------------------------------------------------------
    在此加入CPLD芯片接入测试功能
--------------------------------------------------------------*/
          else if(A==6'b010101)  //CPLD自检地址0x5500
             begin
             RD_reg=1;
             D_reg=8'h5a;
    end
          else
             RD_reg=0;   
        end    
end

always @ (  posedge WR )  //写信号要用上升沿,否则数据可能不稳     
 begin 
       
        if(CS1==1'b0)
         begin
           if(A==6'b011100)   //外部中断标志位写地址为0x5c00,写操作。
             Int_WR_reg=1;
           else if(A==6'b011011)  //8路开半量输出,地址为0x5b00,写操作。
              begin
              OUT_reg=D;
              end
           else if(A==6'b011010) //AIC芯片模拟SPI口各信号选通,写操作,地址0x5a00
              begin
                             
              //   LOAD_DA_reg=D[4];
              //    CS_DA_reg=D[7];
                  ACICS_reg=D[2];
                  SIDIN_reg=D[1];
                  SICLK_reg=D[0];
              end
            else if(A==6'b010001)     //LCM命令写低,地址0x5100          
                    begin 
                    IOPE5_reg=0;     
                    CS_6963_reg=0;
                    end     
            else if(A==6'b010010)     //LCM命令写高,地址0x5200          
                    begin 
                    IOPE5_reg=0;     
                    CS_6963_reg=1;
                    end               
            else if(A==6'b010011)     //LCM数据写低,地址0x5300           
                    begin 
                    IOPE5_reg=1;
                    CS_6963_reg=0;
                    end
            else if(A==6'b010100)     //LCM数据写高,地址0x5400           
                    begin 
                    IOPE5_reg=1;
                    CS_6963_reg=1;
                    end 
            else if(A==6'b010101)  //SPI片选信号,地址0x5500
                    begin
                    SPICS_reg=D[0];
                    end
            else if(A==6'b010110) //485片选信号,地址0x5600
                    begin
                    OE485_reg=D[0];
                    end
           else if(A==6'b011111)       //8个发光二极管地址,0x5f00
                    begin
                    LED_Data_reg=D;
                    end
           else
             Int_WR_reg=0;
        end    
end


always @(  EXINT1 or EXINT2 or EXINT3 or EXINT4 or EXINT5 or NMI1 or NMI2 )
begin

    INT1_reg=EXINT1 & EXINT2 & EXINT3 & EXINT4 & EXINT5;
    NMI_reg=NMI1 & NMI2;

    Int_Data_reg = (Int_WR_reg ==1) ? 0:Int_Data_reg;//此模块应顺序执行,但目前这样写也能正常工作

    if(  ~(INT1_reg & NMI_reg) )
           Int_Data_reg={ 1'b0,~EXINT5 ,~EXINT4 ,~EXINT3, ~EXINT2, ~EXINT1,~NMI2, ~NMI1};
end

 


always //8个按键任按下一个时,对应的二极管发光,也可由DSP程序控制二极管发光,写相应位为1时发光
begin
/*---------------------------------------
//去除按键LED灯亮的不好功能   
 L1_reg=K1 & ~LED_Data_reg[0];
    L2_reg=K2 & ~LED_Data_reg[1];
    L3_reg=K3 & ~LED_Data_reg[2];
    L4_reg=K4 & ~LED_Data_reg[3];
    L5_reg=K5 & ~LED_Data_reg[4];
    L6_reg=K6 & ~LED_Data_reg[5];
    L7_reg=K7 & ~LED_Data_reg[6];
    L8_reg=K8 & ~LED_Data_reg[7];

---------------------------------------*/
 L1_reg=~LED_Data_reg[0];
    L2_reg=~LED_Data_reg[1];
    L3_reg=~LED_Data_reg[2];
    L4_reg=~LED_Data_reg[3];
    L5_reg=~LED_Data_reg[4];
    L6_reg=~LED_Data_reg[5];
    L7_reg=~LED_Data_reg[6];
    L8_reg=~LED_Data_reg[7];

end

always   begin
   CANTX0_reg=CANTX;
   CANRX_reg=CANRX0; 
 end

 

assign L1=L1_reg;
assign L2=L2_reg;
assign L3=L3_reg;
assign L4=L4_reg;
assign L5=L5_reg;
assign L6=L6_reg;
assign L7=L7_reg;
assign L8=L8_reg;

assign CS1581=CS1581_reg;

assign INT1=INT1_reg;
assign NMI="1";
assign SE="1";
assign ME="1";
assign IOPE6=0;//LCM读写控制线,暂只提供写功能,故一直为低
assign IOPE5=IOPE5_reg;
assign CS_6963=CS_6963_reg;
assign SPICS="SPICS"_reg;
assign DIR="1" ;//暂只提供写操作,故方向控制一直为高,即数据线只从左到右


assign SICLK="SICLK"_reg;
assign SIDIN="SIDIN"_reg;
assign ACICS="ACICS"_reg;
assign RS1581=RS1581_reg;


assign CANTX0=CANTX0_reg;
assign CANRX="CANRX"_reg;
assign OE485 = OE485_reg;
assign D = (RD_reg == 1 && RD==1'b0) ? D_reg :8'hz;
assign {OUT8,OUT7,OUT6,OUT5,OUT4,OUT3,OUT2,OUT1}=OUT_reg;

endmodule

 

系统分类: CPLD/FPGA
用户分类: CPLD
标签: 无标签
来源: 整理
发表评论 阅读全文(137) | 回复(0)
总共 , 当前 /