From d0c4a3d80031f0d646ad0031e9d3a874851e4656 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 21 Mar 2021 11:43:44 +0000 Subject: [PATCH] - added git-svn-id: http://moon:8086/svn/vhdl/trunk@1425 cc03376c-175c-47c8-b038-4cd826a8556b --- projects/popcorn/src/Pc_spec.PDF | Bin 0 -> 33681 bytes projects/popcorn/src/inc.h | 25 + projects/popcorn/src/pc.v | 335 ++++++++++++ projects/popcorn/src/popcorn.v | 310 +++++++++++ projects/popcorn/src/sequencer.v | 521 +++++++++++++++++++ projects/popcorn/syn/ise/project/pc.lso | 1 + projects/popcorn/syn/ise/project/pc.prj | 3 + projects/popcorn/syn/ise/project/pc_vhdl.prj | 0 projects/popcorn/syn/ise/project/popcorn.ise | Bin 0 -> 114723 bytes 9 files changed, 1195 insertions(+) create mode 100644 projects/popcorn/src/Pc_spec.PDF create mode 100644 projects/popcorn/src/inc.h create mode 100644 projects/popcorn/src/pc.v create mode 100644 projects/popcorn/src/popcorn.v create mode 100644 projects/popcorn/src/sequencer.v create mode 100644 projects/popcorn/syn/ise/project/pc.lso create mode 100644 projects/popcorn/syn/ise/project/pc.prj create mode 100644 projects/popcorn/syn/ise/project/pc_vhdl.prj create mode 100644 projects/popcorn/syn/ise/project/popcorn.ise diff --git a/projects/popcorn/src/Pc_spec.PDF b/projects/popcorn/src/Pc_spec.PDF new file mode 100644 index 0000000000000000000000000000000000000000..bb9ab9dbc3e72785a6f30fd001699ea101fc4f95 GIT binary patch literal 33681 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 C(iN5f literal 0 HcmV?d00001 diff --git a/projects/popcorn/src/inc.h b/projects/popcorn/src/inc.h new file mode 100644 index 0000000..db997db --- /dev/null +++ b/projects/popcorn/src/inc.h @@ -0,0 +1,25 @@ + +// +// CLOCK DIVIDER +// +// UNcomment the below to use a +// clock divider. This will allow a much +// faster external clock to be used and still +// slow down the internal core frequency. +// USE the paramter N in PC.V to adjust the +// frequency. Minimum N is 3. +// COMMNET the below to use the external clock +// directly as is. Note that the core will +// always run at 1/4 the external clock. +// +//`define use_clock_divider + + +// +// DEBUG SIGNALS +// +// UNcomment the below to activate the +// test bus for observability during debug +// +// `define show_debug_pins + diff --git a/projects/popcorn/src/pc.v b/projects/popcorn/src/pc.v new file mode 100644 index 0000000..d7dc25d --- /dev/null +++ b/projects/popcorn/src/pc.v @@ -0,0 +1,335 @@ +/* PC.V +** +** This core adheres to GNU Public Licence +** Jeung Joon Lee *** www.cmosexod.com +** joon.lee@quantum.com +** +** JJL 12/12/98 +** updated 3/16/2000 +** +** Highest module for the 8 bit general purpose microprocessor +** Two submodules are declerared here, popcorn.v and sequencer.v +** The role and functions of these modules are as following: +** PC.V wrapper, and clock generator. Provides to the submodules +** sys_clk and phase_1_clk +** POPCORN.V The 8 bit datapath. Contains the ALU, register file, +** the program counter, stack pointer and all of the muxes. +** SEQUENCER.V The sequencer state machine. BAsed on the fetched opcode, +** generates all of the sequence of control signals to +** fetch more operands or finish executing the opcode. +** +*/ + +`include "inc.h" + +module pc( sys_clk, + sys_rst, + addx_bus, + data_bus, + code_cs_l, + code_rd_l, + code_wr_l, + sram_cs_l, + slow_clk, + port + +`ifdef show_debug_pins + , + w_opl, + w_pc, + w_oplo, + state, + w_acc, + w_ax, + w_bx, + w_p, + w_ophi, + w_flag, + phase_1_clk, + slow_clk4, + reg_flag, + tst_bus, + reg_acc, + reg_ax, + reg_bx, + reg_p, + reg_opl +`endif + +); + + +parameter N=6; + + +input sys_clk; +input sys_rst; +inout [7:0] data_bus; +inout [7:0] port; +//input [1:0] tst_bus_sel; +output [11:0] addx_bus; +//output [7:0] tst_bus; +output code_cs_l, code_rd_l, code_wr_l, sram_cs_l; +output slow_clk; + +`ifdef show_debug_pins +// DEBUG SIGNALS +output w_opl; +output w_pc; +output w_oplo; +output [3:0] state; +output w_acc; +output w_ax; +output w_bx; +output w_p; +output w_ophi; +output w_flag; +output phase_1_clk; +output slow_clk4; +output [2:0] reg_flag; +output tst_bus; +output [7:0] reg_acc; +output [7:0] reg_ax; +output [7:0] reg_bx; +output [7:0] reg_p; +output [7:0] reg_opl; +`endif + +wire w_acc,w_ax,w_bx,w_p,w_flag; +wire pc_mux,w_pc,w_oplo,w_ophi,w_opl; +wire slow_clk4; +wire [2:0] bbus_mux; +wire [3:0] alu_func; +wire [2:0] reg_flag; +wire [7:0] port; +reg [1:0] state_slow_clk4; +reg phase_1_clk; +wire xx,slow_clk; +wire [5:0] state; +wire [7:0] b_bus,c_bus; +wire [11:0] d_bus; +wire [7:0] tst_bus; +wire sp_mux, w_sp; +wire [1:0] addx_mux; +wire data_bus_wr; +wire sram_cs_l, code_wr_l; +wire flag_mux; +wire [7:0] reg_acc; +wire [7:0] reg_ax; +wire [7:0] reg_bx; +wire [7:0] reg_p; +wire [7:0] reg_opl; +//wire [7:0] port_in; +//wire port_bus_ena; + +// define test bus +/* +always @(tst_bus_sel or reg_opl or c_bus or b_bus or d_bus) + case (tst_bus_sel) + 2'b00: tst_bus <= reg_opl; + //2'b01: tst_bus <= b_bus; + default: tst_bus <= b_bus; + //2'b10: tst_bus <= c_bus; + //default: tst_bus <= c_bus; + //2'b11: tst_bus <= d_bus; + endcase +*/ +//assign tst_bus=tst_bus_sel[0] ? b_bus : c_bus; +assign tst_bus=c_bus; + + +`ifdef use_clock_divider +// +// CLOCK DIVIDER +// +// +// N=5 sets for 1Mhz operation +// N=7 sets for 250Khz op. good for slow speed debug +reg [N-1:0] clk; +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) clk <=0; + else clk <= clk + 1; +assign slow_clk = clk[N-1]; +assign slow_clk4 = ~clk[N-3]; +`else +reg [1:0] clk; +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) clk <= 2'b00; + else clk <= clk + 1; +assign slow_clk = clk[1]; +assign slow_clk4 = sys_clk; +`endif + +/* define phase_1 clock +** | | +** | ___ ___ ___ ___ | ___ ___ +** slow_clk*4 |/ \___/ \___/ \___/ \___|/ \___/ \___ +** | _______ _______ | _______ +** slow_clk*2 |/ \_______/ \_______|/ \_______ +** | _______________ | _______________ +** slow_clk |/ \_______________|/ +** |________ _______|_ +** phase_1 | \_______________/ | +** | | +*/ +always @(posedge slow_clk4 or negedge sys_rst) + if (~sys_rst) begin + state_slow_clk4<=2'b00; + phase_1_clk<=1'b1; + end + else case (state_slow_clk4) + 2'b00: begin state_slow_clk4<=2'b01; phase_1_clk<=1'b1; end + 2'b01: begin state_slow_clk4<=2'b11; phase_1_clk<=1'b1; end + 2'b11: begin state_slow_clk4<=2'b10; phase_1_clk<=1'b0; end + 2'b10: begin state_slow_clk4<=2'b00; phase_1_clk<=1'b0; end + endcase + +// instantiate the datapath +popcorn POPCORN( .sys_clk(slow_clk), + .sys_rst(sys_rst), + .w_acc(w_acc), + .w_ax(w_ax), + .w_bx(w_bx), + .w_p(w_p), + .w_flag(w_flag), + .bbus_mux(bbus_mux), + .alu_func(alu_func), + .pc_mux(pc_mux), + .sp_mux(sp_mux), + .flag_mux(flag_mux), + .addx_mux(addx_mux), + .w_pc(w_pc), + .w_sp(w_sp), + .w_oplo(w_oplo), + .w_ophi(w_ophi), + .w_opl(w_opl), + .data_bus(data_bus), + .port(port), +// .port_in(port_in), + .addx_bus(addx_bus), + .reg_opl(reg_opl), + .reg_flag(reg_flag), + .b_bus(b_bus), + .c_bus(c_bus), + .d_bus(d_bus), + .data_bus_wr(data_bus_wr), + .code_wr_l(code_wr_l), + .reg_acc(reg_acc), + .reg_ax(reg_ax), + .reg_bx(reg_bx), + .reg_p(reg_p) + ); + +// instantiate the sequencer +sequencer SEQ ( .sys_clk(slow_clk), + .phase_1_clk(phase_1_clk), + .sys_rst(sys_rst), + .w_acc(w_acc), + .w_ax(w_ax), + .w_bx(w_bx), + .w_p(w_p), + .w_flag(w_flag), + .bbus_mux(bbus_mux), + .alu_func(alu_func), + .pc_mux(pc_mux), + .addx_mux(addx_mux), + .sp_mux(sp_mux), + .flag_mux(flag_mux), + .w_pc(w_pc), + .w_sp(w_sp), + .w_oplo(w_oplo), + .w_ophi(w_ophi), + .w_opl(w_opl), + .reg_opl(reg_opl), + .code_cs_l(code_cs_l), + .code_rd_l(code_rd_l), + .code_wr_l(code_wr_l), + .sram_cs_l(sram_cs_l), + .reg_flag(reg_flag), + .data_bus_wr(data_bus_wr), + .next_state(state) + ); + + + +endmodule + + + +/* +** Note on pin assignment: +** o use pin file : "finalpin.pin" +** o use global clock Y0 for 66Mhz source +** o use global reset for reset. +** o use N=6. This requires 64Mhz to give internal clock speed of 1Mhz. +** +** 2/12/99 +** o Fixed the LDM ACC,xx bug. ALU was not being set for c_bus = b_bus. +** Call this 'popcorn - final' +** +** 2/11/99 +** o Uncovered and fixed 2 bugs relating the IO PORT: +** 1.The signals 'reg_port_gate' which controls the gate of the port +** output buffer has the wrong polarity. This was causing the port +** to drive the port IO pin only when it was being read. +** 2.The state of the bbus_mux[2:0] during LDACC/STADD was set to unknown. +** This was causing the reg_port_gate to be deasserted during LDACC PORT +** or STACC PORT instructions for 1 cycle, causing glitches in the IO port +** pin +** +** 1/8/99 +** o Succesfully ran a timer program which toggles all bits of the +** port register at 2mS interval (period=4mS). The program uses +** an instrunctions timed 2mS delay subroutine. +** +** 1/7/99 +** o Somewhat final version. The test bus (TST[7:0]) has been dropped +** and PORT[7:0] been used. All instructions works at least at 2 Mhz. +** Call this 'popcorn -v5' +** +** 1/5/99 +** o Droppped the automatic pushing and popping of the flags when CALL/RET +** are executed, (could not fit). So reduced the size of REG_OPHI down +** to 4 from 8 bits. Instead the pushing of the flag is now done with +** LDACC flag +** LDM flag, #addx +** PUSH flag +** POP flag +** instructions. The flag register still is muxed from ALU and c_bus. +** Thanks Lord. +** All that remains now is implementation of interrupt support. +** +** 1/3/99 +** o Removed DX and CX register from the register file, to free-up +** the b_mux. The freed b_bus mux inputs are used by the PC (hi and low). +** This allows PC to be pushed into the stack as well as CALL and RET +** and push flag instructions +** +** 1/1/99 +** o Removed 7 level-deep hardware stack - it was obvious that this is not +** a very robust way of having a stack. It limits the CALL/RET depth. +** However my initial rational for not implementing the SP was that I +** did not wanted to have a SRAM for stack. SRAM automatically implies +** an extenal IC (since on FPGA you could not provide the required +** amount of space). +** o Added another addressing mode: direct mode, and 2 instructions: LDM and +** STM (load mem, store mem). This brings the modes +** to: register direct, immediate and direct. +** Why not, I had decided to have exnal SRAM, so let's make use of it +** +** 12/28/98 +** o Added 7-level deep hardware LIFO to implement pushacc/popacc +** instructions +** o Implemented pushacc and popacc instructions in the sequencer.v +** +** 12/27/98 +** o Fixed a number of bugs, including CMPACC (reg direct) and ALU ops (reg +** direct) being decoded as same. +** +** 12/26/98 +** o Shortenend the PC to 12 bits from 16, to reduce design size. +** o REduced the datapath width to 8 from 16, to reduce design size. +** +** Lots of previous history not accounted for. Started to work on POPCORN +** about 12/12/98 +*/ diff --git a/projects/popcorn/src/popcorn.v b/projects/popcorn/src/popcorn.v new file mode 100644 index 0000000..7cf9bac --- /dev/null +++ b/projects/popcorn/src/popcorn.v @@ -0,0 +1,310 @@ +/* +** POPCORN +** +** This core adheres to GNU Public Licence +** Jeung Joon Lee *** www.cmosexod.com +** joon.lee@quantum.com +** +** JJL 12/12/98 +** updated 3/16/2000 +** +** This is an 8 bit general purpose microprocessor. The architecture +** is that of a CISC type with accumulator-based operations. +** The internal data-path is 8 bits, and the external bus is 8. +** No support for muliply or other complex arithmetic operations are +** supported (see ALU below). +** +** Two addressing modes: immediate and register-direct.f +** 23 instructions are supported +** +** Instrutions lengths can be 1 or 2 or 3 bytes, which correcponds to +** executions times of 2, 3 and 4 cycles. + +** to change the address width: from 12 bits to wider: +** change: +** AW to desired value (all 3 files) +** REG_OPHI width definition +** +*/ + +module popcorn( sys_clk, // system clock 1Mhz + sys_rst, // system reset active low + w_acc, // accumulator write signal, active low + w_ax, // AX regster write signal, active low + w_bx, // BX " " " + w_p, // PORT " " " + w_flag, // FLAG " " " + bbus_mux, // bbus mux selector + alu_func, + pc_mux, + addx_mux, + sp_mux, + flag_mux, + w_pc, + w_sp, + w_oplo, + w_ophi, + w_opl, + data_bus, + addx_bus, + port, + reg_opl, + reg_flag, + + c_bus, + b_bus, + d_bus, + data_bus_wr, + code_wr_l, + reg_acc, + reg_ax, + reg_bx, + reg_p + ); + +input sys_clk,sys_rst,w_acc,w_ax,w_bx,w_p,w_flag; +input pc_mux,w_pc,w_oplo,w_ophi,w_opl; +input [3:0] alu_func; +input [2:0] bbus_mux; +input data_bus_wr; +input code_wr_l; +output [7:0] b_bus,c_bus; +output [11:0] d_bus; +output [7:0] reg_opl; +output [2:0] reg_flag; +inout [7:0] data_bus; +inout [7:0] port; +output [11:0] addx_bus; +input sp_mux,w_sp; +input [1:0] addx_mux; +input flag_mux; +output [7:0] reg_acc; +output [7:0] reg_ax; +output [7:0] reg_bx; +output [7:0] reg_p; + +reg [7:0] reg_ax,reg_bx,reg_acc; +reg [11:0] reg_pc, reg_sp; +reg [7:0] reg_opl,reg_oplo,reg_p; +reg [3:0] reg_ophi; +reg carry,pos,zero,cout; +reg [7:0] b_bus,c_bus; +reg [11:0] addx_bus; +//reg [7:0] reg_port_dir; +wire [2:0] reg_flag; +wire [11:0] d_bus; +wire [7:0] data; +wire [7:0] input_port; +wire cs_reg_port_dir; +wire reg_port_gate; + +/* +** DATA BUS :: bi-directional +** Output c_bus onto the pad at data_bus_wr == 0 +*/ +assign data = data_bus; // input +assign data_bus = data_bus_wr ? 8'hzz : c_bus; //output + +/* +** REGISTER FILE :: Synchronous to sys_clk +** There are total of 6 registers +** ACC accumulator 8 bit +** AX general purpose register 8 bit +** BX general purpose register 8 bit +** P I/O port register 4 bit +*/ +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) + reg_p <= 8'h00; + else if(~w_p) + reg_p <= c_bus; + +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) + reg_ax <= 8'h00; + else if(~w_ax) + reg_ax <= c_bus; + +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) + reg_bx <= 8'h00; + else if(~w_bx) + reg_bx <= c_bus; + +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) + reg_acc <= 8'h00; + else if(~w_acc) + reg_acc <= c_bus; + + +/* OPL :: Synchronous to W_OPL +** Opcode_Latch register 8 bit +** Latched by rising edge of W_OPL +*/ +always @(posedge w_opl or negedge sys_rst) + if(~sys_rst) + reg_opl <= 8'h00; + else + reg_opl <= data; + +/* +** PC:: Synchronous to sys_clk +** Program Counter 8 bit +** +** Input: sys_clk : on rising edge, PC is update +** w_pc : 1=allow pc to change, 0=pc has its previous +** value +** pc_mux : 1=on the rising edge of sys_clk pc=pc+1 +** 0=on the rising edge of sys_clk pc=d_bus +*/ +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) + reg_pc <= 12'h000; // the reset value must be all 0's + else if (~w_pc & pc_mux) + reg_pc <= reg_pc + 1; + else if ( ~w_pc & ~pc_mux ) + reg_pc <= d_bus; + else + reg_pc <= reg_pc; + +/* +** SP :: Synchrnous to sys_clk +** Stack Pointer +*/ +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) + reg_sp <= 12'hFFF; // default reset value of sp is 0xFFF + else if (~w_sp & sp_mux) + reg_sp <= reg_sp - 1; + else if ( ~w_sp & ~sp_mux) + reg_sp <= reg_sp + 1; + +/* +** ADDX mux +*/ +always @(addx_mux or reg_pc or reg_sp or d_bus) + case (addx_mux) + 2'b00: addx_bus <= d_bus; + 2'b01: addx_bus <= reg_pc; + default: addx_bus <= reg_sp; + endcase + +/* +** Arithmetic Logic Unit +** This ALU provides 9 funtions: +** 0 c = a+b +** 1 c = a-b (a+~b+1) +** 2 c = a&b +** 3 c = a|b +** 4 c = a^b +** 5 c = ~a +** 6 c = a >> 1 +** 7 c = a << 1 +** 8 c = b +** else c = a +*/ +always @(reg_acc or b_bus or alu_func) begin + case (alu_func) + 4'b0000: {cout,c_bus} <= reg_acc+b_bus; + 4'b0001: {cout,c_bus} <= reg_acc-b_bus; + 4'b0010: begin c_bus <= reg_acc&b_bus; cout<=1'b0; end + 4'b0011: begin c_bus <= reg_acc|b_bus; cout<=1'b0; end + 4'b0100: begin c_bus <= reg_acc^b_bus; cout<=1'b0; end + 4'b0101: begin c_bus <= ~reg_acc; cout<=1'b0; end + 4'b0110: begin c_bus <= {1'b0,reg_acc[7:1]}; cout<=reg_acc[0]; end + 4'b0111: begin c_bus <= {reg_acc[6:0],1'b0}; cout<=reg_acc[7]; end + 4'b1000: begin c_bus <= b_bus; cout<=1'b0; end + default: begin c_bus <= reg_acc; cout<=1'b0; end + endcase +end + +// Define ALU flag register +always @(posedge sys_clk or negedge sys_rst) + if (~sys_rst) begin + pos <= 1'b0; + zero <= 1'b0; + carry <= 1'b0; + end + else if ((~w_flag) && (flag_mux==1'b1)) begin + zero <= ~( | c_bus ); // zero=1 iff all bits==0 + pos <= ~(c_bus[7]); // pos=1 iff msb=0 + carry <= cout; // carry , see alu above + end + else if ((~w_flag) && (flag_mux==1'b0)) begin + zero <= c_bus[5]; // zero=1 iff all bits==0 + pos <= c_bus[6]; // pos=1 iff msb=0 + carry <= c_bus[7]; // carry , see alu above + end + +assign reg_flag = {carry,pos,zero}; + +/* +** Define B MUX +*/ +always @(reg_ax or reg_bx or reg_flag or reg_pc or d_bus or reg_p or bbus_mux or input_port) + case (bbus_mux) + 3'b001: b_bus <= reg_ax; + 3'b010: b_bus <= reg_bx; + 3'b011: b_bus <= reg_pc[7:0]; + 3'b100: b_bus <= {reg_flag,1'b0,reg_pc[11:8]}; + 3'b101: b_bus <= input_port; + 3'b110: b_bus <= d_bus[7:0]; + default: b_bus <=d_bus; + endcase + + +/* +** Define d_bus +*/ +assign d_bus={reg_ophi[3:0],reg_oplo}; +always @(posedge w_oplo or negedge sys_rst) + if (~sys_rst) + reg_oplo <= 8'h00; + else + reg_oplo <= data; +always @(posedge w_ophi or negedge sys_rst) + if (~sys_rst) + reg_ophi <= 4'b0000; + else + reg_ophi <= data[3:0]; + + +/* +** Define the PORT register :: Synchronous to sys_clk +*/ +/* +assign port[0] = reg_port_dir[0] ? 1'bz : reg_p[0]; +assign port[1] = reg_port_dir[1] ? 1'bz : reg_p[1]; +assign port[2] = reg_port_dir[2] ? 1'bz : reg_p[2]; +assign port[3] = reg_port_dir[3] ? 1'bz : reg_p[3]; +assign port[4] = reg_port_dir[4] ? 1'bz : reg_p[4]; +assign port[5] = reg_port_dir[5] ? 1'bz : reg_p[5]; +assign port[6] = reg_port_dir[6] ? 1'bz : reg_p[6]; +assign port[7] = reg_port_dir[7] ? 1'bz : reg_p[7]; +*/ + +assign input_port = port; +//assign port = reg_port_gate ? 8'hzz : reg_p; + +bufif1(port[0], reg_p[0], reg_port_gate); +bufif1(port[1], reg_p[1], reg_port_gate); +bufif1(port[2], reg_p[2], reg_port_gate); +bufif1(port[3], reg_p[3], reg_port_gate); +bufif1(port[4], reg_p[4], reg_port_gate); +bufif1(port[5], reg_p[5], reg_port_gate); +bufif1(port[6], reg_p[6], reg_port_gate); +bufif1(port[7], reg_p[7], reg_port_gate); + +assign reg_port_gate = (bbus_mux[2:0]==3'b101); + +/* +assign cs_reg_port_dir = ( ~(addx_bus==12'hD00) | (~code_wr_l) ); +always @(posedge cs_reg_port_dir or negedge sys_rst) + if (~sys_rst) + reg_port_dir <= 8'h00; + else + reg_port_dir <= c_bus; +*/ +endmodule + diff --git a/projects/popcorn/src/sequencer.v b/projects/popcorn/src/sequencer.v new file mode 100644 index 0000000..1157b67 --- /dev/null +++ b/projects/popcorn/src/sequencer.v @@ -0,0 +1,521 @@ +/* +** SEQUENCER +** +** This core adheres to GNU Public Licence +** Jeung Joon Lee *** www.cmosexod.com +** joon.lee@quantum.com +** +** JJL 12/12/98 +** updated 3/16/2000 +** +** +** This is the sequencer for the POPCORN 8bit microprocessor. +** Controls all of the control signals. +** +** This sequencer controls these following signals of the datapath "popcorn" +** +** +** +*/ +module sequencer (sys_clk, + phase_1_clk, + sys_rst, + w_acc, + w_ax, + w_bx, + w_p, + w_flag, + bbus_mux, + alu_func, + pc_mux, + addx_mux, + sp_mux, + flag_mux, + w_sp, + w_pc, + w_oplo, + w_ophi, + w_opl, + reg_opl, + code_cs_l, + code_rd_l, + sram_cs_l, + code_wr_l, + reg_flag, + data_bus_wr, + next_state + ); + +input sys_clk,sys_rst,phase_1_clk; +input [7:0] reg_opl; +input [2:0] reg_flag; +output w_acc,w_ax,w_bx,w_p,w_flag,pc_mux,w_pc; +output w_opl,w_oplo,w_ophi,code_cs_l,code_rd_l; +output [3:0] alu_func; +output [2:0] bbus_mux; +output [3:0] next_state; +output [1:0] addx_mux; +output sp_mux, w_sp, sram_cs_l, code_wr_l, data_bus_wr; +output flag_mux; + +reg [5:0] next_state; +reg code_cs_l,code_rd_l_gate; +reg w_opl_gate,w_acc_gate,w_ax_gate,w_bx_gate; +reg w_p_gate,w_flag_gate,pc_mux; +reg w_oplo_gate,w_ophi_gate,w_pc_gate; +reg [3:0] alu_func; +reg [2:0] bbus_mux; +reg dummy; +reg [1:0] addx_mux; +reg w_sp_gate, sp_mux, sram_cs_l, code_wr_l_gate,data_bus_wr; +reg flag_mux; + +parameter state_s0 =6'b000001; +parameter state_s1 =6'b000010; +parameter state_s2 =6'b000100; +parameter state_s3 =6'b001000; +parameter state_s4 =6'b010000; +parameter state_s5 =6'b100000; + +assign w_acc = w_acc_gate; +assign w_ax = w_ax_gate; +assign w_bx = w_bx_gate; +assign w_p = w_p_gate; +assign w_flag= w_flag_gate; +assign w_pc = w_pc_gate; +assign w_sp = w_sp_gate; +assign w_oplo= w_oplo_gate | phase_1_clk; // asynchronous reg +assign w_ophi= w_ophi_gate | phase_1_clk; // asynchronous reg +assign w_opl = w_opl_gate | phase_1_clk; // asynchronous reg +assign code_rd_l = code_rd_l_gate | phase_1_clk; // code rom rd +assign code_wr_l = code_wr_l_gate | phase_1_clk; + +/* +** Behavioral description of the Sequencer State machine +** +** synchronous state machine, transitions on the rising edge of sys_clk +*/ +always @(posedge sys_clk or negedge sys_rst) begin + if (~sys_rst) begin // rst + code_cs_l <= 1'b1; + code_rd_l_gate <= 1'b1; + code_wr_l_gate <= 1'b1; + sram_cs_l <= 1'b1; + alu_func <= 4'b0000; + w_acc_gate <= 1'b1; + w_ax_gate <= 1'b1; + w_bx_gate <= 1'b1; + w_p_gate <= 1'b1; + w_flag_gate <= 1'b1; + w_opl_gate <= 1'b1; + w_oplo_gate <= 1'b1; + w_ophi_gate <= 1'b1; + bbus_mux <= 2'b00; + addx_mux <= 2'b01; + pc_mux <= 1'b1; + sp_mux <= 1'b1; + flag_mux <= 1'b1; + w_pc_gate <= 1'b1; + w_sp_gate <= 1'b1; + data_bus_wr <= 1'b1; +// port_bus_ena <= 1'b0; + next_state <= state_s0; + end + else case(next_state) + /* + ** FETCH OPCODE STATE. (at beginning of s1 opcode is latched into reg_opl) + */ + state_s0: begin // *****2 + code_cs_l <= 1'b0; // enable code cs + code_rd_l_gate <= 1'b0; // enable code rd + code_wr_l_gate <= 1'b1; + sram_cs_l <= 1'b1; + alu_func <= 4'bx; + w_acc_gate <= 1'b1; + w_ax_gate <= 1'b1; + w_bx_gate <= 1'b1; + w_p_gate <= 1'b1; + w_flag_gate <= 1'b1; + w_opl_gate <= 1'b0; // latch opl at s1 + w_oplo_gate <= 1'b1; + w_ophi_gate <= 1'b1; + bbus_mux <= 2'b00; + addx_mux <= 2'b01; + pc_mux <= 1'b1; + sp_mux <= 1'b1; + flag_mux <= 1'b1; + w_pc_gate <= 1'b1; + w_sp_gate <= 1'b1; + data_bus_wr <= 1'b1; + //port_bus_ena <= 1'b0; + next_state <= state_s1; + end + /* + ** REGISTER DIRECT INSTRUCTIONS 1 byte, 2 cycle instructions + ** these are: stacc, ldacc, and alu ops + */ + state_s1: begin // ******** 2 + + begin + code_cs_l <= 1'b1; // disable cs and rd from code ram + code_rd_l_gate <= 1'b1; + w_opl_gate <= 1'b1; // disable opcode latch gate + end + + // ALU opcode - register direct + if((reg_opl[7:6]==2'b00)&&(reg_opl[2:0]!=3'b111)) begin + alu_func <= reg_opl[6:3]; + w_acc_gate <= 1'b0; // latch acc with result on s0 + w_flag_gate <= 1'b0; // latch reg result on s0 + bbus_mux <= reg_opl[2:0]; + w_pc_gate <= 1'b0; // increment pc on s0 + next_state <= state_s0; + end + // CMPACC opcode - register direct + else if((reg_opl[7:3]==5'b01000)&&(reg_opl[2:0]!=3'b111)) begin + alu_func <= 4'b0001; // alu subtract + w_flag_gate <= 1'b0; // latch reg result on s0 + bbus_mux <= reg_opl[2:0]; + w_pc_gate <= 1'b0; // increment pc on s0 + next_state <= state_s0; + end + // LDACC - register direct + else if ((reg_opl[7:3]==5'b10001)&&(reg_opl[2:0]!=3'b111)) begin + alu_func <= 4'b1000; // alu=select b bus + w_acc_gate <= 1'b0; // latch acc on s0 + bbus_mux <= reg_opl[2:0]; + w_pc_gate <= 1'b0; // increment pc on s0 + next_state <= state_s0; + end + // STACC - register direct + else if ((reg_opl[7:3]==5'b10010)&&(reg_opl[2:0]!=3'b111)) begin + alu_func <= 4'b1001; // alu=select a bus + case (reg_opl[2:0]) // latch approp dest reg on s0 + 3'b001: w_ax_gate <= 1'b0; + 3'b010: w_bx_gate <= 1'b0; + 3'b100: begin + w_flag_gate <= 1'b0; + flag_mux <= 1'b0; + end + 3'b101: w_p_gate <= 1'b0; + default: dummy <= 1'b0; // do nothing + endcase + bbus_mux <= 3'b001; // anything but 3'b101 (port) + w_pc_gate <= 1'b0; // increment pc in s0 + next_state <= state_s0; + end + // PUSH , write out to [SP] and decrement SP + // push does this: [SP] <- reg, SP=SP-1 + else if(reg_opl[7:3]==5'b01110) begin + if (reg_opl[2:0]==3'b000) begin + alu_func <= 4'b1001; // select c_bus=acc + end else begin + alu_func <= 4'b1000; // select c_bus=b_bus + end + bbus_mux <= reg_opl[2:0]; + sp_mux <= 1'b1; // sp = sp -1 + w_sp_gate <= 1'b0; // allow sp to decrement + addx_mux <= 2'b10; // select sp as addx source + sram_cs_l <= 1'b0; // select sram + code_wr_l_gate <= 1'b0; // and write + data_bus_wr <= 1'b0; // drive data bus with c_bus + w_pc_gate <= 1'b0; // increment pc on s0 + next_state <= state_s0; + end + // POP, RET part I, increment SP + // pop does this: + // SP=SP+1 + // reg_ophi <- [SP] + // SP=SP+1 + // reg_oplo <- [SP] + else if (reg_opl[7:3]==5'b01111 | reg_opl[7:0]==8'b11011110) begin + alu_func <= 4'b1000; // c_bus = b_bus + bbus_mux <= 3'b110; // b_bus = d_bus + sp_mux <= 1'b0; // sp = sp + 1 + w_sp_gate <= 1'b0; // allow sp to increment + next_state <= state_s2; + end + + // Immediate mode, so need to go and fetch one or two operands. + // setup the PC so it increments to 1 and cs and rd gates + // are asserted + else begin + alu_func <= 4'b1000; + w_acc_gate <= 1'b1; + w_ax_gate <= 1'b1; + w_bx_gate <= 1'b1; + w_p_gate <= 1'b1; + w_oplo_gate <= 1'b1; + bbus_mux <= 3'b110; // show d_bus on c_bus + pc_mux <= 1'b1; + w_pc_gate <= 1'b0; // increment pc on s2 + next_state <= state_s2; + end + end + + /* + ** IMMEDIATE INSTRUCTIONS. 2 bytes, 3 cycle insruction + ** these are: ldi, alu ops. + */ + state_s2: begin + // LDI - load immediate 8 bit value to register + if ((reg_opl[7:6]==2'b10)&&(reg_opl[2:0]==3'b111)) begin + alu_func <= 4'b1000; + case (reg_opl[5:3]) // latch the dest reg on s0 + 3'b000: w_acc_gate <= 1'b0; + 3'b001: w_ax_gate <= 1'b0; + 3'b010: w_bx_gate <= 1'b0; + 3'b101: w_p_gate <= 1'b0; + default: dummy <= 1'b0; //do nothing + endcase + bbus_mux <= 3'b110; + w_pc_gate <= 1'b0; // increment pc on s0 + code_cs_l <= 1'b0; // allow -cs and -rd to code ram + code_rd_l_gate <= 1'b0; + w_oplo_gate <= 1'b0; // assert oplo gate + next_state <= state_s0; + end + // ALU op - immediate + else if ((reg_opl[7:6]==2'b00)&&(reg_opl[2:0]==3'b111)) begin + alu_func <= reg_opl[6:3]; // get alu oprerationg from instruction + w_acc_gate <= 1'b0; // latch acc on s0 + w_flag_gate <= 1'b0; // update flag on s0 + bbus_mux <= 3'b110; + w_pc_gate <= 1'b0; // increment pc on s0 + code_cs_l <= 1'b0; // allow -cs and -rd to code ram + code_rd_l_gate <= 1'b0; + w_oplo_gate <= 1'b0; // assert oplo gate + next_state <= state_s0; + end + // CMPACC op - immediate + else if ((reg_opl[7:3]==5'b01000)&&(reg_opl[2:0]==3'b111)) begin + alu_func <= 4'b001; // alu to subtract + w_flag_gate <= 1'b0; // update flag on s0 + bbus_mux <= 3'b110; // bbus select d_bus + w_pc_gate <= 1'b0; // increment pc on s0 + code_cs_l <= 1'b0; // allow -cs and -rd to code ram + code_rd_l_gate <= 1'b0; + w_oplo_gate <= 1'b0; // assert oplo gate + next_state <= state_s0; + end + // POP, part II, load data from [SP] + else if (reg_opl[7:3]==5'b01111) begin + code_cs_l <= 1'b1; // don't read from code ram + alu_func <= 4'b1000; // c_bus = b_bus + bbus_mux <= 3'b110; // b_bus = d_bus + w_sp_gate <= 1'b1; // disallow sp to change + addx_mux <= 2'b10; // select sp as addx source + sram_cs_l <= 1'b0; // select sram + code_rd_l_gate <= 1'b0; // and read + w_oplo_gate <= 1'b0; // and latch it into reg_oplo + case (reg_opl[2:0]) + 3'b000: w_acc_gate <= 1'b0; + 3'b001: w_ax_gate <= 1'b0; + 3'b010: w_bx_gate <= 1'b0; + 3'b100: begin + w_flag_gate <= 1'b0; + flag_mux <= 1'b0; + end + default: w_p_gate <= 1'b0; + endcase + w_pc_gate <= 1'b0; // increment pc on s0 + next_state <= state_s0; + end + // RET, part II, load hi byte of saved PC + else if (reg_opl[7:0]==8'b11011110) begin + code_cs_l <= 1'b1; // don't read from code ram + alu_func <= 4'b1000; // c_bus = b_bus + bbus_mux <= 3'b110; // b_bus = d_bus + sp_mux <= 1'b0; // increment SP + w_sp_gate <= 1'b0; // allow sp to change + addx_mux <= 2'b10; // select sp as addx source + sram_cs_l <= 1'b0; // select sram + code_rd_l_gate <= 1'b0; // and read + w_ophi_gate <= 1'b0; // and latch it into reg_ophi + code_rd_l_gate <= 1'b0; + w_oplo_gate <= 1'b0; // assert oplo gate + next_state <= state_s3; + end + // these are the 3 byte branching instructions. so go and fetch the high + // byte operand + else begin + code_cs_l <= 1'b0; // allow -cs and -rd to code ram + code_rd_l_gate <= 1'b0; + alu_func <= 4'b1000; + w_acc_gate <= 1'b1; + w_ax_gate <= 1'b1; + w_bx_gate <= 1'b1; + w_p_gate <= 1'b1; + bbus_mux <= 3'b110; + pc_mux <= 1'b1; + w_pc_gate <= 1'b0; // increment pc on s3 + w_oplo_gate <= 1'b0; // assert oplo gate + next_state <= state_s3; + end + end + + /* + ** BRANCHING INSTRUCTIONS, 3 bytes, 4 cycles + */ + state_s3: begin +// w_ophi_gate <= 1'b0; // latch-in high byte operand +// w_oplo_gate <= 1'b1; // deassert oplo gate + // Branching operations - immediate + if((reg_opl[7]==1'b1)&&(reg_opl[2:0]==3'b000)) begin + alu_func <= 4'b1000; // for debug, c_bus=b_bus + bbus_mux <= 3'b110; // for debug c_bus=d_bus + case(reg_opl[6:3]) + 4'b0011: if(reg_flag[0]==1'b1) // JE + pc_mux<=0; + else pc_mux<=1; + 4'b0100: if(reg_flag[0]==1'b0) // JNE + pc_mux<=0; + else pc_mux<=1; + 4'b0101: if(reg_flag[1]==1'b1) // JP + pc_mux<=0; + else pc_mux<=1; + 4'b0110: if(reg_flag[1]==1'b0) // JN + pc_mux<=0; + else pc_mux<=1; + 4'b0111: if(reg_flag[2]==1'b1) // JC + pc_mux<=0; + else pc_mux<=1; + 4'b1000: if(reg_flag[2]==1'b0) // JNC + pc_mux<=0; + else pc_mux<=1; + 4'b1001: pc_mux<=0; // JMP unconditional + default: pc_mux<=pc_mux; + endcase + w_pc_gate <= 1'b0; // increment pc on s0 + w_ophi_gate <= 1'b0; // latch-in high byte operand + w_oplo_gate <= 1'b1; // deassert oplo gate + next_state <= state_s0; + end + // RET, part III, load lo byte of saved PC + else if (reg_opl[7:0]==8'b11011110) begin + code_cs_l <= 1'b1; // don't read from code ram + alu_func <= 4'b1000; // c_bus = b_bus + bbus_mux <= 3'b100; // b_bus = reg_pc hi + sp_mux <= 1'b1; // increment SP + w_sp_gate <= 1'b1; // disallow sp to change + addx_mux <= 2'b10; // select sp as addx source + sram_cs_l <= 1'b0; // select sram + code_rd_l_gate <= 1'b0; // and read + w_ophi_gate <= 1'b1; + w_oplo_gate <= 1'b0; // and latch it into reg_oplo + pc_mux <= 1'b0; + w_pc_gate <= 1'b0; // PC = d_bus + w_flag_gate <= 1'b0; // restore flag + next_state <= state_s0; + end + // CALL, part I. Allow the PC to be incremented so, that + // the PC that is pushed onto the stack is pointing to + // the instruction after the call + // what CALL does: + // [SP] <- PC low byte + // SP=SP-1 + // [SP] <- PC high 4 bits + // SP=SP-1 + else if (reg_opl[7:0]==8'b11010110) begin + w_pc_gate <= 1'b0; + w_ophi_gate <= 1'b0; // latch-in high byte operand + w_oplo_gate <= 1'b1; // deassert oplo gate + next_state <= state_s4; + end + // Must be direct addresing instruction + else begin + next_state <= state_s4; + w_ophi_gate <= 1'b0; // latch-in high byte operand + w_oplo_gate <= 1'b1; // deassert oplo gate + w_pc_gate <= 1'b1; // deassert PC gate. + end + end + + /* + ** DIRECT INSTRUCTIONS, 3 byte, 5 cycles + */ + state_s4: begin + + begin + code_cs_l <= 1'b1; + w_ophi_gate <= 1'b1; // latch-in high byte operand + end + + // LMD and STM instructions + if ((reg_opl[7:4]==5'b0110)&&(reg_opl[2:0]!=3'b111)) begin + sram_cs_l <= 1'b0; // select the sram + addx_mux <= 2'b00; // select the sram address + w_pc_gate <= 1'b0; // increment pc on s0 + pc_mux <= 1'b1; + alu_func <= 4'b1000; // else c_bus = b_bus + bbus_mux <= 3'b110; // select d_bus by default + // if it is STM + if (reg_opl[3]==1'b1) begin + // while in STM, select c_bus=a_bus only if it's STM acc,xx + if (reg_opl[2:0]==3'b000) begin + alu_func <= 4'b1001; // if DDD=acc c_bus=acc + end + bbus_mux <= reg_opl[2:0]; // select the approp reg + code_wr_l_gate <= 1'b0; + data_bus_wr <= 1'b0; // drive data bus with c_bus + end + // if it is LDM + else begin + code_rd_l_gate <= 1'b0; + w_oplo_gate <= 1'b0; // latchin oplo with sram data on s4 + code_rd_l_gate <= 1'b1; + case (reg_opl[2:0]) // latch approp dest reg on s0 + 3'b001: w_ax_gate <= 1'b0; + 3'b010: w_bx_gate <= 1'b0; + 3'b101: w_p_gate <= 1'b0; + 3'b100: begin + w_flag_gate <= 1'b0; + flag_mux <= 1'b0; + end + default: w_acc_gate <= 1'b0; // else, must be acc + endcase + end + next_state <= state_s0; + end // LMD if + // CALL, 3 bytes, 6 cycles + else if (reg_opl[7:0]==8'b11010110) begin + code_rd_l_gate <= 1'b1; + alu_func <= 4'b1000; // select c_bus=b_bus + bbus_mux <= 3'b011; // select reg_pc low + sp_mux <= 1'b1; // sp = sp - 1 on s5 + w_sp_gate <= 1'b0; // allow sp to decrement + addx_mux <= 2'b10; // select sp as addx source + sram_cs_l <= 1'b0; // select sram + code_wr_l_gate <= 1'b0; // and write + data_bus_wr <= 1'b0; // drive data bus with c_bus + w_pc_gate <= 1'b1; // + next_state <= state_s5; + end // call + end // state_s4 + + /* + ** CALL, 3 byte, 6 cycles + ** save to [SP], [SP-1] PC+1 not PC + */ + state_s5: begin + if (reg_opl[7:0]==8'b11010110) begin + alu_func <= 4'b1000; // select c_bus=b_bus + bbus_mux <= 3'b100; // select reg_pc hi + sp_mux <= 1'b1; // sp = sp - 1 on s0 + w_sp_gate <= 1'b0; // allow sp to decrement + addx_mux <= 2'b10; // select sp as addx source + sram_cs_l <= 1'b0; // select sram + code_wr_l_gate <= 1'b0; // and write + data_bus_wr <= 1'b0; // drive data bus with c_bus + pc_mux <= 1'b0; // PC = d_bus + w_pc_gate <= 1'b0; // allow pc to be changed + next_state <= state_s0; + end + end // state_s5 + + endcase //state machine + +end + + +endmodule diff --git a/projects/popcorn/syn/ise/project/pc.lso b/projects/popcorn/syn/ise/project/pc.lso new file mode 100644 index 0000000..22de730 --- /dev/null +++ b/projects/popcorn/syn/ise/project/pc.lso @@ -0,0 +1 @@ +work diff --git a/projects/popcorn/syn/ise/project/pc.prj b/projects/popcorn/syn/ise/project/pc.prj new file mode 100644 index 0000000..cae8efc --- /dev/null +++ b/projects/popcorn/syn/ise/project/pc.prj @@ -0,0 +1,3 @@ +verilog work "popcorn.v" +verilog work "sequencer.v" +verilog work "pc.v" diff --git a/projects/popcorn/syn/ise/project/pc_vhdl.prj b/projects/popcorn/syn/ise/project/pc_vhdl.prj new file mode 100644 index 0000000..e69de29 diff --git a/projects/popcorn/syn/ise/project/popcorn.ise b/projects/popcorn/syn/ise/project/popcorn.ise new file mode 100644 index 0000000000000000000000000000000000000000..bcdd219cf078a4f06ec369d42ccd8ef5afdc4777 GIT binary patch literal 114723 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%0ATcZbM^I(K*Bw@Fg}dfVd@pVGfaOT;{^l> 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 RxW4Z!=wx2!euUP${|l>!u?zqJ literal 0 HcmV?d00001