diff options
Diffstat (limited to 'hdl/top.sv')
| -rw-r--r-- | hdl/top.sv | 115 |
1 files changed, 65 insertions, 50 deletions
| @@ -13,14 +13,14 @@ bit have_reset = 0; | |||
| 13 | always_ff @(posedge clk) if (reset) have_reset <= 1; | 13 | always_ff @(posedge clk) if (reset) have_reset <= 1; |
| 14 | assign reset = !reset_n || !have_reset; | 14 | assign reset = !reset_n || !have_reset; |
| 15 | 15 | ||
| 16 | bit mem_ready; `define mem_ready `past(mem_ready) | 16 | bit mem_ready; |
| 17 | bit mem_valid; | 17 | bit mem_valid; |
| 18 | bit mem_write; | 18 | bit mem_write; |
| 19 | bit [ADDR_BITS-1:0] mem_address; | 19 | bit [ADDR_BITS-1:0] mem_address; |
| 20 | bit [DATA_BITS-1:0] mem_write_data; | 20 | bit [DATA_BITS-1:0] mem_write_data; |
| 21 | 21 | ||
| 22 | bit mem_read_valid; `define mem_read_valid `past(mem_read_valid) | 22 | bit mem_read_valid; |
| 23 | bit [DATA_BITS-1:0] mem_read_data; `define mem_read_data `past(mem_read_data) | 23 | bit [DATA_BITS-1:0] mem_read_data; |
| 24 | 24 | ||
| 25 | mem | 25 | mem |
| 26 | #( .ADDR_BITS(ADDR_BITS) | 26 | #( .ADDR_BITS(ADDR_BITS) |
| @@ -41,6 +41,14 @@ mem | |||
| 41 | , .read_data(mem_read_data) | 41 | , .read_data(mem_read_data) |
| 42 | ); | 42 | ); |
| 43 | 43 | ||
| 44 | `input(mem_ready) | ||
| 45 | `output(mem_valid) | ||
| 46 | `output(mem_address) | ||
| 47 | `output(mem_write) | ||
| 48 | `output(mem_write_data) | ||
| 49 | `input(mem_read_valid) | ||
| 50 | `input(mem_read_data) | ||
| 51 | |||
| 44 | bit rx_ready; | 52 | bit rx_ready; |
| 45 | bit rx_valid; | 53 | bit rx_valid; |
| 46 | bit [7:0] rx_data; | 54 | bit [7:0] rx_data; |
| @@ -56,14 +64,21 @@ jtag_uart | |||
| 56 | , .reset(reset) | 64 | , .reset(reset) |
| 57 | 65 | ||
| 58 | , .rx_ready(rx_ready) | 66 | , .rx_ready(rx_ready) |
| 59 | , .rx_valid(rx_valid) `define rx_valid `past(rx_valid) | 67 | , .rx_valid(rx_valid) |
| 60 | , .rx_data(rx_data) `define rx_data `past(rx_data) | 68 | , .rx_data(rx_data) |
| 61 | 69 | ||
| 62 | , .tx_ready(tx_ready) `define tx_ready `past(tx_ready) | 70 | , .tx_ready(tx_ready) |
| 63 | , .tx_valid(tx_valid) | 71 | , .tx_valid(tx_valid) |
| 64 | , .tx_data(tx_data) | 72 | , .tx_data(tx_data) |
| 65 | ); | 73 | ); |
| 66 | 74 | ||
| 75 | `output(rx_ready) | ||
| 76 | `input(rx_valid) | ||
| 77 | `input(rx_data) | ||
| 78 | `input(tx_ready) | ||
| 79 | `output(tx_valid) | ||
| 80 | `output(tx_data) | ||
| 81 | |||
| 67 | bit [ADDR_BITS-1:0] pc; | 82 | bit [ADDR_BITS-1:0] pc; |
| 68 | bit [3:0] opcode; | 83 | bit [3:0] opcode; |
| 69 | bit [7:0] operand; | 84 | bit [7:0] operand; |
| @@ -84,33 +99,33 @@ enum | |||
| 84 | 99 | ||
| 85 | always_ff @(posedge clk) begin | 100 | always_ff @(posedge clk) begin |
| 86 | if (reset) begin | 101 | if (reset) begin |
| 87 | mem_valid = 0; | 102 | mem_valid_ = 0; |
| 88 | rx_ready = 0; | 103 | rx_ready_ = 0; |
| 89 | tx_valid = 0; | 104 | tx_valid_ = 0; |
| 90 | tx_data = 0; | 105 | tx_data_ = 0; |
| 91 | pc = 0; | 106 | pc = 0; |
| 92 | acc = 0; | 107 | acc = 0; |
| 93 | state = state.first; | 108 | state = state.first; |
| 94 | end else begin | 109 | end else begin |
| 95 | if (`tx_ready) tx_valid = 0; | 110 | if (tx_ready_) tx_valid_ = 0; |
| 96 | 111 | ||
| 97 | case (state) | 112 | case (state) |
| 98 | FETCH: begin | 113 | FETCH: begin |
| 99 | mem_valid = 1; | 114 | mem_valid_ = 1; |
| 100 | mem_address_ = pc; | 115 | mem_address_ = pc; |
| 101 | mem_write = 0; | 116 | mem_write_ = 0; |
| 102 | if (`mem_ready) begin | 117 | if (mem_ready_) begin |
| 103 | state = DECODE; | 118 | state = DECODE; |
| 104 | ++pc; | 119 | ++pc; |
| 105 | end | 120 | end |
| 106 | end | 121 | end |
| 107 | 122 | ||
| 108 | DECODE: begin | 123 | DECODE: begin |
| 109 | mem_valid = 0; | 124 | mem_valid_ = 0; |
| 110 | mem_write = 0; | 125 | mem_write_ = 0; |
| 111 | if (`mem_read_valid) begin | 126 | if (mem_read_valid_) begin |
| 112 | state = FETCH; | 127 | state = FETCH; |
| 113 | {opcode, operand} = `mem_read_data; | 128 | {opcode, operand} = mem_read_data_; |
| 114 | sign_extended_operand = {{(DATA_BITS-8){operand[7]}}, operand}; | 129 | sign_extended_operand = {{(DATA_BITS-8){operand[7]}}, operand}; |
| 115 | case (opcode) | 130 | case (opcode) |
| 116 | 'h0: begin | 131 | 'h0: begin |
| @@ -135,7 +150,7 @@ always_ff @(posedge clk) begin | |||
| 135 | end | 150 | end |
| 136 | end | 151 | end |
| 137 | 'h6: begin | 152 | 'h6: begin |
| 138 | mem_write_data = acc % 10 + 'h30; | 153 | mem_write_data_ = acc % 10 + 'h30; |
| 139 | acc = acc / 10; | 154 | acc = acc / 10; |
| 140 | address = {7'b0, operand[6:0]}; | 155 | address = {7'b0, operand[6:0]}; |
| 141 | state = operand[7] ? INDIRECT : AGEN; | 156 | state = operand[7] ? INDIRECT : AGEN; |
| @@ -145,70 +160,70 @@ always_ff @(posedge clk) begin | |||
| 145 | end | 160 | end |
| 146 | 161 | ||
| 147 | INDIRECT: begin | 162 | INDIRECT: begin |
| 148 | mem_valid = 1; | 163 | mem_valid_ = 1; |
| 149 | mem_write = 0; | 164 | mem_write_ = 0; |
| 150 | mem_address = address; | 165 | mem_address_ = address; |
| 151 | state = `mem_ready ? INDIRECTED : INDIRECT; | 166 | state = mem_ready_ ? INDIRECTED : INDIRECT; |
| 152 | end | 167 | end |
| 153 | 168 | ||
| 154 | INDIRECTED: begin | 169 | INDIRECTED: begin |
| 155 | if (`mem_ready) begin | 170 | if (mem_ready_) begin |
| 156 | mem_valid = 0; | 171 | mem_valid_ = 0; |
| 157 | mem_write = 0; | 172 | mem_write_ = 0; |
| 158 | end | 173 | end |
| 159 | if (`mem_read_valid) begin | 174 | if (mem_read_valid_) begin |
| 160 | address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `mem_read_data}; | 175 | address = {{(ADDR_BITS - DATA_BITS){1'b0}}, mem_read_data_}; |
| 161 | state = AGEN; | 176 | state = AGEN; |
| 162 | end | 177 | end |
| 163 | end | 178 | end |
| 164 | 179 | ||
| 165 | AGEN: begin | 180 | AGEN: begin |
| 166 | mem_valid = 0; | 181 | mem_valid_ = 0; |
| 167 | mem_write = 0; | 182 | mem_write_ = 0; |
| 168 | state = FETCH; | 183 | state = FETCH; |
| 169 | case (opcode) | 184 | case (opcode) |
| 170 | 'h2: begin | 185 | 'h2: begin |
| 171 | mem_valid = 1; | 186 | mem_valid_ = 1; |
| 172 | mem_address = address; | 187 | mem_address_ = address; |
| 173 | state = `mem_ready ? MEMORY : AGEN; | 188 | state = mem_ready_ ? MEMORY : AGEN; |
| 174 | end | 189 | end |
| 175 | 'h3: begin | 190 | 'h3: begin |
| 176 | mem_valid = 1; | 191 | mem_valid_ = 1; |
| 177 | mem_address = address; | 192 | mem_address_ = address; |
| 178 | mem_write = 1; | 193 | mem_write_ = 1; |
| 179 | mem_write_data = acc; | 194 | mem_write_data_ = acc; |
| 180 | state = `mem_ready ? FETCH : AGEN; | 195 | state = mem_ready_ ? FETCH : AGEN; |
| 181 | end | 196 | end |
| 182 | 'h5: pc = address; | 197 | 'h5: pc = address; |
| 183 | 'h6: begin | 198 | 'h6: begin |
| 184 | mem_valid = 1; | 199 | mem_valid_ = 1; |
| 185 | mem_address = address; | 200 | mem_address_ = address; |
| 186 | mem_write = 1; | 201 | mem_write_ = 1; |
| 187 | state = `mem_ready ? FETCH : AGEN; | 202 | state = mem_ready_ ? FETCH : AGEN; |
| 188 | end | 203 | end |
| 189 | endcase | 204 | endcase |
| 190 | end | 205 | end |
| 191 | 206 | ||
| 192 | MEMORY: begin | 207 | MEMORY: begin |
| 193 | if (`mem_ready) begin | 208 | if (mem_ready_) begin |
| 194 | mem_valid = 0; | 209 | mem_valid_ = 0; |
| 195 | mem_write = 0; | 210 | mem_write_ = 0; |
| 196 | end | 211 | end |
| 197 | state = FETCH; | 212 | state = FETCH; |
| 198 | case (opcode) | 213 | case (opcode) |
| 199 | 'h0: begin | 214 | 'h0: begin |
| 200 | if (operand[6]) begin | 215 | if (operand[6]) begin |
| 201 | if (tx_valid) begin | 216 | if (tx_valid_) begin |
| 202 | state = MEMORY; | 217 | state = MEMORY; |
| 203 | end else begin | 218 | end else begin |
| 204 | tx_valid = 1; | 219 | tx_valid_ = 1; |
| 205 | tx_data = acc[7:0]; | 220 | tx_data_ = acc[7:0]; |
| 206 | end | 221 | end |
| 207 | end | 222 | end |
| 208 | end | 223 | end |
| 209 | 'h2: begin | 224 | 'h2: begin |
| 210 | if (`mem_read_valid) begin | 225 | if (mem_read_valid_) begin |
| 211 | acc = acc + `mem_read_data; | 226 | acc = acc + mem_read_data_; |
| 212 | end else begin | 227 | end else begin |
| 213 | state = MEMORY; | 228 | state = MEMORY; |
| 214 | end | 229 | end |
