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

📄 avalon_register_slave.v

📁 一个视频信号输入的verilog源代码
💻 V
字号:
// ================================================================================
// (c) 2004 Altera Corporation. All rights reserved.
// Altera products are protected under numerous U.S. and foreign patents, maskwork
// rights, copyrights and other intellectual property laws.
// 
// This reference design file, and your use thereof, is subject to and governed
// by the terms and conditions of the applicable Altera Reference Design License
// Agreement (either as signed by you, agreed by you upon download or as a
// "click-through" agreement upon installation andor found at www.altera.com).
// By using this reference design file, you indicate your acceptance of such terms
// and conditions between you and Altera Corporation.  In the event that you do
// not agree with such terms and conditions, you may not use the reference design
// file and please promptly destroy any copies you have made.
// 
// This reference design file is being provided on an "as-is" basis and as an
// accommodation and therefore all warranties, representations or guarantees of
// any kind (whether express, implied or statutory) including, without limitation,
// warranties of merchantability, non-infringement, or fitness for a particular
// purpose, are specifically disclaimed.  By making this reference design file
// available, Altera expressly does not recommend, suggest or require that this
// reference design file be used in combination with any other product not
// provided by Altera.
// ================================================================================
// ================================================================================
// Avalon register slave module for automotive demo system video in module.
//
// This version assumes video in module is connected to Avalon clock and so no
// synchronisation is neccessary between the avalon and the video clock domain.
// ================================================================================
`timescale 1ns/1ns

module avalon_register_slave
  (
   clk,
   reset_n,

   // Avalon slave
   s_address,
   s_chipselect,
   s_read_n,
   s_write_n,
   s_writedata,
   s_readdata,

   irq,

   // Control/status
   cb_sel,
   
   // Camera module
   camxlen_reg,
   
   // Clipping
   xclips_reg,
   xclipe_reg,
   yclips_reg,
   yclipe_reg,
   
   // Scaling
   xscale_reg,
   yscale_reg,
   xlen_reg,
   ylen_reg,

   // DMA Write Master
   wr_mcontrol,
   m_enable_bit,
   fb_done,
   mfb_reg
   );

  input clk;
  input reset_n;
  
  // Avalon slave
  input [4:0] s_address;
  input       s_chipselect;
  input       s_read_n;
  input       s_write_n;
  input [31:0] s_writedata;
  output [31:0] s_readdata;

  output 	irq;

  // Control/status
  output 	cb_sel;
				       
  // Camera module
  output [9:0] 	camxlen_reg;

  // Clipping
  output [9:0] 	xclips_reg;
  output [9:0] 	xclipe_reg;
  output [8:0] 	yclips_reg;
  output [8:0] 	yclipe_reg;

  // Scaling
  output [15:0] xscale_reg;
  output [15:0] yscale_reg;
  output [9:0] 	xlen_reg;
  output [8:0] 	ylen_reg;
  
  // DMA Write Master
  output 	wr_mcontrol;
  output 	m_enable_bit;
  input 	fb_done;
  output [31:0] mfb_reg;

  reg [1:0]	control_reg;		
  reg [9:0] 	camxlen_reg;
  reg [9:0] 	xclips_reg;
  reg [9:0] 	xclipe_reg;
  reg [8:0] 	yclips_reg;
  reg [8:0] 	yclipe_reg;
  reg [15:0] 	xscale_reg;
  reg [9:0] 	xlen_reg;
  reg [15:0] 	yscale_reg;
  reg [8:0] 	ylen_reg;
  reg [31:0] 	mcontrol_reg;
  reg [3:0] 	minten_reg;
  reg [31:0] 	mfb_reg;

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
  wire 		control_sel = (s_address == (7'h00>>2));
  wire 		camxlen_sel = (s_address == (7'h10>>2));
  wire 		xclips_sel = (s_address == (7'h20>>2));
  wire 		xclipe_sel = (s_address == (7'h24>>2));
  wire 		yclips_sel = (s_address == (7'h28>>2));
  wire 		yclipe_sel = (s_address == (7'h2c>>2));
  wire 		xscale_sel = (s_address == (7'h30>>2));
  wire 		xlen_sel = (s_address == (7'h34>>2));
  wire 		yscale_sel = (s_address == (7'h38>>2));
  wire 		ylen_sel = (s_address == (7'h3c>>2));
  wire 		mcontrol_sel = (s_address == (7'h40>>2));
  wire 		mstat_sel = (s_address == (7'h40>>2));
  wire 		minten_sel = (s_address == (7'h44>>2));
  wire 		micr_sel = (s_address == (7'h48>>2));
  wire 		mfb_sel = (s_address == (7'h50>>2));
  
  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      control_reg <= 2'b0;
    else if (s_chipselect & ~s_write_n & control_sel)
      control_reg <= s_writedata[1:0];

  wire 		cb_sel = control_reg[0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      camxlen_reg <= 10'b0;
    else if (s_chipselect & ~s_write_n & camxlen_sel)
      camxlen_reg <= s_writedata[9:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      xclips_reg <= 10'b0;
    else if (s_chipselect & ~s_write_n & xclips_sel)
      xclips_reg <= s_writedata[9:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      xclipe_reg <= 10'b0;
    else if (s_chipselect & ~s_write_n & xclipe_sel)
      xclipe_reg <= s_writedata[9:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      yclips_reg <= 9'b0;
    else if (s_chipselect & ~s_write_n & yclips_sel)
      yclips_reg <= s_writedata[8:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      yclipe_reg <= 9'b0;
    else if (s_chipselect & ~s_write_n & yclipe_sel)
      yclipe_reg <= s_writedata[8:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      xscale_reg <= 16'b0;
    else if (s_chipselect & ~s_write_n & xscale_sel)
      xscale_reg <= s_writedata[15:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      xlen_reg <= 10'b0;
    else if (s_chipselect & ~s_write_n & xlen_sel)
      xlen_reg <= s_writedata[9:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      yscale_reg <= 16'b0;
    else if (s_chipselect & ~s_write_n & yscale_sel)
      yscale_reg <= s_writedata[15:0];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      ylen_reg <= 9'b0;
    else if (s_chipselect & ~s_write_n & ylen_sel)
      ylen_reg <= s_writedata[8:0];

  wire wr_mcontrol = s_chipselect & ~s_write_n & mcontrol_sel;
  
  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      mcontrol_reg <= 32'b0;
    else if (wr_mcontrol)
      mcontrol_reg <= s_writedata[31:0];

  wire 		m_enable_bit = mcontrol_reg[0];

  wire [3:0] 	mstat = {fb_done, mcontrol_reg[2:0]};

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      minten_reg <= 9'b0;
    else if (s_chipselect & ~s_write_n & minten_sel)
      minten_reg <= s_writedata[3:0];

  wire 		fb_inten = minten_reg[3];

  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      mfb_reg <= 32'b0;
    else if (s_chipselect & ~s_write_n & mfb_sel)
      mfb_reg <= s_writedata[31:0];

  reg  fb_done_r;
  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      fb_done_r <= 1'b0;
    else
      fb_done_r <= fb_done;

  reg  irq;
  always @(posedge clk or negedge reset_n)
    if (~reset_n)
      irq <= 1'b0;
    else if (fb_done & ~fb_done_r & fb_inten)
      irq <= 1'b1;
    else if (s_chipselect & ~s_write_n & micr_sel & s_writedata[3])
      irq <= 1'b0;
  
  wire [31:0] s_readdata = 32'b0
			 | {2{camxlen_sel}} & control_reg
			 | {10{camxlen_sel}} & camxlen_reg
			 | {10{xclips_sel}} & xclips_reg
			 | {10{xclipe_sel}} & xclipe_reg
			 | {9{yclips_sel}} & yclips_reg
			 | {9{yclipe_sel}} & yclipe_reg
			 | {16{xscale_sel}} & xscale_reg
			 | {10{xlen_sel}} & xlen_reg
			 | {16{yscale_sel}} & yscale_reg
			 | {9{ylen_sel}} & ylen_reg
			 | {4{mstat_sel}} & mstat
			 | {4{minten_sel}} & minten_reg
			 | {4{micr_sel}} & {irq, 3'b0}
			 | {32{mfb_sel}} & mfb_reg;
  
endmodule	// avalon_register_slave

⌨️ 快捷键说明

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