cpu32

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 2516545bbfddc7aa8d588c5ddc9ab726a50a7e60
parent 0ce0f1485385e95fd38d5db6e69d69d6521021a5
Author: Brian Swetland <swetland@frotz.net>
Date:   Sat, 18 Feb 2012 05:30:01 -0800

de0: add jtag reset/download peripheral and ability, switch to unified memory

Diffstat:
Mde0/de0board.qsf | 4+++-
Mde0/de0board.v | 46+++++++++++++++++++++++-----------------------
Ade0/jtag.v | 181+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ade0/jtagloader.v | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 280 insertions(+), 24 deletions(-)

diff --git a/de0/de0board.qsf b/de0/de0board.qsf @@ -530,13 +530,15 @@ set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_RO set_global_assignment -name VERILOG_FILE de0board.v set_global_assignment -name SDC_FILE de0board.sdc +set_global_assignment -name VERILOG_FILE jtag.v +set_global_assignment -name VERILOG_FILE jtagloader.v set_global_assignment -name VERILOG_FILE ../verilog/alu.v set_global_assignment -name VERILOG_FILE ../verilog/chardata.v set_global_assignment -name VERILOG_FILE ../verilog/control.v set_global_assignment -name VERILOG_FILE ../verilog/cpu32.v +set_global_assignment -name VERILOG_FILE ../verilog/dualsyncram.v set_global_assignment -name VERILOG_FILE ../verilog/library.v set_global_assignment -name VERILOG_FILE ../verilog/regfile.v -set_global_assignment -name VERILOG_FILE ../verilog/syncram.v set_global_assignment -name VERILOG_FILE ../verilog/vga.v set_global_assignment -name VERILOG_FILE ../verilog/videoram.v set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/de0/de0board.v b/de0/de0board.v @@ -22,7 +22,7 @@ wire [15:0] status; reg [31:0] count; assign LEDG = 10'b1111111111; -assign HEX0_DP = 1'b1; +assign HEX0_DP = ~reset; assign HEX1_DP = 1'b1; assign HEX2_DP = 1'b1; assign HEX3_DP = 1'b1; @@ -32,7 +32,7 @@ hex2seven hex1(.in(status[7:4]),.out(HEX1_D)); hex2seven hex2(.in(status[11:8]),.out(HEX2_D)); hex2seven hex3(.in(status[15:12]),.out(HEX3_D)); -wire clk; +wire clk, reset; assign clk = CLOCK_50; reg clk25; @@ -49,6 +49,9 @@ wire [10:0] vram_addr; wire [7:0] vram_data; wire [7:0] line; +wire [31:0] jtag_addr, jtag_data; +wire jtag_we; + vga vga( .clk(clk25), .reset(1'b0), @@ -89,22 +92,21 @@ videoram #(8,11) vram( .waddr(d_addr[13:2]), ); -rom rom( - .addr(romaddr[9:2]), - .data(romdata) - ); - -syncram #(32,8) ram( +dualsyncram #(32,12) memory( .clk(clk), - .addr(d_addr[9:2]), - .rdata(d_data_r), - .wdata(d_data_w), - .we(d_we && (d_addr[31:10] == 21'b0)) + .a_addr(jtag_we ? jtag_addr[13:2] : romaddr[13:2]), + .a_rdata(romdata), + .a_wdata(jtag_data), + .a_we(jtag_we), + .b_addr(d_addr[13:2]), + .b_rdata(d_data_r), + .b_wdata(d_data_w), + .b_we(d_we && (d_addr[31:14] == 20'd0)) ); cpu32 cpu( .clk(clk), - .reset(1'b0), + .reset(reset), .i_addr(romaddr), .i_data(romdata), .d_data_r(d_data_r), @@ -113,6 +115,14 @@ cpu32 cpu( .d_data_we(d_we) ); +jtagloader loader( + .clk(clk), + .addr(jtag_addr), + .data(jtag_data), + .we(jtag_we), + .reset(reset) + ); + endmodule module hex2seven( @@ -140,13 +150,3 @@ always @(*) case (in) endcase endmodule - -module rom( - input [7:0] addr, - output [31:0] data - ); -reg [31:0] rom[0:2**7]; -initial $readmemh("fw.txt", rom); -assign data = rom[addr]; -endmodule - diff --git a/de0/jtag.v b/de0/jtag.v @@ -0,0 +1,181 @@ +// megafunction wizard: %Virtual JTAG% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: sld_virtual_jtag + +// ============================================================ +// File Name: jtag.v +// Megafunction Name(s): +// sld_virtual_jtag +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 11.1 Build 173 11/01/2011 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2011 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module jtag ( + ir_out, + tdo, + ir_in, + tck, + tdi, + virtual_state_cdr, + virtual_state_cir, + virtual_state_e1dr, + virtual_state_e2dr, + virtual_state_pdr, + virtual_state_sdr, + virtual_state_udr, + virtual_state_uir); + + input [3:0] ir_out; + input tdo; + output [3:0] ir_in; + output tck; + output tdi; + output virtual_state_cdr; + output virtual_state_cir; + output virtual_state_e1dr; + output virtual_state_e2dr; + output virtual_state_pdr; + output virtual_state_sdr; + output virtual_state_udr; + output virtual_state_uir; + + wire sub_wire0; + wire sub_wire1; + wire [3:0] sub_wire2; + wire sub_wire3; + wire sub_wire4; + wire sub_wire5; + wire sub_wire6; + wire sub_wire7; + wire sub_wire8; + wire sub_wire9; + wire sub_wire10; + wire virtual_state_cir = sub_wire0; + wire virtual_state_pdr = sub_wire1; + wire [3:0] ir_in = sub_wire2[3:0]; + wire tdi = sub_wire3; + wire virtual_state_udr = sub_wire4; + wire tck = sub_wire5; + wire virtual_state_e1dr = sub_wire6; + wire virtual_state_uir = sub_wire7; + wire virtual_state_cdr = sub_wire8; + wire virtual_state_e2dr = sub_wire9; + wire virtual_state_sdr = sub_wire10; + + sld_virtual_jtag sld_virtual_jtag_component ( + .ir_out (ir_out), + .tdo (tdo), + .virtual_state_cir (sub_wire0), + .virtual_state_pdr (sub_wire1), + .ir_in (sub_wire2), + .tdi (sub_wire3), + .virtual_state_udr (sub_wire4), + .tck (sub_wire5), + .virtual_state_e1dr (sub_wire6), + .virtual_state_uir (sub_wire7), + .virtual_state_cdr (sub_wire8), + .virtual_state_e2dr (sub_wire9), + .virtual_state_sdr (sub_wire10) + // synopsys translate_off + , + .jtag_state_cdr (), + .jtag_state_cir (), + .jtag_state_e1dr (), + .jtag_state_e1ir (), + .jtag_state_e2dr (), + .jtag_state_e2ir (), + .jtag_state_pdr (), + .jtag_state_pir (), + .jtag_state_rti (), + .jtag_state_sdr (), + .jtag_state_sdrs (), + .jtag_state_sir (), + .jtag_state_sirs (), + .jtag_state_tlr (), + .jtag_state_udr (), + .jtag_state_uir (), + .tms () + // synopsys translate_on + ); + defparam + sld_virtual_jtag_component.sld_auto_instance_index = "NO", + sld_virtual_jtag_component.sld_instance_index = 0, + sld_virtual_jtag_component.sld_ir_width = 4, + sld_virtual_jtag_component.sld_sim_action = "", + sld_virtual_jtag_component.sld_sim_n_scan = 0, + sld_virtual_jtag_component.sld_sim_total_length = 0; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: show_jtag_state STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: SLD_AUTO_INSTANCE_INDEX STRING "NO" +// Retrieval info: CONSTANT: SLD_INSTANCE_INDEX NUMERIC "0" +// Retrieval info: CONSTANT: SLD_IR_WIDTH NUMERIC "4" +// Retrieval info: CONSTANT: SLD_SIM_ACTION STRING "" +// Retrieval info: CONSTANT: SLD_SIM_N_SCAN NUMERIC "0" +// Retrieval info: CONSTANT: SLD_SIM_TOTAL_LENGTH NUMERIC "0" +// Retrieval info: USED_PORT: ir_in 0 0 4 0 OUTPUT NODEFVAL "ir_in[3..0]" +// Retrieval info: USED_PORT: ir_out 0 0 4 0 INPUT NODEFVAL "ir_out[3..0]" +// Retrieval info: USED_PORT: tck 0 0 0 0 OUTPUT NODEFVAL "tck" +// Retrieval info: USED_PORT: tdi 0 0 0 0 OUTPUT NODEFVAL "tdi" +// Retrieval info: USED_PORT: tdo 0 0 0 0 INPUT NODEFVAL "tdo" +// Retrieval info: USED_PORT: virtual_state_cdr 0 0 0 0 OUTPUT NODEFVAL "virtual_state_cdr" +// Retrieval info: USED_PORT: virtual_state_cir 0 0 0 0 OUTPUT NODEFVAL "virtual_state_cir" +// Retrieval info: USED_PORT: virtual_state_e1dr 0 0 0 0 OUTPUT NODEFVAL "virtual_state_e1dr" +// Retrieval info: USED_PORT: virtual_state_e2dr 0 0 0 0 OUTPUT NODEFVAL "virtual_state_e2dr" +// Retrieval info: USED_PORT: virtual_state_pdr 0 0 0 0 OUTPUT NODEFVAL "virtual_state_pdr" +// Retrieval info: USED_PORT: virtual_state_sdr 0 0 0 0 OUTPUT NODEFVAL "virtual_state_sdr" +// Retrieval info: USED_PORT: virtual_state_udr 0 0 0 0 OUTPUT NODEFVAL "virtual_state_udr" +// Retrieval info: USED_PORT: virtual_state_uir 0 0 0 0 OUTPUT NODEFVAL "virtual_state_uir" +// Retrieval info: CONNECT: @ir_out 0 0 4 0 ir_out 0 0 4 0 +// Retrieval info: CONNECT: @tdo 0 0 0 0 tdo 0 0 0 0 +// Retrieval info: CONNECT: ir_in 0 0 4 0 @ir_in 0 0 4 0 +// Retrieval info: CONNECT: tck 0 0 0 0 @tck 0 0 0 0 +// Retrieval info: CONNECT: tdi 0 0 0 0 @tdi 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_cdr 0 0 0 0 @virtual_state_cdr 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_cir 0 0 0 0 @virtual_state_cir 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_e1dr 0 0 0 0 @virtual_state_e1dr 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_e2dr 0 0 0 0 @virtual_state_e2dr 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_pdr 0 0 0 0 @virtual_state_pdr 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_sdr 0 0 0 0 @virtual_state_sdr 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_udr 0 0 0 0 @virtual_state_udr 0 0 0 0 +// Retrieval info: CONNECT: virtual_state_uir 0 0 0 0 @virtual_state_uir 0 0 0 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL jtag.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL jtag.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL jtag.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL jtag.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL jtag_inst.v FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL jtag_bb.v FALSE +// Retrieval info: LIB_FILE: altera_mf diff --git a/de0/jtagloader.v b/de0/jtagloader.v @@ -0,0 +1,73 @@ +// Copyright 2012, Brian Swetland + +`timescale 1ns/1ns + +module jtagloader( + input clk, + output we, + output reg [31:0] addr, + output [31:0] data, + output reg reset + ); + +parameter IR_CTRL = 4'd0; +parameter IR_ADDR = 4'd1; +parameter IR_DATA = 4'd2; + +initial reset = 0; + +wire update; +wire [3:0] iir; +wire tck, tdi, sdr, udr, uir; +reg [31:0] dr; +reg [3:0] ir; + +jtag jtag0( + .tdi(tdi), + .tdo(dr[0]), + .tck(tck), + .ir_in(iir), + .virtual_state_sdr(sdr), + .virtual_state_udr(udr), + .virtual_state_uir(uir) + ); + +always @(posedge tck) begin + if (uir) ir <= iir; + if (sdr) dr <= { tdi, dr[31:1] }; + end + +sync sync0( + .in(udr), + .clk_in(tck), + .out(update), + .clk_out(clk) + ); + +assign data = dr; +assign we = update & (ir == IR_DATA); + +always @(posedge clk) + if (update) case (iir) + IR_CTRL: reset <= dr[0]; + IR_ADDR: addr <= dr; + IR_DATA: addr <= addr + 32'd4; + endcase + +endmodule + +module sync( + input clk_in, + input clk_out, + input in, + output out + ); +reg toggle; +reg [2:0] sync; +always @(posedge clk_in) + if (in) toggle <= ~toggle; +always @(posedge clk_out) + sync <= { sync[1:0], toggle }; +assign out = (sync[2] ^ sync[1]); +endmodule +