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