Add SAP-1 code
This commit is contained in:
		
							parent
							
								
									1ffabc4e7b
								
							
						
					
					
						commit
						7590cd0cf3
					
				| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SRC_DIR=$(pwd)/src
 | 
				
			||||||
 | 
					BUILD_DIR=$(pwd)/.build
 | 
				
			||||||
 | 
					APIO_HOME_DIR=$(pwd)/.apio
 | 
				
			||||||
 | 
					BIN_DIR=$APIO_HOME_DIR/packages/tools-oss-cad-suite/bin
 | 
				
			||||||
 | 
					COMMAND=$1
 | 
				
			||||||
 | 
					VERSION=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MODULES="
 | 
				
			||||||
 | 
						$SRC_DIR/adder.v
 | 
				
			||||||
 | 
						$SRC_DIR/clock.v
 | 
				
			||||||
 | 
						$SRC_DIR/controller.v
 | 
				
			||||||
 | 
						$SRC_DIR/ir.v
 | 
				
			||||||
 | 
						$SRC_DIR/memory.v
 | 
				
			||||||
 | 
						$SRC_DIR/pc.v
 | 
				
			||||||
 | 
						$SRC_DIR/reg_a.v
 | 
				
			||||||
 | 
						$SRC_DIR/reg_b.v"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TOP=$SRC_DIR/top.v
 | 
				
			||||||
 | 
					TB=$SRC_DIR/top_tb.v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -z "$COMMAND" ]; then
 | 
				
			||||||
 | 
						mkdir -p $BUILD_DIR
 | 
				
			||||||
 | 
						pushd $BUILD_DIR > /dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$BIN_DIR/yosys -q -p "synth_ice40 -json hardware.json" $MODULES $TOP
 | 
				
			||||||
 | 
						$BIN_DIR/nextpnr-ice40 --lp8k --package cm81 --json hardware.json --asc hardware.asc --pcf $SRC_DIR/pins.pcf -q
 | 
				
			||||||
 | 
						$BIN_DIR/icepack hardware.asc hardware.bin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						popd > /dev/null
 | 
				
			||||||
 | 
					elif [ "$COMMAND" == "init" ]; then
 | 
				
			||||||
 | 
						virtualenv .env
 | 
				
			||||||
 | 
						source .env/bin/activate
 | 
				
			||||||
 | 
						pip install apio tinyprog
 | 
				
			||||||
 | 
						export APIO_HOME_DIR=$APIO_HOME_DIR
 | 
				
			||||||
 | 
						apio install oss-cad-suite
 | 
				
			||||||
 | 
					elif [ "$COMMAND" == "clean" ]; then
 | 
				
			||||||
 | 
						rm -r $BUILD_DIR
 | 
				
			||||||
 | 
					elif [ "$COMMAND" == "program" ]; then
 | 
				
			||||||
 | 
						source .env/bin/activate
 | 
				
			||||||
 | 
						sudo tinyprog -p $BUILD_DIR/hardware.bin
 | 
				
			||||||
 | 
					elif [ "$COMMAND" == "sim" ]; then
 | 
				
			||||||
 | 
						mkdir -p $BUILD_DIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pushd $SRC_DIR > /dev/null
 | 
				
			||||||
 | 
						$BIN_DIR/iverilog -o $BUILD_DIR/top_tb $MODULES $TB
 | 
				
			||||||
 | 
						$BIN_DIR/vvp $BUILD_DIR/top_tb
 | 
				
			||||||
 | 
						mv top_tb.vcd $BUILD_DIR/
 | 
				
			||||||
 | 
						popd  > /dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gtkwave $BUILD_DIR/top_tb.vcd $BUILD_DIR/top_tb.gtkw
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						echo "Invalid arguments"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					module adder(
 | 
				
			||||||
 | 
						input[7:0] a,
 | 
				
			||||||
 | 
						input[7:0] b,
 | 
				
			||||||
 | 
						input sub,
 | 
				
			||||||
 | 
						input en,
 | 
				
			||||||
 | 
						output[7:0] bus);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign bus = 
 | 
				
			||||||
 | 
						(en) ? 
 | 
				
			||||||
 | 
							((sub) ? a-b : a+b) :
 | 
				
			||||||
 | 
							8'bz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					module clock(
 | 
				
			||||||
 | 
						input hlt,
 | 
				
			||||||
 | 
						input clk_in,
 | 
				
			||||||
 | 
						output clk_out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign clk_out = (hlt) ? 1'b0 : clk_in;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,123 @@
 | 
				
			||||||
 | 
					module controller(
 | 
				
			||||||
 | 
						input clk,
 | 
				
			||||||
 | 
						input[3:0] instr,
 | 
				
			||||||
 | 
						output reg[11:0] ctrl_word);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					localparam SIG_HLT       = 11;
 | 
				
			||||||
 | 
					localparam SIG_PC_INC    = 10;
 | 
				
			||||||
 | 
					localparam SIG_PC_EN     = 9;
 | 
				
			||||||
 | 
					localparam SIG_MEM_LOAD  = 8;
 | 
				
			||||||
 | 
					localparam SIG_MEM_EN    = 7;
 | 
				
			||||||
 | 
					localparam SIG_IR_LOAD   = 6;
 | 
				
			||||||
 | 
					localparam SIG_IR_EN     = 5;
 | 
				
			||||||
 | 
					localparam SIG_A_LOAD    = 4;
 | 
				
			||||||
 | 
					localparam SIG_A_EN      = 3;
 | 
				
			||||||
 | 
					localparam SIG_B_LOAD    = 2;
 | 
				
			||||||
 | 
					localparam SIG_ADDER_SUB = 1;
 | 
				
			||||||
 | 
					localparam SIG_ADDER_EN  = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					localparam OP_LDA = 4'b0000;
 | 
				
			||||||
 | 
					localparam OP_ADD = 4'b0001;
 | 
				
			||||||
 | 
					localparam OP_SUB = 4'b0010;
 | 
				
			||||||
 | 
					localparam OP_HLT = 4'b1111;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg[2:0] stage = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(negedge clk) begin
 | 
				
			||||||
 | 
						if (stage == 6) begin
 | 
				
			||||||
 | 
							stage <= 1;
 | 
				
			||||||
 | 
						end else begin
 | 
				
			||||||
 | 
							stage <= stage + 1;
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(*) begin
 | 
				
			||||||
 | 
						case (stage)
 | 
				
			||||||
 | 
							1: begin
 | 
				
			||||||
 | 
								ctrl_word = 12'b0;
 | 
				
			||||||
 | 
								ctrl_word[SIG_PC_EN] = 1;
 | 
				
			||||||
 | 
								ctrl_word[SIG_MEM_LOAD] = 1;
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							2: begin
 | 
				
			||||||
 | 
								ctrl_word = 12'b0;
 | 
				
			||||||
 | 
								ctrl_word[SIG_PC_INC] = 1;
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							3: begin
 | 
				
			||||||
 | 
								ctrl_word = 12'b0;
 | 
				
			||||||
 | 
								ctrl_word[SIG_MEM_EN] = 1;
 | 
				
			||||||
 | 
								ctrl_word[SIG_IR_LOAD] = 1;
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							4: begin
 | 
				
			||||||
 | 
								case (instr)
 | 
				
			||||||
 | 
									OP_LDA: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_IR_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_MEM_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									OP_ADD: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_IR_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_MEM_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									OP_SUB: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_IR_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_MEM_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									OP_HLT: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_HLT] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									default: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								endcase
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							5: begin
 | 
				
			||||||
 | 
								case (instr)
 | 
				
			||||||
 | 
									OP_LDA: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_MEM_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_A_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									OP_ADD: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_MEM_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_B_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									OP_SUB: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_MEM_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_B_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									default: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								endcase
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							6: begin
 | 
				
			||||||
 | 
								case (instr)
 | 
				
			||||||
 | 
									OP_ADD: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_ADDER_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_A_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									OP_SUB: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
										ctrl_word[SIG_ADDER_SUB] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_ADDER_EN] = 1;
 | 
				
			||||||
 | 
										ctrl_word[SIG_A_LOAD] = 1;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
									default: begin
 | 
				
			||||||
 | 
										ctrl_word = 12'b0;
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								endcase
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							default: begin
 | 
				
			||||||
 | 
								ctrl_word = 12'b0;
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						endcase
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					module ir(
 | 
				
			||||||
 | 
						input clk,
 | 
				
			||||||
 | 
						input clr,
 | 
				
			||||||
 | 
						input load,
 | 
				
			||||||
 | 
						input en,
 | 
				
			||||||
 | 
						inout[7:0] bus,
 | 
				
			||||||
 | 
						output[3:0] instr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg[7:0] ir = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(posedge clk or posedge clr) begin
 | 
				
			||||||
 | 
						if (clr) begin
 | 
				
			||||||
 | 
							ir <= 8'b0;
 | 
				
			||||||
 | 
						end else if (load) begin
 | 
				
			||||||
 | 
							ir <= bus;
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign instr = ir[7:4];
 | 
				
			||||||
 | 
					assign bus = (en) ? ir[3:0] : 8'bz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					module memory(
 | 
				
			||||||
 | 
						input clk,
 | 
				
			||||||
 | 
						input load,
 | 
				
			||||||
 | 
						input en,
 | 
				
			||||||
 | 
						inout[7:0] bus
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					initial begin
 | 
				
			||||||
 | 
						$readmemh("program.bin", ram);
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg[3:0] mar = 0;
 | 
				
			||||||
 | 
					reg[7:0] ram[0:15];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(posedge clk) begin
 | 
				
			||||||
 | 
						if (load) begin
 | 
				
			||||||
 | 
							mar <= bus[3:0];
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign bus = (en) ? ram[mar] : 8'bz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					module pc(
 | 
				
			||||||
 | 
						input clk,
 | 
				
			||||||
 | 
						input clr,
 | 
				
			||||||
 | 
						input inc,
 | 
				
			||||||
 | 
						input en,
 | 
				
			||||||
 | 
						output[7:0] bus
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg[3:0] pc = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(posedge clk or posedge clr) begin
 | 
				
			||||||
 | 
						if (clr) begin
 | 
				
			||||||
 | 
							pc <= 4'b0;
 | 
				
			||||||
 | 
						end else if (inc) begin
 | 
				
			||||||
 | 
							pc <= pc + 1;
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign bus = (en) ? pc : 8'bz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					set_io --warn-no-port CLK B2 # input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					0D
 | 
				
			||||||
 | 
					1E
 | 
				
			||||||
 | 
					2F
 | 
				
			||||||
 | 
					F0
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					00
 | 
				
			||||||
 | 
					03
 | 
				
			||||||
 | 
					04
 | 
				
			||||||
 | 
					02
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					module reg_a(
 | 
				
			||||||
 | 
						input clk,
 | 
				
			||||||
 | 
						input load,
 | 
				
			||||||
 | 
						input en,
 | 
				
			||||||
 | 
						inout[7:0] bus,
 | 
				
			||||||
 | 
						output[7:0] val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg[7:0] reg_a = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(posedge clk) begin
 | 
				
			||||||
 | 
						if (load) begin
 | 
				
			||||||
 | 
							reg_a <= bus;
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign bus = (en) ? reg_a : 8'bz;
 | 
				
			||||||
 | 
					assign val = reg_a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					module reg_b(
 | 
				
			||||||
 | 
						input clk,
 | 
				
			||||||
 | 
						input load,
 | 
				
			||||||
 | 
						input[7:0] bus,
 | 
				
			||||||
 | 
						output[7:0] val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg[7:0] reg_b = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					always @(posedge clk) begin
 | 
				
			||||||
 | 
						if (load) begin
 | 
				
			||||||
 | 
							reg_b <= bus;
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					assign val = reg_b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,97 @@
 | 
				
			||||||
 | 
					module top(
 | 
				
			||||||
 | 
						input CLK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire[7:0] bus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire clk;
 | 
				
			||||||
 | 
					wire hlt;
 | 
				
			||||||
 | 
					clock clock(
 | 
				
			||||||
 | 
						.hlt(hlt),
 | 
				
			||||||
 | 
						.clk_in(CLK),
 | 
				
			||||||
 | 
						.clk_out(clk)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire clr;
 | 
				
			||||||
 | 
					wire pc_en;
 | 
				
			||||||
 | 
					wire pc_inc;
 | 
				
			||||||
 | 
					pc pc(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.clr(clr),
 | 
				
			||||||
 | 
						.inc(pc_inc),
 | 
				
			||||||
 | 
						.en(pc_en),
 | 
				
			||||||
 | 
						.bus(bus)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire a_load;
 | 
				
			||||||
 | 
					wire a_en;
 | 
				
			||||||
 | 
					wire[7:0] a_val;
 | 
				
			||||||
 | 
					reg_a reg_a(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.load(a_load),
 | 
				
			||||||
 | 
						.en(a_en),
 | 
				
			||||||
 | 
						.bus(bus),
 | 
				
			||||||
 | 
						.val(a_val)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire b_load;
 | 
				
			||||||
 | 
					wire[7:0] b_val;
 | 
				
			||||||
 | 
					reg_b reg_b(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.load(b_load),
 | 
				
			||||||
 | 
						.bus(bus),
 | 
				
			||||||
 | 
						.val(b_val)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire adder_sub;
 | 
				
			||||||
 | 
					wire adder_en;
 | 
				
			||||||
 | 
					adder adder(
 | 
				
			||||||
 | 
						.a(a_val),
 | 
				
			||||||
 | 
						.b(b_val),
 | 
				
			||||||
 | 
						.sub(adder_sub),
 | 
				
			||||||
 | 
						.en(adder_en),
 | 
				
			||||||
 | 
						.bus(bus)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire mar_load;
 | 
				
			||||||
 | 
					wire mem_en;
 | 
				
			||||||
 | 
					memory mem(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.load(mar_load),
 | 
				
			||||||
 | 
						.en(mem_en),
 | 
				
			||||||
 | 
						.bus(bus)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire ir_load;
 | 
				
			||||||
 | 
					wire ir_en;
 | 
				
			||||||
 | 
					wire[3:0] ir_instr;
 | 
				
			||||||
 | 
					ir ir(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.clr(clr),
 | 
				
			||||||
 | 
						.load(ir_load),
 | 
				
			||||||
 | 
						.en(ir_en),
 | 
				
			||||||
 | 
						.bus(bus),
 | 
				
			||||||
 | 
						.instr(ir_instr)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					controller controller(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.instr(ir_instr),
 | 
				
			||||||
 | 
						.ctrl_word(
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							hlt,
 | 
				
			||||||
 | 
							pc_inc,
 | 
				
			||||||
 | 
							pc_en,
 | 
				
			||||||
 | 
							mar_load,
 | 
				
			||||||
 | 
							mem_en,
 | 
				
			||||||
 | 
							ir_load,
 | 
				
			||||||
 | 
							ir_en,
 | 
				
			||||||
 | 
							a_load,
 | 
				
			||||||
 | 
							a_en,
 | 
				
			||||||
 | 
							b_load,
 | 
				
			||||||
 | 
							adder_sub,
 | 
				
			||||||
 | 
							adder_en
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,109 @@
 | 
				
			||||||
 | 
					module top_tb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					initial begin
 | 
				
			||||||
 | 
						$dumpfile("top_tb.vcd");
 | 
				
			||||||
 | 
						$dumpvars(0, top_tb);
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reg clk_in = 0;
 | 
				
			||||||
 | 
					integer i;
 | 
				
			||||||
 | 
					initial begin
 | 
				
			||||||
 | 
						for (i = 0; i < 128; i++) begin
 | 
				
			||||||
 | 
							#1 clk_in = ~clk_in;
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire clk;
 | 
				
			||||||
 | 
					wire hlt;
 | 
				
			||||||
 | 
					wire clr;
 | 
				
			||||||
 | 
					wire[7:0] bus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clock clock(
 | 
				
			||||||
 | 
						.hlt(hlt),
 | 
				
			||||||
 | 
						.clk_in(clk_in),
 | 
				
			||||||
 | 
						.clk_out(clk)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire pc_en;
 | 
				
			||||||
 | 
					wire pc_inc;
 | 
				
			||||||
 | 
					pc pc(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.clr(clr),
 | 
				
			||||||
 | 
						.inc(pc_inc),
 | 
				
			||||||
 | 
						.en(pc_en),
 | 
				
			||||||
 | 
						.bus(bus)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire a_load;
 | 
				
			||||||
 | 
					wire a_en;
 | 
				
			||||||
 | 
					wire[7:0] a_val;
 | 
				
			||||||
 | 
					reg_a reg_a(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.load(a_load),
 | 
				
			||||||
 | 
						.en(a_en),
 | 
				
			||||||
 | 
						.bus(bus),
 | 
				
			||||||
 | 
						.val(a_val)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire b_load;
 | 
				
			||||||
 | 
					wire[7:0] b_val;
 | 
				
			||||||
 | 
					reg_b reg_b(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.load(b_load),
 | 
				
			||||||
 | 
						.bus(bus),
 | 
				
			||||||
 | 
						.val(b_val)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire adder_sub;
 | 
				
			||||||
 | 
					wire adder_en;
 | 
				
			||||||
 | 
					adder adder(
 | 
				
			||||||
 | 
						.a(a_val),
 | 
				
			||||||
 | 
						.b(b_val),
 | 
				
			||||||
 | 
						.sub(adder_sub),
 | 
				
			||||||
 | 
						.en(adder_en),
 | 
				
			||||||
 | 
						.bus(bus)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire mar_load;
 | 
				
			||||||
 | 
					wire mem_en;
 | 
				
			||||||
 | 
					memory mem(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.load(mar_load),
 | 
				
			||||||
 | 
						.en(mem_en),
 | 
				
			||||||
 | 
						.bus(bus)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wire ir_load;
 | 
				
			||||||
 | 
					wire ir_en;
 | 
				
			||||||
 | 
					wire[3:0] ir_instr;
 | 
				
			||||||
 | 
					ir ir(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.clr(clr),
 | 
				
			||||||
 | 
						.load(ir_load),
 | 
				
			||||||
 | 
						.en(ir_en),
 | 
				
			||||||
 | 
						.bus(bus),
 | 
				
			||||||
 | 
						.instr(ir_instr)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					controller controller(
 | 
				
			||||||
 | 
						.clk(clk),
 | 
				
			||||||
 | 
						.instr(ir_instr),
 | 
				
			||||||
 | 
						.ctrl_word(
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							hlt,
 | 
				
			||||||
 | 
							pc_inc,
 | 
				
			||||||
 | 
							pc_en,
 | 
				
			||||||
 | 
							mar_load,
 | 
				
			||||||
 | 
							mem_en,
 | 
				
			||||||
 | 
							ir_load,
 | 
				
			||||||
 | 
							ir_en,
 | 
				
			||||||
 | 
							a_load,
 | 
				
			||||||
 | 
							a_en,
 | 
				
			||||||
 | 
							b_load,
 | 
				
			||||||
 | 
							adder_sub,
 | 
				
			||||||
 | 
							adder_en
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue