diff options
| author | Julian Blake Kongslie | 2021-07-16 13:22:51 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2021-07-16 13:22:51 -0700 |
| commit | 765420c81d144bb08021a7aa09a9a0692f5d6322 (patch) | |
| tree | 757bee21385f646fe1fedb1eeba627acbb8cdd09 | |
| parent | Reformat modules.rb to be a little easier to read. (diff) | |
| download | breadboarding-765420c81d144bb08021a7aa09a9a0692f5d6322.tar.xz | |
Add counter module and simplify board design for shift instructions.
| -rw-r--r-- | insts.rb | 65 | ||||
| -rw-r--r-- | modules.rb | 65 | ||||
| -rw-r--r-- | sim/alu.sv | 4 | ||||
| -rw-r--r-- | sim/control.sv | 3 | ||||
| -rw-r--r-- | sim/counter.sv | 38 | ||||
| -rw-r--r-- | sim/top.sv | 1 |
6 files changed, 140 insertions, 36 deletions
| @@ -105,8 +105,69 @@ alu :xor | |||
| 105 | alu :add | 105 | alu :add |
| 106 | alu :sub | 106 | alu :sub |
| 107 | alu :cmp | 107 | alu :cmp |
| 108 | alu :lshift | 108 | |
| 109 | alu :rshift | 109 | inst "lshift $ #" do |
| 110 | uop { @decode.outdata_b; @counter.load; @control.set_uip_if_zero; constaddr($eom) } | ||
| 111 | uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } | ||
| 112 | uop { @tmp0.outdata; @alu.xor; constaddr(0) } | ||
| 113 | shiftloop = uip() | ||
| 114 | uop { @counter.decrement; @alu.outdata; @alu.lshift; constaddr(0) } | ||
| 115 | uop { @counter.outdata; @control.set_uip_if_nonzero; constaddr(shiftloop) } | ||
| 116 | uop { @decode.outaddr_a; @alu.outdata; @rf.store } | ||
| 117 | end | ||
| 118 | |||
| 119 | inst "lshift $ $" do | ||
| 120 | uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata } | ||
| 121 | uop { @tmp0.outdata; @counter.load; @control.set_uip_if_zero; constaddr($eom) } | ||
| 122 | uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } | ||
| 123 | uop { @tmp0.outdata; @alu.xor; constaddr(0) } | ||
| 124 | shiftloop = uip() | ||
| 125 | uop { @counter.decrement; @alu.outdata; @alu.lshift; constaddr(0) } | ||
| 126 | uop { @counter.outdata; @control.set_uip_if_nonzero; constaddr(shiftloop) } | ||
| 127 | uop { @decode.outaddr_a; @alu.outdata; @rf.store } | ||
| 128 | end | ||
| 129 | |||
| 130 | inst "rshift $ #" do | ||
| 131 | uop { @decode.outdata_b; @counter.load; @control.set_uip_if_zero; constaddr($eom) } | ||
| 132 | uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } | ||
| 133 | uop { @tmp0.outdata; @alu.xor; constaddr(0) } | ||
| 134 | shiftloop = uip() | ||
| 135 | uop { @counter.decrement; @alu.outdata; @alu.rshift; constaddr(0) } | ||
| 136 | uop { @counter.outdata; @control.set_uip_if_nonzero; constaddr(shiftloop) } | ||
| 137 | uop { @decode.outaddr_a; @alu.outdata; @rf.store } | ||
| 138 | end | ||
| 139 | |||
| 140 | inst "rshift $ $" do | ||
| 141 | uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata } | ||
| 142 | uop { @tmp0.outdata; @counter.load; @control.set_uip_if_zero; constaddr($eom) } | ||
| 143 | uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } | ||
| 144 | uop { @tmp0.outdata; @alu.xor; constaddr(0) } | ||
| 145 | shiftloop = uip() | ||
| 146 | uop { @counter.decrement; @alu.outdata; @alu.rshift; constaddr(0) } | ||
| 147 | uop { @counter.outdata; @control.set_uip_if_nonzero; constaddr(shiftloop) } | ||
| 148 | uop { @decode.outaddr_a; @alu.outdata; @rf.store } | ||
| 149 | end | ||
| 150 | |||
| 151 | inst "rshiftsign $ #" do | ||
| 152 | uop { @decode.outdata_b; @counter.load; @control.set_uip_if_zero; constaddr($eom) } | ||
| 153 | uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } | ||
| 154 | uop { @tmp0.outdata; @alu.xor; constaddr(0) } | ||
| 155 | shiftloop = uip() | ||
| 156 | uop { @tmp0.outaddr; @counter.decrement; @alu.outdata; @alu.rshift } | ||
| 157 | uop { @counter.outdata; @control.set_uip_if_nonzero; constaddr(shiftloop) } | ||
| 158 | uop { @decode.outaddr_a; @alu.outdata; @rf.store } | ||
| 159 | end | ||
| 160 | |||
| 161 | inst "rshiftsign $ $" do | ||
| 162 | uop { @decode.outaddr_b; @rf.outdata; @tmp0.loaddata } | ||
| 163 | uop { @tmp0.outdata; @counter.load; @control.set_uip_if_zero; constaddr($eom) } | ||
| 164 | uop { @decode.outaddr_a; @rf.outdata; @tmp0.loaddata } | ||
| 165 | uop { @tmp0.outdata; @alu.xor; constaddr(0) } | ||
| 166 | shiftloop = uip() | ||
| 167 | uop { @tmp0.outaddr; @counter.decrement; @alu.outdata; @alu.rshift } | ||
| 168 | uop { @counter.outdata; @control.set_uip_if_nonzero; constaddr(shiftloop) } | ||
| 169 | uop { @decode.outaddr_a; @alu.outdata; @rf.store } | ||
| 170 | end | ||
| 110 | 171 | ||
| 111 | def cmpbit(name, bit) | 172 | def cmpbit(name, bit) |
| 112 | inst "#{name} $ #" do | 173 | inst "#{name} $ #" do |
| @@ -1,39 +1,42 @@ | |||
| 1 | urom :alu, :op, :op_sel0, :op_sel1, :op_sel2, :outaddr, :outdata | 1 | urom :alu, :op, :op_sel0, :op_sel1, :op_sel2, :outaddr, :outdata |
| 2 | urom_alias :alu, :and, :op | 2 | urom_alias :alu, :and, :op |
| 3 | urom_alias :alu, :or, :op, :op_sel0 | 3 | urom_alias :alu, :or, :op, :op_sel0 |
| 4 | urom_alias :alu, :xor, :op, :op_sel1 | 4 | urom_alias :alu, :xor, :op, :op_sel1 |
| 5 | urom_alias :alu, :add, :op, :op_sel0, :op_sel1 | 5 | urom_alias :alu, :add, :op, :op_sel0, :op_sel1 |
| 6 | urom_alias :alu, :sub, :op, :op_sel2 | 6 | urom_alias :alu, :sub, :op, :op_sel2 |
| 7 | urom_alias :alu, :cmp, :op, :op_sel0, :op_sel2 | 7 | urom_alias :alu, :cmp, :op, :op_sel0, :op_sel2 |
| 8 | urom_alias :alu, :lshift, :op, :op_sel1, :op_sel2 | 8 | urom_alias :alu, :lshift, :op, :op_sel1, :op_sel2 |
| 9 | urom_alias :alu, :rshift, :op, :op_sel0, :op_sel1, :op_sel2 | 9 | urom_alias :alu, :rshift, :op, :op_sel0, :op_sel1, :op_sel2 |
| 10 | 10 | ||
| 11 | urom :control, :halt, :set_uip_cond, :nocond, :outaddr, :outdata | 11 | urom :control, :halt, :set_uip_cond, :nocond, :icond, :outaddr, :outdata |
| 12 | urom_alias :control, :set_uip, :set_uip_cond, :nocond | 12 | urom_alias :control, :set_uip, :set_uip_cond, :nocond |
| 13 | urom_alias :control, :set_uip_if_nonzero, :set_uip_cond | 13 | urom_alias :control, :set_uip_if_nonzero, :set_uip_cond |
| 14 | urom_alias :control, :set_uip_if_zero, :set_uip_cond, :icond | ||
| 14 | 15 | ||
| 15 | urom :decode, :clear, :decode, :outaddr, :outaddr_sel0, :outaddr_sel1, :outdata, :outdata_sel0, :outdata_sel1 | 16 | urom :counter, :load, :increment, :decrement, :outdata |
| 16 | urom_alias :decode, :outaddr_a, :outaddr | ||
| 17 | urom_alias :decode, :outaddr_b, :outaddr, :outaddr_sel0 | ||
| 18 | urom_alias :decode, :outaddr_uip, :outaddr, :outaddr_sel1 | ||
| 19 | urom_alias :decode, :outdata_a, :outdata | ||
| 20 | urom_alias :decode, :outdata_b, :outdata, :outdata_sel0 | ||
| 21 | urom_alias :decode, :outdata_needmore, :outdata, :outdata_sel1 | ||
| 22 | 17 | ||
| 23 | urom :memory, :store, :outdata | 18 | urom :decode, :clear, :decode, :outaddr, :outaddr_sel0, :outaddr_sel1, :outdata, :outdata_sel0, :outdata_sel1 |
| 19 | urom_alias :decode, :outaddr_a, :outaddr | ||
| 20 | urom_alias :decode, :outaddr_b, :outaddr, :outaddr_sel0 | ||
| 21 | urom_alias :decode, :outaddr_uip, :outaddr, :outaddr_sel1 | ||
| 22 | urom_alias :decode, :outdata_a, :outdata | ||
| 23 | urom_alias :decode, :outdata_b, :outdata, :outdata_sel0 | ||
| 24 | urom_alias :decode, :outdata_needmore, :outdata, :outdata_sel1 | ||
| 24 | 25 | ||
| 25 | urom :pc, :load, :increment, :outaddr | 26 | urom :memory, :store, :outdata |
| 26 | 27 | ||
| 27 | urom :rf, :store, :reset, :outdata | 28 | urom :pc, :load, :increment, :outaddr |
| 28 | 29 | ||
| 29 | urom :tmp0, :load, :load_sel0, :outaddr, :outdata | 30 | urom :rf, :store, :reset, :outdata |
| 30 | urom_alias :tmp0, :loaddata, :load | ||
| 31 | urom_alias :tmp0, :loadaddr, :load, :load_sel0 | ||
| 32 | 31 | ||
| 33 | urom :tmp1, :load, :load_sel0, :outaddr, :outdata | 32 | urom :tmp0, :load, :load_sel0, :outaddr, :outdata |
| 34 | urom_alias :tmp1, :loaddata, :load | 33 | urom_alias :tmp0, :loaddata, :load |
| 35 | urom_alias :tmp1, :loadaddr, :load, :load_sel0 | 34 | urom_alias :tmp0, :loadaddr, :load, :load_sel0 |
| 36 | 35 | ||
| 37 | urom :uart, :tx, :rx, :outdata, :outdata_sel0 | 36 | urom :tmp1, :load, :load_sel0, :outaddr, :outdata |
| 38 | urom_alias :uart, :outdata_txfull, :outdata | 37 | urom_alias :tmp1, :loaddata, :load |
| 39 | urom_alias :uart, :outdata_rxempty, :outdata, :outdata_sel0 | 38 | urom_alias :tmp1, :loadaddr, :load, :load_sel0 |
| 39 | |||
| 40 | urom :uart, :tx, :rx, :outdata, :outdata_sel0 | ||
| 41 | urom_alias :uart, :outdata_txfull, :outdata | ||
| 42 | urom_alias :uart, :outdata_rxempty, :outdata, :outdata_sel0 | ||
| @@ -49,8 +49,8 @@ assign cmp_result = {{(BUS_BITS-6){1'b0}}, | |||
| 49 | abus > dbus, | 49 | abus > dbus, |
| 50 | abus == dbus, | 50 | abus == dbus, |
| 51 | abus < dbus}; | 51 | abus < dbus}; |
| 52 | assign lshift_result = (dbus >= BUS_BITS) ? 0 : (abus << dbus); | 52 | assign lshift_result = {dbus[BUS_BITS-2:0], abus[0]}; |
| 53 | assign rshift_result = (dbus >= BUS_BITS) ? 0 : (abus >> dbus); | 53 | assign rshift_result = {abus[BUS_BITS-1], dbus[BUS_BITS-1:1]}; |
| 54 | 54 | ||
| 55 | bit [BUS_BITS-1:0] newx; | 55 | bit [BUS_BITS-1:0] newx; |
| 56 | assign newx = | 56 | assign newx = |
diff --git a/sim/control.sv b/sim/control.sv index 7808f61..ddd6401 100644 --- a/sim/control.sv +++ b/sim/control.sv | |||
| @@ -18,6 +18,7 @@ typedef enum | |||
| 18 | { HALT | 18 | { HALT |
| 19 | , SET_UIP_COND | 19 | , SET_UIP_COND |
| 20 | , NOCOND | 20 | , NOCOND |
| 21 | , ICOND | ||
| 21 | , OUTADDR | 22 | , OUTADDR |
| 22 | , OUTDATA | 23 | , OUTDATA |
| 23 | } CtrlBit; | 24 | } CtrlBit; |
| @@ -33,7 +34,7 @@ assign abus = ctrl[OUTADDR] ? constant : {(BUS_BITS){1'bZ}}; | |||
| 33 | assign dbus = ctrl[OUTDATA] ? constant : {(BUS_BITS){1'bZ}}; | 34 | assign dbus = ctrl[OUTDATA] ? constant : {(BUS_BITS){1'bZ}}; |
| 34 | 35 | ||
| 35 | bit cond; | 36 | bit cond; |
| 36 | assign cond = (dbus != 0) || ctrl[NOCOND]; | 37 | assign cond = ((dbus != 0) || ctrl[NOCOND]) ^ ctrl[ICOND]; |
| 37 | 38 | ||
| 38 | always @(posedge clk) begin | 39 | always @(posedge clk) begin |
| 39 | if (reset) begin | 40 | if (reset) begin |
diff --git a/sim/counter.sv b/sim/counter.sv new file mode 100644 index 0000000..1316783 --- /dev/null +++ b/sim/counter.sv | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | module counter | ||
| 2 | #( parameter UROM = "<no file specified>" | ||
| 3 | , parameter UIP_BITS = 15 | ||
| 4 | , parameter UROM_BITS = 8 | ||
| 5 | , parameter BUS_BITS = 16 | ||
| 6 | ) | ||
| 7 | ( input bit clk | ||
| 8 | , input bit reset | ||
| 9 | , input bit [UIP_BITS-1:0] uip | ||
| 10 | , inout bit [BUS_BITS-1:0] abus | ||
| 11 | , inout bit [BUS_BITS-1:0] dbus | ||
| 12 | ); | ||
| 13 | |||
| 14 | bit [BUS_BITS-1:0] x; | ||
| 15 | |||
| 16 | typedef enum | ||
| 17 | { LOAD | ||
| 18 | , INCREMENT | ||
| 19 | , DECREMENT | ||
| 20 | , OUTDATA | ||
| 21 | } CtrlBit; | ||
| 22 | |||
| 23 | bit [UROM_BITS-1:0] ctrl; | ||
| 24 | urom#(UROM, UIP_BITS, UROM_BITS) urom(uip, ctrl); | ||
| 25 | |||
| 26 | assign dbus = ctrl[OUTDATA] ? x : {(BUS_BITS){1'bZ}}; | ||
| 27 | |||
| 28 | always @(posedge clk) begin | ||
| 29 | if (ctrl[LOAD]) begin | ||
| 30 | x <= dbus; | ||
| 31 | end else if (ctrl[INCREMENT]) begin | ||
| 32 | x <= x + 1; | ||
| 33 | end else if (ctrl[DECREMENT]) begin | ||
| 34 | x <= x - 1; | ||
| 35 | end | ||
| 36 | end | ||
| 37 | |||
| 38 | endmodule | ||
| @@ -14,6 +14,7 @@ bit [BUS_BITS-1:0] dbus; | |||
| 14 | 14 | ||
| 15 | alu #("../out/alu.bin", UIP_BITS, UROM_BITS, BUS_BITS) alu(clk, reset, uip, abus, dbus); | 15 | alu #("../out/alu.bin", UIP_BITS, UROM_BITS, BUS_BITS) alu(clk, reset, uip, abus, dbus); |
| 16 | control #("../out/control.bin", UIP_BITS, UROM_BITS, BUS_BITS, "../out/consts.0.bin", "../out/consts.1.bin", 'h7ff8) control(clk, reset, uip, abus, dbus); | 16 | control #("../out/control.bin", UIP_BITS, UROM_BITS, BUS_BITS, "../out/consts.0.bin", "../out/consts.1.bin", 'h7ff8) control(clk, reset, uip, abus, dbus); |
| 17 | counter #("../out/counter.bin", UIP_BITS, UROM_BITS, BUS_BITS) counter(clk, reset, uip, abus, dbus); | ||
| 17 | decode #("../out/decode.bin", UIP_BITS, UROM_BITS, BUS_BITS, 12) decode(clk, reset, uip, abus, dbus); | 18 | decode #("../out/decode.bin", UIP_BITS, UROM_BITS, BUS_BITS, 12) decode(clk, reset, uip, abus, dbus); |
| 18 | memory #("../out/memory.bin", UIP_BITS, UROM_BITS, BUS_BITS, "../out/image.hex", MEM_BITS) memory(clk, reset, uip, abus, dbus); | 19 | memory #("../out/memory.bin", UIP_BITS, UROM_BITS, BUS_BITS, "../out/image.hex", MEM_BITS) memory(clk, reset, uip, abus, dbus); |
| 19 | pc #("../out/pc.bin", UIP_BITS, UROM_BITS, BUS_BITS, 0) pc(clk, reset, uip, abus, dbus); | 20 | pc #("../out/pc.bin", UIP_BITS, UROM_BITS, BUS_BITS, 0) pc(clk, reset, uip, abus, dbus); |
