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

📄 uart_clock.v

📁 Xilinx的培训教程的源码 virtex
💻 V
字号:
////////////////////////////////////////////////////////////////////////////////// Copyright (c) 2004 Xilinx, Inc.// All Rights Reserved//////////////////////////////////////////////////////////////////////////////////   ____  ____//  /   /\/   /// /___/  \  /    Vendor: Xilinx// \   \   \/     Version: 1.01//  \   \         Filename: uart_clock.v//  /   /         Date Last Modified:  08/04/2004// /___/   /\     Date Created: 10/xx/2002// \   \  /  \//  \___\/\___\////Device:  	Xilinx//Purpose: 	// 	KCPSM3 reference design - Real Time Clock with UART communications// 	The design demonstrates the following:-//           Connection of KCPSM3 to Program ROM//           Connection of UART macros supplied with PicoBlaze with//                Baud rate generation//           Definition of input and output ports with //                Minimum decoding//                Pipelining where appropriate//           Interrupt circuit with//                Simple fixed period timer//                Automatic clearing using interrupt acknowledge from KCPSM3//// 	The design is set up for a 50MHz system clock and UART communications //	rate of 38400 baud.//// 	Please read design documentation to modify to your own requirements.////Reference:// 	None//Revision History://    Rev 1.00 - kc - Start of design entry in VHDL,  10/xx/2002.//    Rev 1.01 - sus - Converted to verilog,  08/04/2004.////////////////////////////////////////////////////////////////////////////////// Contact: e-mail  picoblaze@xilinx.com////////////////////////////////////////////////////////////////////////////////////// Disclaimer: // LIMITED WARRANTY AND DISCLAIMER. These designs are// provided to you "as is". Xilinx and its licensors make and you// receive no warranties or conditions, express, implied,// statutory or otherwise, and Xilinx specifically disclaims any// implied warranties of merchantability, non-infringement, or// fitness for a particular purpose. Xilinx does not warrant that// the functions contained in these designs will meet your// requirements, or that the operation of these designs will be// uninterrupted or error free, or that defects in the Designs// will be corrected. Furthermore, Xilinx does not warrant or// make any representations regarding use or the results of the// use of the designs in terms of correctness, accuracy,// reliability, or otherwise.//// LIMITATION OF LIABILITY. In no event will Xilinx or its// licensors be liable for any loss of data, lost profits, cost// or procurement of substitute goods or services, or for any// special, incidental, consequential, or indirect damages// arising from the use or operation of the designs or// accompanying documentation, however caused and on any theory// of liability. This limitation will apply even if Xilinx// has been advised of the possibility of such damage. This// limitation shall apply not-withstanding the failure of the // essential purpose of any limited remedies herein. //////////////////////////////////////////////////////////////////////////////////module uart_clock(	tx,	rx,	alarm,	clk,
	lock);output	tx;input 	rx;output 	alarm;input 	clk;
output   lock;wire   	tx;wire   	rx;reg   	alarm;wire   	clk;////----------------------------------------------------------------------------------//// declaration of KCPSM3////// declaration of program ROM////// declaration of UART transmitter with integral 16 byte FIFO buffer////// declaration of UART Receiver with integral 16 byte FIFO buffer//////----------------------------------------------------------------------------------//// Signals used to connect KCPSM3 to program ROM and I/O logic//wire [9:0] 	address;wire [17:0]	instruction;wire [7:0]	port_id;wire [7:0] 	out_port;reg [7:0] 	in_port;wire  	write_strobe;wire  	read_strobe;reg  		interrupt;wire  	interrupt_ack;// Signals for connection of peripheralswire [7:0] 	uart_status_port;// Signals to form an timer generating an interrupt every microsecondreg [6:0] 	timer_count;reg  		timer_pulse;// Signals for UART connectionsreg [9:0] 	baud_count;reg  		en_16_x_baud;wire  	write_to_uart;wire  	tx_full;wire  	tx_half_full;reg  		read_from_uart;wire [7:0] 	rx_data;wire  	rx_data_present;wire  	rx_full;wire  	rx_half_full;// Signals for DCMwire clk50MHz;
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------//// Start of circuit description//////--------------------------------------------------------------------------------------------------------------------------------// KCPSM3 and the program memory //--------------------------------------------------------------------------------------------------------------------------------//kcpsm3 processor(	.address(address),    	.instruction(instruction),    	.port_id(port_id),    	.write_strobe(write_strobe),    	.out_port(out_port),    	.read_strobe(read_strobe),    	.in_port(in_port),    	.interrupt(interrupt),    	.interrupt_ack(interrupt_ack),    	.reset(1'b0),    	.clk(clk50MHz));uclock program_rom(	.address(address),    	.instruction(instruction),   	.clk(clk50MHz));
// Insert DCM component heremy_dcm inst_my_dcm (   .CLKIN_IN(clk),    .CLKFX_OUT(clk50MHz),    .CLKIN_IBUFG_OUT(),    .CLK0_OUT(),    .LOCKED_OUT(lock));////--------------------------------------------------------------------------------------------------------------------------------// Interrupt //--------------------------------------------------------------------------------------------------------------------------------////// Interrupt is a generated once every 50 clock cycles to provide a 1us reference. // Interrupt is automatically cleared by interrupt acknowledgment from KCPSM3.////always @(posedge clk50MHz) begin            if (timer_count==49) 		begin         		timer_count <= 1'b0;         		timer_pulse <= 1'b1;		end       else		begin         		timer_count <= timer_count + 1;         		timer_pulse <= 1'b0;		end            if (interrupt_ack == 1'b1)		begin         		interrupt <= 1'b0;		end       else if (timer_pulse == 1'b1) 		begin          		interrupt <= 1'b1;		end        else		begin         		interrupt <= interrupt;		endend//--------------------------------------------------------------------------------------------------------------------------------// KCPSM3 input ports //--------------------------------------------------------------------------------------------------------------------------------////// UART FIFO status signals to form a bus//  assign uart_status_port = {3'b 000,rx_data_present,rx_full,rx_half_full,tx_full,tx_half_full};//// The inputs connect via a pipelined multiplexer//  always @(posedge clk50MHz) begin    case(port_id[0] )    // read UART status at address 00 hex    1'b 0 : 	begin      in_port <= uart_status_port;    	end    // read UART receive data at address 01 hex    1'b 1 : 	begin      in_port <= rx_data;    	end    // Don't care used for all other addresses to ensure minimum logic implementation    default : 	begin      in_port <= 8'b XXXXXXXX;    	end    endcase    // Form read strobe for UART receiver FIFO buffer.    // The fact that the read strobe will occur after the actual data is read by     // the KCPSM3 is acceptable because it is really means 'I have read you'!    read_from_uart <= read_strobe & port_id[0] ;  end//--------------------------------------------------------------------------------------------------------------------------------// KCPSM3 output ports //--------------------------------------------------------------------------------------------------------------------------------//// adding the output registers to the clock processor  always @(posedge clk50MHz) begin    if(write_strobe == 1'b 1) begin      // Alarm register at address 00 hex with data bit0 providing control      if(port_id[0]  == 1'b 0) begin        alarm <= out_port[0] ;      end    end  end//// write to UART transmitter FIFO buffer at address 01 hex.// This is a combinatorial decode because the FIFO is the 'port register'.//assign write_to_uart = write_strobe & port_id[0] ;////--------------------------------------------------------------------------------------------------------------------------------// UART  //--------------------------------------------------------------------------------------------------------------------------------//// Connect the 8-bit, 1 stop-bit, no parity transmit and receive macros.// Each contains an embedded 16-byte FIFO buffer.//uart_tx transmit(	.data_in(out_port),    	.write_buffer(write_to_uart),    	.reset_buffer(1'b0),    	.en_16_x_baud(en_16_x_baud),    	.serial_out(tx),    	.buffer_full(tx_full),    	.buffer_half_full(tx_half_full),    	.clk(clk50MHz));uart_rx receive(	.serial_in(rx),    	.data_out(rx_data),    	.read_buffer(read_from_uart),    	.reset_buffer(1'b0),    	.en_16_x_baud(en_16_x_baud),    	.buffer_data_present(rx_data_present),    	.buffer_full(rx_full),    	.buffer_half_full(rx_half_full),    	.clk(clk50MHz));
/// Implement the 16x bit rate counter for the uart transmit and receive.
  // The system clock is 50 MHz, and the desired baud rate is 9600.  I used
  // the formula in the documentation to calculate the terminal count value.////--------------------------------------------------------------------------------------------------------------------------------  always @(posedge clk50MHz) begin 
		if (baud_count == 325)		begin           		baud_count <= 1'b0;      	     	en_16_x_baud <= 1'b1;		end       else		begin           		baud_count <= baud_count + 1;           		en_16_x_baud <= 1'b0;      	end    endendmodule//----------------------------------------------------------------------------------------------------------------------------------//// END OF FILE uart_clock.v////----------------------------------------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

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