?? pc_io.v
字號:
/* //************************************************************************* // 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 + -