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

📄 readyctrl.v

📁 Free 8051 core upload
💻 V
字号:
//**************************************************************************//
// Copyright (c) 1999-2005 Digital Core Design  DCD                         //
//**************************************************************************//
// Please review the terms of the license agreement before using this file. //
// If you are not an authorized user, please destroy this source code file  //
// and   notify   DCD  immediately  that  you  inadvertently  received  an  //
// unauthorized copy.                                                       //
//**************************************************************************//
//////////////////////////////////////////////////////////////////////////////
// Project name         : DP8051
// Project description  : DP8051 Microcontroller Unit
//
// File name            : READYCTRL.V
// File contents        : Module READYCTRL
//                        Architecture SIM of READYCTRL
// Purpose              : Simple "ready" generator
//
// Destination library  : DP805X_LIB
//
// Design Engineer      : P.K.
// Version              : 3.20
// Last modification    : 2005-01-03
//////////////////////////////////////////////////////////////////////////////
`timescale 1 ns / 1 ns // timescale for following modules

module readyctrl (clk, reset, sfraddr, sfrdatai, sfrwe, xdatard, xdatawr,
                  sfrdatao, ready);

  input clk;
  input reset;
  input [6:0]sfraddr;
  input [7:0]sfrdatai;
  input sfrwe;
  input xdatard;
  input xdatawr;
  output [7:0]sfrdatao;
  output ready;

  // 0x8E
  parameter CKCON_ID        = 7'b0001110;

  // 0x8E
  parameter CKCON_RV        = 8'b00000111;

//**************************************************************************//

  reg [2:0]ckcon_reg;
  reg [3:0]ready_cnt_reg;
  reg ready_cnt_zero;
  reg ready_reg;
  wire ready_s;

  ////////////////////////////////////////////////////////////////////////////
  //ckcon_reg_proc:
  ////////////////////////////////////////////////////////////////////////////
  always @(posedge clk)
  begin : ckcon_reg_proc
  /////////////////////////////////////////////
  // Synchronous reset
  /////////////////////////////////////////////
    if (reset==1'b1)
      ckcon_reg <= CKCON_RV[2:0];
    else
    /////////////////////////////////////////////
    // Special function register write
    /////////////////////////////////////////////
      if (sfrwe==1'b1 && sfraddr==CKCON_ID)
        ckcon_reg <= sfrdatai[2:0];
  end

  ////////////////////////////////////////////////////////////////////////////
  //ready_cnt_proc:
  ////////////////////////////////////////////////////////////////////////////
  always @(posedge clk) begin : ready_cnt_reg_proc
    if (reset==1'b1)
      ready_cnt_reg <= 4'b0000;
    else
      if (ready_cnt_reg > 4'b0000)
        ready_cnt_reg <= ready_cnt_reg - 1'b1;
      else
        begin
          if ((xdatard==1'b1 || xdatawr==1'b1) &&
              (ready_cnt_zero==1'b0 && ckcon_reg > 3'b001))
            ready_cnt_reg <= ckcon_reg - 1'b1;
        end
  end

  ////////////////////////////////////////////////////////////////////////////
  //ready_cnt_zero_proc:
  ////////////////////////////////////////////////////////////////////////////
  always @(posedge clk) begin : ready_cnt_zero_proc
    if (reset==1'b1)
      ready_cnt_zero <= 1'b0;
    else
      ready_cnt_zero <= 1'b0;
      if (ready_cnt_reg==4'b0001)
        ready_cnt_zero <= 1'b1;
  end

  ////////////////////////////////////////////////////////////////////////////
  //ready_reg_proc:
  ////////////////////////////////////////////////////////////////////////////
  always @(posedge clk) begin : ready_reg_proc
    if (reset==1'b1)
      ready_reg <= 1'b0;
    else
      begin
        ready_reg <= 1'b0;
        if (xdatard==1'b1 || xdatawr==1'b1)
          if (ckcon_reg==3'b001)
            begin
              if (ready_reg==1'b0)
                ready_reg <= 1'b1;
            end
          else
            if (ready_cnt_reg==4'b0001)
              ready_reg <= 1'b1;
      end
  end

  ////////////////////////////////////////////////////////////////////////////
  //sfrdatao_drv:
  ////////////////////////////////////////////////////////////////////////////
  assign sfrdatao = ckcon_reg;

  ////////////////////////////////////////////////////////////////////////////
  //ready_s_drv:
  ////////////////////////////////////////////////////////////////////////////
  assign ready_s = ((xdatard==1'b1 && ckcon_reg==3'b000)    ? 1'b1 :
                   ((xdatawr==1'b1 && ckcon_reg==3'b000)    ? 1'b1 :
                     ready_reg));

  ////////////////////////////////////////////////////////////////////////////
  //ready_drv:
  ////////////////////////////////////////////////////////////////////////////
  assign ready = ready_s;

endmodule

⌨️ 快捷键说明

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