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

📄 op_ctrl.v

📁 Verilog for I2C core source code
💻 V
📖 第 1 页 / 共 3 页
字号:
                                                next_state <= DIR ? `OP_DATA_W : `OP_READDR;
                                                next_comm <= `I2C_CMD_NOP;
                                              end
                                            else
                                              begin
                                                next_state <= `OP_TADDR; 
                                                next_comm <= `I2C_CMD_READ;
                                              end   
                                          end                 
                         default        : begin
                                            next_state <= `OP_IDLE;
                                            next_comm <= `I2C_CMD_NOP; 
                                            data <= 0;
                                            ld <= 0;  
                                            cnt_ld <= 0;
                                            chk_ask <= 0;                                            
                                          end
                        endcase                                    
                     end             
        `OP_DATA_W : begin
                       op_res <= 0;
                       shift <= 0;
                       sa <= 0;
                       busy_n <= 1;
                       out_ask <= 0;
                       case(curr_comm)
                         `I2C_CMD_NOP   : begin
                                            next_state <= `OP_DATA_W;
                                            next_comm <= `I2C_CMD_WRITE; 
                                            data <= DATA_IN;
                                            ld <= 1;    
                                            cnt_ld <= 1;
                                            chk_ask <= 0;   
                                            full <= 0;
                                            empty <= 1;                                                                                  
                                          end 
                         `I2C_CMD_WRITE : begin                                    //write 8bit
                                            next_state <= `OP_DATA_W;                         
                                            data <= 0;
                                            ld <= 0;     
                                            cnt_ld <= 0;
                                            chk_ask <= 0;
                                            full <= 0;
                                            empty <= 0;                                             
                                            if(cnt_done) 
                                              begin
                                                next_comm <= `I2C_CMD_READ;                                                
                                              end  
                                            else
                                              begin                                                
                                                next_comm <= `I2C_CMD_WRITE; 
                                              end                                                                                      
                                          end
                         `I2C_CMD_READ  : begin                                          //ack
                                            data <= 0;
                                            ld <= 0;    
                                            cnt_ld <= 0;  
                                            chk_ask <= 1;    
                                            full <= 0;
                                            empty <= 0;                                                             
                                            if(COMM_RES)
                                              begin
                                                next_state <= trans_done ? `OP_END : `OP_DATA_W;
                                                next_comm <=  `I2C_CMD_NOP;
                                              end
                                            else
                                              begin
                                                next_state <= `OP_DATA_W; 
                                                next_comm <= `I2C_CMD_READ;
                                              end   
                                          end                 
                         default        : begin
                                            next_state <= `OP_IDLE;
                                            next_comm <= `I2C_CMD_NOP; 
                                            data <= 0;
                                            ld <= 0;   
                                            cnt_ld <= 0;
                                            chk_ask <= 0;   
                                            full <= 0;
                                            empty <= 0;                                                                                    
                                          end                
                       endcase                      
                     end
        `OP_READDR : begin                                               //读时,需要再次发送器件地址
                       op_res <= 0;
                       shift <= 0;
                       sa <= 0;
                       busy_n <= 1;
                       full <= 0;
                       empty <= 0;    
                       out_ask <= 0;                    
                       case(curr_comm)
                         `I2C_CMD_NOP   : begin
                                            next_state <= `OP_READDR;
                                            next_comm <= `I2C_CMD_START;
                                            data <= 0;
                                            ld <= 0;
                                            cnt_ld <= 0;
                                            chk_ask <= 0;
                                          end
                         `I2C_CMD_START : begin
                                            next_state <= `OP_READDR;
                                            chk_ask <= 0;
                                            if(COMM_RES)
                                              begin 
                                                next_comm <= `I2C_CMD_WRITE;
                                                data <= {DEVICE, 1'b1};            //read
                                                ld <= 1;
                                                cnt_ld <= 1;
                                              end
                                            else
                                              begin
                                                next_comm <= `I2C_CMD_START;
                                                data <= 0;
                                                ld <= 0;   
                                                cnt_ld <= 0;                                             
                                              end     
                                          end 
                         `I2C_CMD_WRITE : begin                       //write 8bit
                                            chk_ask <= 0;
                                            next_state <= `OP_READDR; 
                                            data <= 0;
                                            ld <= 0;   
                                            cnt_ld <= 0;                                         
                                            if(cnt_done) 
                                              begin
                                                next_comm <= `I2C_CMD_READ;
                                              end  
                                            else
                                              begin
                                                next_comm <= `I2C_CMD_WRITE; 
                                              end  
                                          end
                         `I2C_CMD_READ  : begin                                          //ack
                                            data <= 0;
                                            ld <= 0;    
                                            cnt_ld <= 0;  
                                            chk_ask <= 1;                    
                                            if(COMM_RES)
                                              begin
                                                next_state <= `OP_DATA_R; 
                                                next_comm <= `I2C_CMD_NOP;
                                              end
                                            else
                                              begin
                                                next_state <= `OP_READDR; 
                                                next_comm <= `I2C_CMD_READ;
                                              end   
                                          end                
                         default        : begin
                                            data <= 0;
                                            ld <= 0;   
                                            cnt_ld <= 0; 
                                            chk_ask <= 0;                      
                                            next_state <= `OP_IDLE;
                                            next_comm <= `I2C_CMD_NOP;
                                          end
                        endcase  
                     end
        `OP_DATA_R : begin
                       op_res <= 0;
                       data <= 0;
                       ld <= 0; 
                       chk_ask <= 0;  
                       busy_n <= 1;                     
                       case(curr_comm)
                         `I2C_CMD_NOP   : begin
                                            next_state <= `OP_DATA_R;
                                            next_comm <= `I2C_CMD_READ;   
                                            cnt_ld <= 1;
                                            shift <= 0;          
                                            sa <= 0;     
                                            full <= 0;
                                            empty <= 0;   
                                            out_ask <= 0;                                                                  
                                          end 
                         `I2C_CMD_READ  : begin                                    //read 8bit
                                            next_state <= `OP_DATA_R;    
                                            cnt_ld <= 0;                        
                                            shift <= 1;
                                            sa <= 0;
                                            full <= 0;
                                            empty <= 0;                                              
                                            if(cnt_done) 
                                              begin
                                                next_comm <= `I2C_CMD_WRITE;     
                                                out_ask <= 1;                                           
                                              end  
                                            else
                                              begin                                                
                                                next_comm <= `I2C_CMD_READ; 
                                                out_ask <= 0;
                                              end                                                                                      
                                          end
                         `I2C_CMD_WRITE  : begin                                          //ack    
                                            shift <= 0;      
                                            cnt_ld <= 0;   
                                            sa <= 1;                                                                                         
                                            if(COMM_RES)
                                              begin
                                                full <= 1;
                                                empty <= 0;    
                                                out_ask <= 0;                                              
                                                next_state <= trans_done ? `OP_END : `OP_DATA_R;
                                                next_comm <= `I2C_CMD_NOP;
                                              end
                                            else
                                              begin
                                                full <= 0;
                                                empty <= 0;      
                                                out_ask <= 1;                                            
                                                next_state <= `OP_DATA_R; 
                                                next_comm <= `I2C_CMD_WRITE;
                                              end   
                                          end                 
                         default        : begin
                                            next_state <= `OP_IDLE;
                                            next_comm <= `I2C_CMD_NOP;   
                                            shift <= 0;       
                                            cnt_ld <= 0;    
                                            sa <= 0;   
                                            full <= 0;
                                            empty <= 0;   
                                            out_ask <= 0;                                                                      
                                          end                
                       endcase                                                                    
                     end
        `OP_END    : begin
                       op_res <= 0;
                       chk_ask <= 0;
                       data <= 0;

⌨️ 快捷键说明

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