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

📄 pci_wb_master.v

📁 这是用pci-wishbone核和16450串口核在xilinx的fpga上实现的串口程序
💻 V
📖 第 1 页 / 共 4 页
字号:
                    n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO            end            3'b001 : // If writting of one data is retried            begin                addr_count = 1'b0 ;                last_data_transferred = 1'b0 ;                retried_d = 1'b1 ; // there was a retry                wait_for_wb_response = 1'b0 ;                if(rty_counter_almost_max_value) // If retry counter reached maximum allowed value                begin                    if (last_data_from_pciw_fifo_reg) // if last data was transfered                        pciw_fifo_renable = 1'b0 ;                    else // if there wasn't last data of transfere                        pciw_fifo_renable = 1'b1 ;                    n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO                    write_rty_cnt_exp_out = 1'b1 ; // signal for reporting write counter expired                    pci_error_sig_out = 1'b1 ;                    error_source_out = 1'b1 ; // error ocuerd because of retry counter                end                else                begin                    pciw_fifo_renable = 1'b0 ;                    n_state = S_IDLE ; // go to S_IDLE state for retrying the transaction                    write_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet                    pci_error_sig_out = 1'b0 ;                    error_source_out = 1'b0 ;                end            end            default :            begin                addr_count = 1'b0 ;                last_data_transferred = 1'b0 ;                wait_for_wb_response = 1'b1 ; // wait for WB device to response (after 8 clocks RTY CNT is incremented)                error_source_out = 1'b0 ; // if error ocures, error source is from other WB bus side                if((rty_counter_almost_max_value)&&(set_retry)) // when no WB response and RTY CNT reached maximum allowed value                 begin                    retried_d = 1'b1 ;                    if (last_data_from_pciw_fifo_reg) // if last data was transfered                        pciw_fifo_renable = 1'b0 ;                    else // if there wasn't last data of transfere                        pciw_fifo_renable = 1'b1 ;                    n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO                    write_rty_cnt_exp_out = 1'b1 ; // signal for reporting write counter expired                    pci_error_sig_out = 1'b1 ; // signal for error reporting                end                else                begin               	    pciw_fifo_renable = 1'b0 ;                    retried_d = 1'b0 ;                    n_state = S_WRITE ; // stay in S_WRITE state to wait WB to response                    write_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet                    pci_error_sig_out = 1'b0 ;                end            end            endcase        end    S_WRITE_ERR_RTY: // Clean current write transaction from PCIW_FIFO if ERROR or Retry counter expired occures        begin            pciw_fifo_renable = !last_data_from_pciw_fifo_reg ; // put out next data (untill last data or FIFO empty)            last_data_transferred = 1'b1 ; // after exiting this state, negedge of this signal is used            // Default values for signals not used in this state            pcir_fifo_wenable = 1'b0 ;            pcir_fifo_control = 4'h0 ;            addr_into_cnt = 1'b0 ;            read_count_load = 1'b0 ;            read_count_enable = 1'b0 ;            addr_count = 1'b0 ;            pci_error_sig_out = 1'b0 ;            error_source_out = 1'b0 ;            retried_d = 1'b0 ;            wb_read_done = 1'b0 ;            write_rty_cnt_exp_out = 1'b0 ;            read_rty_cnt_exp_out = 1'b0 ;            wait_for_wb_response = 1'b0 ;            // If last data is cleaned out from PCIW_FIFO            if (last_data_from_pciw_fifo_reg)                n_state = S_IDLE ;            else                n_state = S_WRITE_ERR_RTY ; // Clean until last data is cleaned out from FIFO        end    S_READ: // READ from WB bus to PCIR_FIFO        begin            // Default values for signals not used in this state            pciw_fifo_renable = 1'b0 ;            addr_into_cnt = 1'b0 ;            read_count_load = 1'b0 ;            pci_error_sig_out = 1'b0 ;            error_source_out = 1'b0 ;            write_rty_cnt_exp_out = 1'b0 ;            case ({wb_ack_i, wb_err_i, wb_rty_i})            3'b100 : // If reading of one data is acknowledged            begin                pcir_fifo_wenable = 1'b1 ; // enable writting data into PCIR_FIFO                addr_count = 1'b1 ; // prepare next address if there will be burst                read_count_enable = 1'b1 ; // decrease counter value for cache line size                retried_d = 1'b0 ; // there was no retry                read_rty_cnt_exp_out = 1'b0 ; // there was no retry                wait_for_wb_response = 1'b0 ;                // if last data was transfered                if (last_data_to_pcir_fifo)                begin                    pcir_fifo_control[`LAST_CTRL_BIT]       = 1'b1 ; // FIFO must indicate LAST data transfered                    pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b0 ;                    pcir_fifo_control[`UNUSED_CTRL_BIT]     = 1'b0 ;                    pcir_fifo_control[`ADDR_CTRL_BIT]       = 1'b0 ;                    last_data_transferred = 1'b1 ; // signal for last data transfered                    wb_read_done = 1'b1 ; // signal last data of read transaction for PCI Target                    n_state = S_TURN_ARROUND ;                end                else // if not last data transfered                begin                    pcir_fifo_control = 4'h0 ; // ZERO for control code                    last_data_transferred = 1'b0 ; // not last data transfered                    wb_read_done = 1'b0 ; // read is not done yet                    n_state = S_READ ;                end            end            3'b010 : // If reading of one data is terminated with ERROR            begin                pcir_fifo_wenable = 1'b1 ; // enable for writting to FIFO data with ERROR                addr_count = 1'b0 ; // no need for new address                pcir_fifo_control[`LAST_CTRL_BIT]       = 1'b0 ;                pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b1 ; // FIFO must indicate the DATA with ERROR                pcir_fifo_control[`UNUSED_CTRL_BIT]     = 1'b0 ;                pcir_fifo_control[`ADDR_CTRL_BIT]       = 1'b0 ;                last_data_transferred = 1'b1 ; // signal for last data transfered                wb_read_done = 1'b1 ; // signal last data of read transaction for PCI Target                read_count_enable = 1'b0 ; // no need for cache line, when error occures                n_state = S_TURN_ARROUND ;                retried_d = 1'b0 ; // there was no retry                wait_for_wb_response = 1'b0 ;                read_rty_cnt_exp_out = 1'b0 ; // there was no retry            end            3'b001 : // If reading of one data is retried            begin                pcir_fifo_wenable = 1'b0 ;                pcir_fifo_control = 4'h0 ;                addr_count = 1'b0 ;                read_count_enable = 1'b0 ;                wait_for_wb_response = 1'b0 ;                case ({first_wb_data_access, rty_counter_almost_max_value})                2'b10 :                begin  // if first data of the cycle (CYC_O) is retried - after each retry CYC_O goes inactive                     n_state = S_IDLE ; // go to S_IDLE state for retrying the transaction                    read_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet                       last_data_transferred = 1'b0 ;                    wb_read_done = 1'b0 ;                    retried_d = 1'b1 ; // there was a retry                end                2'b11 :                begin  // if retry counter reached maximum value                    n_state = S_READ_RTY ; // go here to wait for PCI Target to remove read request                    read_rty_cnt_exp_out = 1'b1 ; // signal for reporting read counter expired                      last_data_transferred = 1'b0 ;                    wb_read_done = 1'b0 ;                    retried_d = 1'b1 ; // there was a retry                end                default : // if retry occures after at least 1 data was transferred without breaking cycle (CYC_O inactive)                begin     // then PCI device will retry access!                    n_state = S_TURN_ARROUND ; // go to S_TURN_ARROUND state                     read_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired                      last_data_transferred = 1'b1 ;                    wb_read_done = 1'b1 ;                    retried_d = 1'b0 ; // retry must not be retried, since there is not a first data                end                endcase            end            default :            begin                addr_count = 1'b0 ;                read_count_enable = 1'b0 ;                read_rty_cnt_exp_out = 1'b0 ;                wait_for_wb_response = 1'b1 ; // wait for WB device to response (after 8 clocks RTY CNT is incremented)                if((rty_counter_almost_max_value)&&(set_retry)) // when no WB response and RTY CNT reached maximum allowed value                 begin                    retried_d = 1'b1 ;                    n_state = S_TURN_ARROUND ; // go here to stop read request                    pcir_fifo_wenable = 1'b1 ;                    pcir_fifo_control[`LAST_CTRL_BIT]       = 1'b0 ;                    pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b1 ; // FIFO must indicate the DATA with ERROR                    pcir_fifo_control[`UNUSED_CTRL_BIT]     = 1'b0 ;                    pcir_fifo_control[`ADDR_CTRL_BIT]       = 1'b0 ;                    last_data_transferred = 1'b1 ;                    wb_read_done = 1'b1 ;                end                else                begin                    retried_d = 1'b0 ;                    n_state = S_READ ; // stay in S_READ state to wait WB to response                    pcir_fifo_wenable = 1'b0 ;                    pcir_fifo_control = 4'h0 ;                    last_data_transferred = 1'b0 ;                    wb_read_done = 1'b0 ;                end            end            endcase        end    S_READ_RTY: // Wait for PCI Target to remove read request, when retry counter reaches maximum value!        begin            // Default values for signals not used in this state            pciw_fifo_renable = 1'b0 ;            pcir_fifo_wenable = 1'b0 ;            pcir_fifo_control = 4'h0 ;            addr_into_cnt = 1'b0 ;            read_count_load = 1'b0 ;            read_count_enable = 1'b0 ;            addr_count = 1'b0 ;            pci_error_sig_out = 1'b0 ;            error_source_out = 1'b0 ;            retried_d = 1'b0 ;            wb_read_done = 1'b0 ;            write_rty_cnt_exp_out = 1'b0 ;            read_rty_cnt_exp_out = 1'b0 ;            wait_for_wb_response = 1'b0 ;            // wait for PCI Target to remove read request            if (pci_tar_read_request)            begin                n_state = S_READ_RTY ; // stay in this state until read request is removed                last_data_transferred = 1'b0 ;            end            else // when read request is removed            begin                n_state = S_IDLE ;                last_data_transferred = 1'b1 ; // when read request is removed, there is "last" data            end        end        // Turn arround cycle after writting to PCIR_FIFO (for correct data when reading from PCIW_FIFO)      default: // S_TURN_ARROUND:         begin            // Default values for signals not used in this state            pciw_fifo_renable = 1'b0 ;            pcir_fifo_wenable = 1'b0 ;            pcir_fifo_control = 4'h0 ;            addr_into_cnt = 1'b0 ;            read_count_load = 1'b0 ;            read_count_enable = 1'b0 ;            addr_count = 1'b0 ;            pci_error_sig_out = 1'b0 ;            error_source_out = 1'b0 ;            retried_d = 1'b0 ;            last_data_transferred = 1'b1 ;            wb_read_done = 1'b0 ;            write_rty_cnt_exp_out = 1'b0 ;            read_rty_cnt_exp_out = 1'b0 ;            wait_for_wb_response = 1'b0 ;            n_state = S_IDLE ;        end         endcaseend// Signal for retry monitor in state machine when there is read and first (or single) data accesswire ack_rty_response = wb_ack_i || wb_rty_i ;// Signal first_wb_data_access is set when no WB cycle present till end of first data access of WB cycle on WB busalways@(posedge wb_clock_in or posedge reset_in)begin    if (reset_in)        first_wb_data_access = 1'b1 ;    else    begin        if (~wb_cyc_o)            first_wb_data_access = 1'b1 ;        else if (ack_rty_response)            first_wb_data_access = 1'b0 ;    endend// Signals to FIFOassign  pcir_fifo_be_out = 4'hf ; // pci_tar_be ;// Signals to Conf. spaceassign  pci_error_bc = bc_register ;always@(posedge wb_clock_in or posedge reset_in)begin    if (reset_in)        wb_read_done_out <= #`FF_DELAY 1'b0 ;    else        wb_read_done_out <= #`FF_DELAY wb_read_done ;endalways@(pciw_fifo_renable or addr_into_cnt_reg or pciw_fifo_control_in or pciw_fifo_empty_in)begin    pciw_fifo_renable_out           = pciw_fifo_renable || addr_into_cnt_reg ;    last_data_from_pciw_fifo_reg    = pciw_fifo_control_in[`ADDR_CTRL_BIT] || pciw_fifo_empty_in ;endendmodule

⌨️ 快捷键说明

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