⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc_io.v

📁 采用Verilog语言实现了8255A的功能
💻 V
📖 第 1 页 / 共 2 页
字号:
/*   //*************************************************************************   // Project Name: 8255A的功能设计和分析   // Module Name : PC_IO   // Author:		    张文涛   // Created:		  2006-10-25   // Modified:     2006-10-29   // Revision:		  3.0   //   //*************************************************************************   // 需要注意的地方:               //**************************************************************************/module  PC_IO(//input              reset,              nRD,              nWR,              A,              Din,              PC_In,              Control_Data,              PortC_Out_Ld,                            //output              PortC_Status,              PC_Out              );  //-----端口声明-----  input       reset;                                        //复位信号;  input       nRD;                                          //读信号;  input       nWR;                                          //写信号;  input       A;                                            //地址信号;  input[7:0]  Din;                                          //输入数据;  input[7:0]  PC_In;                                        //C口输入;  input[6:0]  Control_Data;                                 //来自Control_Logic的控制信号;  input[7:0]  PortC_Out_Ld;                                 //C口输出允许信号;    output[7:0] PortC_Status;                                 //C口状态字;  output[7:0] PC_Out;                                       //C口输出数据;    //-----内部寄存器-----  reg[7:0]    PortC_Status;  reg[7:0]    PC_Out;  reg[7:0]    PC_Out_D;  reg         IBFA;                                         //A口输入缓冲器满信号;  reg         IBFB;                                         //B口输入缓冲器满信号;  reg         nOBFA;                                        //A口输出缓冲器满信号;  reg         nOBFB;                                        //B口输出缓冲器满信号  reg         INTEA_In;                                     //A口输入中断允许寄存器;  reg         INTEA_Out;                                    //A口输出中断允许寄存器;  reg         INTEB;                                        //B口中断允许寄存器;  reg         INTRA_In;                                     //A口输入中断寄存器;  reg         INTRB_In;                                     //B口输入中断寄存器;  reg         INTRA_Out;                                    //A口输出中断寄存器;  reg         INTRB_Out;                                    //B口输出中断寄存器;    reg[1:0]    nOBFAstate;                                   //相关状态机寄存器;  reg[1:0]    IBFAstate;  reg[1:0]    nOBFBstate;  reg[1:0]    IBFBstate;  reg[1:0]    INTRA_Instate;  reg[1:0]    INTRA_Outstate;  reg[1:0]    INTRB_Instate;  reg[1:0]    INTRB_Outstate;  reg[7:0]    PC_Status_Buf;     //-----内部线型变量-----  wire[1:0]   A;  wire        PortC_RS;  wire        Flag;  wire[1:0]   ModeA;  wire        ModeB;  wire        PortA_IO;  wire        PortB_IO;  wire        nSTBA;  wire        nSTBB;  wire        nACKA;  wire        nACKB;    //-----控制字-----  assign  PortC_RS = Control_Data[6];  assign  Flag     = Control_Data[5];  assign  ModeA    = Control_Data[4:3];  assign  ModeB    = Control_Data[2];  assign  PortA_IO = Control_Data[1];  assign  PortB_IO = Control_Data[0];  assign  nSTBA    = PC_In[4];  assign  nSTBB    = PC_In[2];  assign  nACKA    = PC_In[6];  assign  nACKB    = PC_In[2];                    	////////////////////////////////////////////////////////////////////////////////////////////////////////PC_Out////////////////////////////////////////////////////////////////////////////////////////////////////////////////  //-----PC_Out-----  always @ (reset or Flag or PortC_Out_Ld or PC_Out_D)    if(reset)                                                         //复位清0;                      PC_Out = 8'b00000000;    else if(Flag==1'b0)                                               //置位/复位操作;      case(PortC_Out_Ld)        8'b11111110:  PC_Out = {PC_Out[7:1],PortC_RS};        8'b11111101:  PC_Out = {PC_Out[7:2],PortC_RS,PC_Out[0]};        8'b11111011:  PC_Out = {PC_Out[7:3],PortC_RS,PC_Out[1:0]};        8'b11110111:  PC_Out = {PC_Out[7:4],PortC_RS,PC_Out[2:0]};        8'b11101111:  PC_Out = {PC_Out[7:5],PortC_RS,PC_Out[3:0]};        8'b11011111:  PC_Out = {PC_Out[7:6],PortC_RS,PC_Out[4:0]};        8'b10111111:  PC_Out = {PC_Out[7],PortC_RS,PC_Out[5:0]};        8'b01111111:  PC_Out = {PortC_RS,PC_Out[6:0]};        default:      PC_Out = 8'b11111111;      endcase    else                      PC_Out = PC_Out_D;       //-----PC_Out_D[7]-----                                              always @ (reset or PortC_Out_Ld[7] or nOBFA or Din[7])     if(PortC_Out_Ld[7]==1'b0)       PC_Out_D[7] = Din[7];                                          else                                                                PC_Out_D[7] = nOBFA;                        //-----PC_Out_D[6]-----                                              always @ (reset or PortC_Out_Ld[6] or Din[6])     if(PortC_Out_Ld[6]==1'b0)       PC_Out_D[6] = Din[6];                                          else                                                                PC_Out_D[6] = PC_Out[6];         //-----PC_Out_D[5]-----                                              always @ (reset or PortC_Out_Ld[5] or IBFA or Din[5])     if(PortC_Out_Ld==1'b0)       PC_Out_D[5] = Din[5];                                          else                                                                PC_Out_D[5] = IBFA;                                            //-----PC_Out_D[4]-----                                              always @ (reset or PortC_Out_Ld[4] or Din[4])     if(PortC_Out_Ld[4]==1'b0)       PC_Out_D[4] = Din[4];                                          else                                                                PC_Out_D[4] = PC_Out[4];         //-----PC_Out_D[3]-----                                               always @ (reset or PortC_Out_Ld[3] or INTRA_In or INTRA_Out or INTEA_In or INTEA_Out                  or PortA_IO or Din[3])                          if(PortC_Out_Ld[3]==1'b0)       PC_Out_D[3] = Din[3];                                          else if(PortA_IO==1'b0)                                                              PC_Out_D[3] = INTRA_In&INTEA_In;     else       PC_Out_D[3] = INTRA_Out&INTEA_Out;                                         //-----PC_Out_D[2]-----                                           //nSTBB  always @ (reset or PortC_Out_Ld[2] or Din[2] or PC_Out[2])      if(PortC_Out_Ld[2]==1'b0)       PC_Out_D[2] = Din[2];                                          else                                                                PC_Out_D[2] = PC_Out[2];   //-----PC_Out_D[1]-----  always @ (reset or PortC_Out_Ld[1] or PortB_IO or IBFB or nOBFB or Din[1])     if(PortC_Out_Ld[1]==1'b0)       PC_Out_D[1] = Din[1];                                          else if(PortB_IO==1'b0)                                                                PC_Out_D[1] = IBFB;     else       PC_Out_D[1] = nOBFB;                      //-----PC_Out_D[0]-----                                             //INTRB  always @ (reset or PortC_Out_Ld[0] or INTRB_In or INTRB_Out or INTEB                   or PortB_IO or Din[0])     if(PortC_Out_Ld[0]==1'b0)       PC_Out_D[0] = Din[0];                                          else if(PortB_IO==1'b0)                                                               PC_Out_D[0] = INTRB_In&INTEB;     else       PC_Out_D[0] = INTRB_Out&INTEB;   ////////////////////////////////////////////////////////////////////////////////////////////////////////PortC_Status//////////////////////////////////////////////////////////////////////////////////////////////////////////    //-----PortC_Status-----  always @ (reset or PC_Status_Buf)    if(reset)            PortC_Status = 8'b00000000;    else            PortC_Status = PC_Status_Buf;              //-----PC_Status_Buf[7]-----            always @ (PortC_Out_Ld[7] or PC_In[7] or ModeA or PortA_IO or PC_Out[7])    if(PortC_Out_Ld[7]==1'b0)      PC_Status_Buf[7] = PC_In[7];    else if(ModeA==2'b01 && PortA_IO==1'b0)      PC_Status_Buf[7] = PC_In[7];    else if((ModeA==2'b01 && PortA_IO==1'b1) || ModeA==2'b10)      PC_Status_Buf[7] = PC_Out[7];    else      PC_Status_Buf[7] = PortC_Status[7];    //-----PC_Status_Buf[6]-----  always @ (PortC_Out_Ld[6] or PC_In[6] or ModeA or PortA_IO or PC_Out[6] or INTEA_Out)    if(PortC_Out_Ld[6]==1'b0)      PC_Status_Buf[6] = PC_In[6];    else if(ModeA==2'b01 && PortA_IO==1'b0)      PC_Status_Buf[6] = PC_In[6];    else if((ModeA==2'b01 && PortA_IO==1'b1) || ModeA==2'b10)      PC_Status_Buf[6] = INTEA_Out;    else      PC_Status_Buf[6] = PortC_Status[6];        //-----PC_Status_Buf[5]-----  always @ (PortC_Out_Ld[5] or PC_In[5] or ModeA or PortA_IO or PC_Out[5])    if(PortC_Out_Ld[5]==1'b0)      PC_Status_Buf[5] = PC_In[5];    else if(ModeA==2'b01 && PortA_IO==1'b1)      PC_Status_Buf[5] = PC_In[5];    else if((ModeA==2'b01 && PortA_IO==1'b0)||ModeA==2'b10)      PC_Status_Buf[5] = PC_Out[5];        else      PC_Status_Buf[5] = PortC_Status[5];      //-----PC_Status_Buf[4]-----  always @ (PortC_Out_Ld[4] or PC_In[4] or ModeA or PortA_IO or PC_Out[4])    if(PortC_Out_Ld[4]==1'b0)      PC_Status_Buf[4] = PC_In[4];    else if(ModeA==2'b01 && PortA_IO==1'b1)      PC_Status_Buf[4] = PC_In[4];    else if((ModeA==2'b01 && PortA_IO==1'b0)||ModeA==2'b10)      PC_Status_Buf[4] = PC_Out[4];        else      PC_Status_Buf[4] = PortC_Status[4]; //-----PC_Status_Buf[3]-----  always @ (PortC_Out_Ld[3] or PC_In[3] or PC_Out[3])    if(PortC_Out_Ld[3]==1'b0)      PC_Status_Buf[3] = PC_In[3];    else       PC_Status_Buf[3] = PC_Out[3];        //-----PC_Status_Buf[2]-----   always @ (PortC_Out_Ld[2] or PC_In[2] or PC_Out[2] or ModeB)    if(PortC_Out_Ld[2]==1'b0)      PC_Status_Buf[2] = PC_In[2];    else if(ModeB)      PC_Status_Buf[2] = INTEB;    else      PC_Status_Buf[2] = PC_In[2];             //-----PC_Status_Buf[1]-----  always @ (PortC_Out_Ld[1] or PC_In[1] or PC_Out[1] or ModeB)    if(PortC_Out_Ld[1]==1'b0)      PC_Status_Buf[1] = PC_In[1];    else if(ModeB)      PC_Status_Buf[1] = PC_Out[1];    else      PC_Status_Buf[1] = PC_In[1];   //-----PC_Status_Buf[0]-----  always @ (PortC_Out_Ld[0] or PC_In[0] or PC_Out[0] or ModeB)    if(PortC_Out_Ld[0]==1'b0)      PC_Status_Buf[0] = PC_In[0];    else if(ModeB)      PC_Status_Buf[0] = PC_Out[0];    else      PC_Status_Buf[0] = PC_In[0];     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -