HierarchyFilesModulesSignalsTasksFunctionsHelp
//
// File:   jtag2mem_6111.v
// Date:   09-Dec-05
// Author: I. Chuang <ichuang@mit.edu>;
//
// Verilog module to interface MIT 6.111 labkit to the PC and allow
// memory on the FPGA to be loaded to and read from by the PC.
//
// Uses jtag2mem module.
//
//---------------------------------------------------------------------------
//
// This example creates a small memory and interfaces this to a video 
// display and also to the JTAG interface (to the PC).  The contents of the
// memory are displayed in a grid of 24x48 point fonts in a 640x480
// VGA display, with each 8 bit byte mapped to an ASCII character value.
// Memory location 3FF is special: it is mapped to the switches.
// Memory location 000 is also special; its contents are displayed on the LEDs.
//
// For debugging, these button actions can be tested:
//
//   button0: displays a counter on the hex displays 
//   button1: displays all "A" characters in text screen
//   button2: displays the memory value last read as all the characters
//   button3: displays the vga textgrid coordinates on the hex displays
//   button_up: red color bars on VGA
//   button_down: fill memory with value equal to lower 8 bits of address
//
// To interface to the jtag2mem module on the PC, start a command shell
// (start...run and type in "cmd") then at the command line prompt
// change your working directory to the one with these files, then
// run "xtclsh jtag2mem.tcl" with the approprate arguments.
//
// For example:
//
//  xtclsh jtag2mem.tcl read 3ff 1
//
//      reads one byte of the memory at address 3ff (should give switch values)
//
//  xtclsh jtag2mem.tcl write 000
//
//      lets you write to memory starting at location 000 (should set LEDs)
//
// Note that to run jtag2mem.tcl, you will need various Xilinx libraries,
// including versions of libTclJtag10.dll and libJtagcomm10.dll appropriate
// for the release of ISE which you are running.
//
//---------------------------------------------------------------------------

`include "debounce.v"
`include "cmem.v"		// 1024*768/12/24 = 672 bytes (8bit wide)
`include "jtag2mem.v"
`include "display_16hex.v"
`include "vga_text.v"

module jtag2mem_6111Index
  (
   beep, audio_reset_b, ac97_sdata_out, ac97_sdata_in, ac97_synch,
   ac97_bit_clock,
   
   vga_out_red, vga_out_green, vga_out_blue, vga_out_sync_b,
   vga_out_blank_b, vga_out_pixel_clock, vga_out_hsync,
   vga_out_vsync,
   
   tv_out_ycrcb, tv_out_reset_b, tv_out_clock, tv_out_i2c_clock,
   tv_out_i2c_data, tv_out_pal_ntsc, tv_out_hsync_b,
   tv_out_vsync_b, tv_out_blank_b, tv_out_subcar_reset,
   
   tv_in_ycrcb, tv_in_data_valid, tv_in_line_clock1,
   tv_in_line_clock2, tv_in_aef, tv_in_hff, tv_in_aff,
   tv_in_i2c_clock, tv_in_i2c_data, tv_in_fifo_read,
   tv_in_fifo_clock, tv_in_iso, tv_in_reset_b, tv_in_clock,
   
   ram0_data, ram0_address, ram0_adv_ld, ram0_clk, ram0_cen_b,
   ram0_ce_b, ram0_oe_b, ram0_we_b, ram0_bwe_b, 
   
   ram1_data, ram1_address, ram1_adv_ld, ram1_clk, ram1_cen_b,
   ram1_ce_b, ram1_oe_b, ram1_we_b, ram1_bwe_b,
   
   clock_feedback_out, clock_feedback_in,
   
   flash_data, flash_address, flash_ce_b, flash_oe_b, flash_we_b,
   flash_reset_b, flash_sts, flash_byte_b,
   
   rs232_txd, rs232_rxd, rs232_rts, rs232_cts,
   
   mouse_clock, mouse_data, keyboard_clock, keyboard_data,
   
   clock_27mhz, clock1, clock2,
   
   disp_blank, disp_data_out, disp_clock, disp_rs, disp_ce_b,
   disp_reset_b, disp_data_in,
   
   button0, button1, button2, button3, button_enter, button_right,
   button_left, button_down, button_up,
   
   switch,
   
   led,
   
   user1, user2, user3, user4,
   
   daughtercard,
   
   systemace_data, systemace_address, systemace_ce_b,
   systemace_we_b, systemace_oe_b, systemace_irq, systemace_mpbrdy,
   
   analyzer1_data, analyzer1_clock,
   analyzer2_data, analyzer2_clock,
   analyzer3_data, analyzer3_clock,
   analyzer4_data, analyzer4_clock);
   
   output beep, audio_reset_b, ac97_synch, ac97_sdata_out;
   input  ac97_bit_clock, ac97_sdata_in;
   
   output [7:0] vga_out_red, vga_out_green, vga_out_blue;
   output 	vga_out_sync_b, vga_out_blank_b, vga_out_pixel_clock,
		vga_out_hsync, vga_out_vsync;
   
   output [9:0] tv_out_ycrcb;
   output 	tv_out_reset_b, tv_out_clock, tv_out_i2c_clock, tv_out_i2c_data,
		tv_out_pal_ntsc, tv_out_hsync_b, tv_out_vsync_b, tv_out_blank_b,
		tv_out_subcar_reset;
   
   input [19:0] tv_in_ycrcb;
   input 	tv_in_data_valid, tv_in_line_clock1, tv_in_line_clock2, tv_in_aef,
		tv_in_hff, tv_in_aff;
   output 	tv_in_i2c_clock, tv_in_fifo_read, tv_in_fifo_clock, tv_in_iso,
		tv_in_reset_b, tv_in_clock;
   inout 	tv_in_i2c_data;
   
   inout [35:0] ram0_data;
   output [18:0] ram0_address;
   output 	 ram0_adv_ld, ram0_clk, ram0_cen_b, ram0_ce_b, ram0_oe_b, ram0_we_b;
   output [3:0]  ram0_bwe_b;
   
   inout [35:0]  ram1_data;
   output [18:0] ram1_address;
   output 	 ram1_adv_ld, ram1_clk, ram1_cen_b, ram1_ce_b, ram1_oe_b, ram1_we_b;
   output [3:0]  ram1_bwe_b;
   
   input 	 clock_feedback_in;
   output 	 clock_feedback_out;
   
   inout [15:0]  flash_data;
   output [23:0] flash_address;
   output 	 flash_ce_b, flash_oe_b, flash_we_b, flash_reset_b, flash_byte_b;
   input 	 flash_sts;
   
   output 	 rs232_txd, rs232_rts;
   input 	 rs232_rxd, rs232_cts;
   
   input 	 mouse_clock, mouse_data, keyboard_clock, keyboard_data;
   
   input 	 clock_27mhz, clock1, clock2;
   
   output 	 disp_blank, disp_clock, disp_rs, disp_ce_b, disp_reset_b;  
   input 	 disp_data_in;
   output 	 disp_data_out;
   
   input 	 button0, button1, button2, button3, button_enter, button_right,
		 button_left, button_down, button_up;
   input [7:0] 	 switch;
   output [7:0]  led;
   
   inout [31:0]  user1, user2, user3, user4;
   
   inout [43:0]  daughtercard;
   
   inout [15:0]  systemace_data;
   output [6:0]  systemace_address;
   output 	 systemace_ce_b, systemace_we_b, systemace_oe_b;
   input 	 systemace_irq, systemace_mpbrdy;
   
   output [15:0] analyzer1_data, analyzer2_data, analyzer3_data, 
		 analyzer4_data;
   output 	 analyzer1_clock, analyzer2_clock, analyzer3_clock, analyzer4_clock;
   
   ////////////////////////////////////////////////////////////////////////////
   //
   // I/O Assignments
   //
   ////////////////////////////////////////////////////////////////////////////
   
   // Audio Input and Output
   assign 	 beep= 1'b0;
   assign 	 audio_reset_b = 1'b0;
   assign 	 ac97_synch = 1'b0;
   assign 	 ac97_sdata_out = 1'b0;
   // ac97_sdata_in is an input
   
   // VGA Output
/*
   assign 	 vga_out_red = 10'h0;
   assign 	 vga_out_green = 10'h0;
   assign 	 vga_out_blue = 10'h0;
   assign 	 vga_out_sync_b = 1'b1;
   assign 	 vga_out_blank_b = 1'b1;
   assign 	 vga_out_pixel_clock = 1'b0;
   assign 	 vga_out_hsync = 1'b0;
   assign 	 vga_out_vsync = 1'b0;
*/
   
   // Video Output
   assign 	 tv_out_ycrcb = 10'h0;
   assign 	 tv_out_reset_b = 1'b0;
   assign 	 tv_out_clock = 1'b0;
   assign 	 tv_out_i2c_clock = 1'b0;
   assign 	 tv_out_i2c_data = 1'b0;
   assign 	 tv_out_pal_ntsc = 1'b0;
   assign 	 tv_out_hsync_b = 1'b1;
   assign 	 tv_out_vsync_b = 1'b1;
   assign 	 tv_out_blank_b = 1'b1;
   assign 	 tv_out_subcar_reset = 1'b0;
   
   // Video Input
   assign 	 tv_in_i2c_clock = 1'b0;
   assign 	 tv_in_fifo_read = 1'b0;
   assign 	 tv_in_fifo_clock = 1'b0;
   assign 	 tv_in_iso = 1'b0;
   assign 	 tv_in_reset_b = 1'b0;
   assign 	 tv_in_clock = 1'b0;
   assign 	 tv_in_i2c_data = 1'bZ;
   // tv_in_ycrcb, tv_in_data_valid, tv_in_line_clock1, tv_in_line_clock2, 
   // tv_in_aef, tv_in_hff, and tv_in_aff are inputs
   
   // SRAMs
   assign 	 ram0_data = 36'hZ;
   assign 	 ram0_address = 19'h0;
   assign 	 ram0_adv_ld = 1'b0;
   assign 	 ram0_clk = 1'b0;
   assign 	 ram0_cen_b = 1'b1;
   assign 	 ram0_ce_b = 1'b1;
   assign 	 ram0_oe_b = 1'b1;
   assign 	 ram0_we_b = 1'b1;
   assign 	 ram0_bwe_b = 4'hF;
   assign 	 ram1_data = 36'hZ; 
   assign 	 ram1_address = 19'h0;
   assign 	 ram1_adv_ld = 1'b0;
   assign 	 ram1_clk = 1'b0;
   assign 	 ram1_cen_b = 1'b1;
   assign 	 ram1_ce_b = 1'b1;
   assign 	 ram1_oe_b = 1'b1;
   assign 	 ram1_we_b = 1'b1;
   assign 	 ram1_bwe_b = 4'hF;
   assign 	 clock_feedback_out = 1'b0;
   // clock_feedback_in is an input
   
   // Flash ROM
   assign 	 flash_data = 16'hZ;
   assign 	 flash_address = 24'h0;
   assign 	 flash_ce_b = 1'b1;
   assign 	 flash_oe_b = 1'b1;
   assign 	 flash_we_b = 1'b1;
   assign 	 flash_reset_b = 1'b0;
   assign 	 flash_byte_b = 1'b1;
   // flash_sts is an input
   
   // RS-232 Interface
   assign 	 rs232_txd = 1'b1;
   assign 	 rs232_rts = 1'b1;
   // rs232_rxd and rs232_cts are inputs
   
   // PS/2 Ports
   // mouse_clock, mouse_data, keyboard_clock, and keyboard_data are inputs
   
   // LED Displays
/*
   assign 	 disp_blank = 1'b1;
   assign 	 disp_clock = 1'b0;
   assign 	 disp_rs = 1'b0;
   assign 	 disp_ce_b = 1'b1;
   assign 	 disp_reset_b = 1'b0;
   assign 	 disp_data_out = 1'b0;
*/
   // disp_data_in is an input
   
   // Buttons, Switches, and Individual LEDs
   // assign 	 led = 8'hFF;

   // button0, button1, button2, button3, button_enter, button_right,
   // button_left, button_down, button_up, and switches are inputs
   
   // User I/Os
   assign 	 user1 = 32'hZ;
   assign 	 user2 = 32'hZ;
   assign 	 user3 = 32'hZ;
   assign 	 user4 = 32'hZ;
   
   // Daughtercard Connectors
   assign 	 daughtercard = 44'hZ;
   
   // SystemACE Microprocessor Port
   assign 	 systemace_data = 16'hZ;
   assign 	 systemace_address = 7'h0;
   assign 	 systemace_ce_b = 1'b1;
   assign 	 systemace_we_b = 1'b1;
   assign 	 systemace_oe_b = 1'b1;
   // systemace_irq and systemace_mpbrdy are inputs
   
   // Logic Analyzer
   assign 	 analyzer1_data = 16'h0;
   assign 	 analyzer1_clock = 1'b1;
   assign 	 analyzer2_data = 16'h0;
   assign 	 analyzer2_clock = 1'b1;
   assign 	 analyzer3_data = 16'h0;
   assign 	 analyzer3_clock = 1'b1;
   assign 	 analyzer4_data = 16'h0;
   assign 	 analyzer4_clock = 1'b1;

   ////////////////////////////////////////////////////////////
   // setup basics

   // use FPGA's digital clock manager to produce a 50 Mhz clock from 27 Mhz
   // actual frequency: 49.85 MHz
   wire clock_50mhz_unbuf,clock_50MHz;
   DCM vclk1(.CLKIN(clock_27mhz),.CLKFX(clock_50mhz_unbuf));
   // synthesis attribute CLKFX_DIVIDE of vclk1 is 13
   // synthesis attribute CLKFX_MULTIPLY of vclk1 is 24
   // synthesis attribute CLK_FEEDBACK of vclk1 is NONE
   // synthesis attribute CLKIN_PERIOD of vclk1 is 37
   BUFG vclk2(.O(clock_50MHz),.I(clock_50mhz_unbuf));

   wire clk = clock_50MHz;

   // power-on reset generation
   wire power_on_reset;    // remain high for first 16 clocks
   SRL16 reset_sr (.D(1'b0), .CLK(clk), .Q(power_on_reset),
		   .A0(1'b1), .A1(1'b1), .A2(1'b1), .A3(1'b1));
   defparam reset_sr.INIT = 16'hFFFF;

   // ENTER button is user reset
   wire reset,user_reset;
   debounce db1(power_on_reset, clk, ~button_enter, user_reset);
   assign reset = user_reset | power_on_reset;

   ////////////////////////////////////////////////////////////
   // create a small memory for testing

   wire [9:0] ram_addr;
   wire [7:0] read_data, write_data;
   wire       ram_we;

   wire [9:0] v_addr;
   wire [7:0] v_data;
 
   cmem cmem1( ram_addr, v_addr, clk, clk, write_data, read_data,
	       v_data, ram_we );
   
   ////////////////////////////////////////////////////////////
   // debug: when button_down pressed, fill up memory with increasing sequence

   reg [63:0] count;
   always @(posedge clk) count <= count + 1;

   wire [9:0] ram_addr1, ram_addr2;
   wire [7:0] write_data1, write_data2;
   wire       ram_we1, ram_we2;
   wire       testfill = ~button_down;
 
   assign     ram_we = testfill ? ram_we2 : ram_we1;
   assign     ram_addr = testfill ? ram_addr2 : ram_addr1;
   assign     write_data = testfill ? write_data2 : write_data1;

   assign     ram_we2 = count[0];
   assign     write_data2 = count[8:1];
   assign     ram_addr2 = count[8:1];

   ////////////////////////////////////////////////////////////
   // video display

   wire [2:0] rgb;
   wire       pix_clk;
   wire       blank;
   wire       cclk;
   wire [5:0] cx, cy;
   reg [7:0]  char;

   vga_text vt1(reset, clk, rgb, vga_out_hsync, vga_out_vsync,
		pix_clk, blank, cclk, cx, cy, char);

   assign     vga_out_red = ~button_up ? {cx,2'b0} : {8{rgb[0]}};
   assign     vga_out_green = {8{rgb[1]}};
   assign     vga_out_blue = {8{rgb[2]}};
   assign     vga_out_blank_b = ~blank;
   assign     vga_out_pixel_clock = pix_clk;	 // vga pixel clock
   assign     vga_out_sync_b = 1'b1;
 
   assign     v_addr = cx + cy*26;
   always @(posedge clk)
     char <= ~button1 ? "A"
	     : ~button2 ? read_data
	     : cclk ? v_data : char;
 
   ////////////////////////////////////////////////////////////
   // memory-mapped LED's (jtag write)

   reg [7:0]  led_reg;
   always @(posedge clk)
     led_reg <= (ram_addr1==0) ? write_data1 : led_reg;
 
   ////////////////////////////////////////////////////////////
   // memory-mapped switches (jtag read)

   wire [7:0] read_data1 = (ram_addr1=={10{1'b1}}) ? switch : read_data;
 
   ////////////////////////////////////////////////////////////
   // JTAG interface 
   //
   // read_data1, ram_addr1, ram_we1 connect to the memory, through
   // some multiplers used for debugging and demos.

   wire [3:0] state;

   jtag2mem #(.DBITS(8),.ABITS(10)) 
     j2m(reset, clk, read_data1, write_data1, ram_addr1, ram_we1, state);

   ////////////////////////////////////////////////////////////
   // debug
   
   assign     led = ~led_reg;

   reg [63:0] hexdata;
   always @(posedge clk)
     hexdata <= ~button0 ? count
		: ~button3 ? {2'b0,v_addr,8'b0,2'b0,cx, 2'b0,cy, 28'b0, v_data}
		: {2'b0,ram_addr,4'b0,8'b0,8'b0,read_data,8'b0,
		   write_data, 4'b0, state};
  
   display_16hex hexdisp1(reset, clk, hexdata,
			  disp_blank, disp_clock, disp_rs, disp_ce_b,
			  disp_reset_b, disp_data_out);

endmodule


HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Sun Dec 11 09:59:58 2005
From: jtag2mem_6111.v

Verilog converted to html by v2html 7.30 (written by Costas Calamvokis).Help