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

📄 pci_wb_slave.v

📁 这是用pci-wishbone核和16450串口核在xilinx的fpga上实现的串口程序
💻 V
📖 第 1 页 / 共 4 页
字号:
                begin                    n_state = S_IDLE ;                    del_done = 1'b1 ;                    wbr_fifo_flush = ~wbr_fifo_empty_in ;                end                else                begin                    n_state          = S_READ ;                end            end // S_READ    S_CONF_WRITE:  begin                        `ifdef HOST                            wbw_data_out_sel = SEL_CCYC_ADDR ;                            del_req          = do_ccyc_req && ~burst_transfer  ;                            del_done         = do_ccyc_comp && ~burst_transfer ;                            del_in_progress  = do_ccyc_comp && ~burst_transfer ;                        `endif                        n_state         = S_IDLE ; // next state after configuration access is always idle                        if ( burst_transfer )                        begin                            err = 1'b1 ;                        end                        else                        begin                            `ifdef HOST                            if ( do_ccyc_req || (ccyc_hit && ~do_ccyc_comp))                            begin                                rty = 1'b1 ;                            end                            else                            if ( do_ccyc_comp )                            begin                                err = del_error_in ;                                ack = ~del_error_in ;                            end                            else                            begin                                ack = ~ccyc_hit ;                                conf_wenable = ~ccyc_hit ;                            end                            `else                            ack = 1'b1 ;                            conf_wenable = 1'b1 ;                            `endif                        end                    end // S_CONF_WRITE    S_CONF_READ:   begin                        `ifdef HOST                            wbw_data_out_sel = SEL_CCYC_ADDR ;                            del_req          = ~burst_transfer && ( do_ccyc_req  || do_iack_req  ) ;                            del_done         = ~burst_transfer && ( do_ccyc_comp || do_iack_comp ) ;                            del_in_progress  = ~burst_transfer && ( do_ccyc_comp || do_iack_comp ) ;                            wbr_fifo_renable = ~burst_transfer && ( do_ccyc_comp || do_iack_comp ) ;                        `endif                        n_state = S_IDLE ; // next state after configuration access is always idle                        if ( burst_transfer )                        begin                            err = 1'b1 ;                        end                        else                        begin                            `ifdef HOST                            if ( do_ccyc_req || ( ccyc_hit && ~do_ccyc_comp ))                            begin                                rty = 1'b1 ;                            end                            else                            if ( do_iack_req || ( iack_hit && ~do_iack_comp ))                            begin                                rty = 1'b1 ;                            end                            else                            if ( do_iack_comp || do_ccyc_comp )                            begin                                err = del_error_in ;                                ack = ~del_error_in ;                            end                            else                            begin                                ack = ~( ccyc_hit || iack_hit ) ;                                conf_renable = ~( ccyc_hit || iack_hit ) ;                            end                            `else                            ack = 1'b1 ;                            conf_renable = 1'b1 ;                            `endif                        end                    end //S_CONF_READ    default:begin                n_state = S_IDLE ; // return to idle state            end //default    endcaseend// configuration space offset output assignmentassign wb_conf_offset_out = {wb_addr_in[11:2], 2'b00} ; // upper 10 bits of address input and two zeros// data output assignment - for image writes, first data is address, subsequent data comes from intermediate registerreg [31:0] wb_data ;`ifdef HOSTreg [1:0] wbw_data_out_sel_reg ;always@(posedge wb_clock_in or posedge reset_in)begin    if ( reset_in )        wbw_data_out_sel_reg <= #`FF_DELAY SEL_ADDR_IN ;    else        wbw_data_out_sel_reg <= #`FF_DELAY wbw_data_out_sel ;endalways@(wbw_data_out_sel_reg or wb_addr_in or ccyc_addr_in or d_incoming)begin    case ( wbw_data_out_sel_reg )        SEL_CCYC_ADDR:  wb_data = ccyc_addr_in ;        SEL_DATA_IN:    wb_data = d_incoming ;        default: wb_data        = wb_addr_in ;    endcaseend`else`ifdef GUESTreg wbw_data_out_sel_reg ;always@(posedge wb_clock_in or posedge reset_in)begin    if ( reset_in )        wbw_data_out_sel_reg <= #`FF_DELAY SEL_ADDR_IN ;    else        wbw_data_out_sel_reg <= #`FF_DELAY wbw_data_out_sel ;endalways@(wbw_data_out_sel_reg or wb_addr_in or d_incoming)begin    if ( wbw_data_out_sel_reg )        wb_data = wb_addr_in ;    else        wb_data = d_incoming ;end`endif`endif// command / byte enable assignment - with address, bus command is provided, with data - byte enables are providedreg [3:0] wb_cbe ;always@(wbw_data_out_sel_reg or d_incoming or map)begin    if (wbw_data_out_sel_reg && map)        wb_cbe = `BC_IO_WRITE ;    else    if (wbw_data_out_sel_reg)        wb_cbe = `BC_MEM_WRITE ;    else        wb_cbe = ~(d_incoming[35:32]) ;end// for configuration writes, data output is always data from WISHBONE - in guest implementation data is all 0.`ifdef GUEST    assign wb_conf_data_out = 32'h00000000 ;`endif`ifdef GUEST    `ifdef NO_CNF_IMAGE    `else        `define PCI_WB_SLAVE_DO_OUT_MUX    `endif`else`ifdef HOST    `define PCI_WB_SLAVE_DO_OUT_MUX ;`endif`endif`ifdef PCI_WB_SLAVE_DO_OUT_MUX    reg [31:0] sdata_source ;    // WISHBONE data output select lines for output multiplexor    wire sdata_o_sel_new = ( wb_conf_hit_in && ~wiack_hit && ~wccyc_hit ) ? CONF_SEL : WBR_SEL ;    reg sdata_o_sel ;    always@(posedge wb_clock_in or posedge reset_in)    begin        if ( reset_in )            sdata_o_sel <= #`FF_DELAY WBR_SEL ;        else        if ( decode_en )            sdata_o_sel <= #`FF_DELAY sdata_o_sel_new ;    end    always@(sdata_o_sel or wbr_fifo_data_in or wb_conf_data_in)    begin        case (sdata_o_sel)            WBR_SEL :sdata_source = wbr_fifo_data_in ;            CONF_SEL:sdata_source = wb_conf_data_in ;        endcase    end`else    wire [31:0] sdata_source = wbr_fifo_data_in ;`endif`ifdef REGISTER_WBS_OUTPUTSalways@(posedge wb_clock_in or posedge reset_in)begin    if ( reset_in )    begin        ACK_O         <= #`FF_DELAY 1'b0 ;        RTY_O         <= #`FF_DELAY 1'b0 ;        ERR_O         <= #`FF_DELAY 1'b0 ;        SDATA_O       <= #`FF_DELAY 0 ;        del_write_out <= #`FF_DELAY 1'b0 ;        `ifdef HOST        wb_conf_wenable_out <= #`FF_DELAY 1'b0 ;        wb_conf_data_out    <= #`FF_DELAY 0 ;        `endif        del_bc_out    <= #`FF_DELAY `BC_RESERVED0 ;        del_req_out <= #`FF_DELAY 1'b0 ;        del_done_out <= #`FF_DELAY 1'b0 ;        del_burst_out <= #`FF_DELAY 1'b0 ;        del_in_progress_out <= #`FF_DELAY 1'b0 ;        wb_conf_be_out <= #`FF_DELAY 0 ;        wb_data_out    <= #`FF_DELAY 0 ;        wb_cbe_out <= #`FF_DELAY 0 ;        wbw_fifo_wenable_out <= #`FF_DELAY 0 ;        wbw_fifo_control_out <= #`FF_DELAY 0 ;        wbr_fifo_renable_out <= #`FF_DELAY 0 ;    end    else    begin        ACK_O   <= #`FF_DELAY ack && !ACK_O ;        RTY_O   <= #`FF_DELAY rty && !RTY_O ;        ERR_O    <= #`FF_DELAY err && !ERR_O ;        SDATA_O       <= #`FF_DELAY sdata_source ;        del_write_out <= #`FF_DELAY WE_I ;        `ifdef HOST        wb_conf_wenable_out <= #`FF_DELAY conf_wenable ;        wb_conf_data_out    <= #`FF_DELAY SDATA_I ;        `endif        del_bc_out <= #`FF_DELAY del_bc ;        del_req_out <= #`FF_DELAY del_req ;        del_done_out <= #`FF_DELAY del_done ;        del_burst_out <= #`FF_DELAY del_burst ;        del_in_progress_out <= #`FF_DELAY del_in_progress ;        wb_conf_be_out <= #`FF_DELAY SEL_I ;        wb_data_out <= #`FF_DELAY wb_data ;        wb_cbe_out <= #`FF_DELAY wb_cbe ;        wbw_fifo_wenable_out <= #`FF_DELAY wbw_fifo_wenable ;        wbw_fifo_control_out <= #`FF_DELAY wbw_fifo_control ;        wbr_fifo_renable_out <= #`FF_DELAY wbr_fifo_renable ;    endend`elseassign SDATA_O = sdata_source ;assign ACK_O = ack ;assign RTY_O = rty ;assign ERR_O = err ;// write operation indicator for delayed transaction requestsassign del_write_out = WE_I ;assign del_bc_out = del_bc ;assign del_req_out  = del_req ; // read requestassign del_done_out = del_done ; // read doneassign del_burst_out = del_burst ;assign del_in_progress_out = del_in_progress ;`ifdef HOSTassign wb_conf_data_out = SDATA_I ;assign wb_conf_wenable_out = conf_wenable ;`endif// Configuration space byte enables outputassign wb_conf_be_out = SEL_I ; // just route select lines from WISHBONE to conf spaceassign wb_data_out    = wb_data ;assign wb_cbe_out = wb_cbe ;assign wbw_fifo_wenable_out = wbw_fifo_wenable ; //write enable for WBW_FIFOassign wbw_fifo_control_out = wbw_fifo_control ; //control bus output for WBW_FIFOassign wbr_fifo_renable_out = wbr_fifo_renable ; //read enable for wbr_fifo`endifendmodule //WB_SLAVE

⌨️ 快捷键说明

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