1

library ieee;

2

use ieee.std_logic_1164.all;

3


4

library ieee;

5

use ieee.numeric_std.all;

6


7

entity fsm_15 is

8

port (

9

clock : in std_logic;

10

reset : in std_logic;

11

out3 : out std_logic;

12

out157 : out std_logic;

13

out159 : out std_logic;

14

out160 : out std_logic;

15

out171 : out std_logic;

16

out172 : out std_logic;

17

out173 : out std_logic;

18

out175 : out std_logic;

19

out178 : out std_logic;

20

in0 : in std_logic;

21

out0 : out std_logic;

22

in5 : in std_logic;

23

in6 : in std_logic;

24

in7 : in std_logic;

25

out35 : out std_logic;

26

out39 : out std_logic;

27

out40 : out std_logic;

28

out41 : out std_logic;

29

out44 : out std_logic;

30

out46 : out std_logic;

31

out140 : out std_logic;

32

in8 : in std_logic;

33

in9 : in std_logic;

34

in10 : in std_logic;

35

in11 : in std_logic;

36

in12 : in std_logic;

37

in13 : in std_logic;

38

in14 : in std_logic;

39

out65 : out std_logic;

40

in1 : in std_logic;

41

in2 : in std_logic;

42

in3 : in std_logic;

43

in4 : in std_logic;

44

out225 : out std_logic;

45

out227 : out std_logic;

46

out231 : out std_logic;

47

out235 : out std_logic;

48

out236 : out std_logic;

49

out237 : out std_logic;

50

out238 : out std_logic;

51

out97 : out std_logic;

52

out98 : out std_logic;

53

out101 : out std_logic;

54

out102 : out std_logic;

55

out124 : out std_logic;

56

out125 : out std_logic;

57

out80 : out std_logic;

58

out81 : out std_logic;

59

out84 : out std_logic;

60

out86 : out std_logic;

61

out88 : out std_logic;

62

out93 : out std_logic;

63

out94 : out std_logic

64

);

65

end fsm_15;

66


67

architecture augh of fsm_15 is

68


69

signal state_cur : std_logic_vector(0 to 21) := (19 => '1', others => '0');

70

signal state_next : std_logic_vector(0 to 21) := (19 => '1', others => '0');

71


72

 Buffers for outputs

73

signal out0_buf : std_logic := '0';

74

signal out0_bufn : std_logic;

75

signal out40_buf : std_logic := '0';

76

signal out40_bufn : std_logic;

77

signal out101_buf : std_logic := '0';

78

signal out101_bufn : std_logic;

79

signal out172_buf : std_logic := '0';

80

signal out172_bufn : std_logic;

81


82

 Function calls: return IDs

83

signal funccall0 : unsigned(0 downto 0) := (others => '0');

84

signal funccall0_next : unsigned(0 downto 0) := (others => '0');

85


86

begin

87


88

 Sequential process

89

 Set the current state

90


91

process (clock)

92

begin

93

if rising_edge(clock) then

94


95

 Next state

96

state_cur <= state_next;

97

 Buffers for outputs

98

out0_buf <= out0_bufn;

99

out40_buf <= out40_bufn;

100

out101_buf <= out101_bufn;

101

out172_buf <= out172_bufn;

102

 Function calls: return IDs

103

funccall0 <= funccall0_next;

104


105

end if;

106

end process;

107


108

 Combinatorial process

109

 Compute the next state

110

 Compute the outputs

111


112

process (

113

 Inputs of the FSM

114

reset, in0, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in1, in2, in3, in4,

115

 Function calls: return IDs

116

funccall0,

117

 Current state

118

state_cur

119

)

120

begin

121


122

 Reset the next state value

123


124

state_next <= (others => '0');

125


126

 Default value to the outputs or output buffers

127


128

out46 <= '0';

129

out35 <= '0';

130

out65 <= '0';

131

out39 <= '0';

132

out3 <= '0';

133

out44 <= '0';

134

out0_bufn <= '0';

135

out41 <= '0';

136

out40_bufn <= '0';

137

out80 <= '0';

138

out81 <= '0';

139

out84 <= '0';

140

out86 <= '0';

141

out88 <= '0';

142

out93 <= '0';

143

out94 <= '0';

144

out97 <= '0';

145

out98 <= '0';

146

out101_bufn <= '0';

147

out102 <= '0';

148

out124 <= '0';

149

out125 <= '0';

150

out140 <= '0';

151

out157 <= '0';

152

out159 <= '0';

153

out160 <= '0';

154

out171 <= '0';

155

out172_bufn <= '0';

156

out173 <= '0';

157

out175 <= '0';

158

out178 <= '0';

159

out225 <= '0';

160

out227 <= '0';

161

out231 <= '0';

162

out235 <= '0';

163

out236 <= '0';

164

out237 <= '0';

165

out238 <= '0';

166


167

 Function calls: default values (no change)

168

funccall0_next <= funccall0;

169


170

 For all states, compute the next state bits

171

 And the outputs, and the next value for buffered outputs

172


173

if state_cur(0) = '1' then

174

 Next state

175

if ((in4) or (in3) or (in2)) = '1' then

176

state_next(17) <= '1';

177

 Next values for buffered outputs

178

else

179

if (in1) = '1' then

180

 Function call: memextrct_0

181

 Save the origin of the call

182

funccall0_next <= to_unsigned(0, 1);

183

 This is where the function call leads

184

state_next(4) <= '1';

185

 Next values for buffered outputs

186

out0_bufn <= '1';

187

else

188

if (in0) = '1' then

189

 Function call: memextrct_1

190

state_next(2) <= '1';

191

 Next values for buffered outputs

192

out0_bufn <= '1';

193

else

194

state_next(17) <= '1';

195

 Next values for buffered outputs

196

end if;

197

end if;

198

end if;

199

 Assignment of nonbuffered outputs

200

out3 <= '1';

201

end if;

202


203

if state_cur(1) = '1' then

204

 Next state

205

if (in5) = '1' then

206

state_next(1) <= '1';

207

 Next values for buffered outputs

208

out40_bufn <= '1';

209

else

210

 Return from function: memextrct_1

211

 Function call: memextrct_0

212

 Save the origin of the call

213

funccall0_next <= to_unsigned(1, 1);

214

 This is where the function call leads

215

state_next(4) <= '1';

216

 Next values for buffered outputs

217

out0_bufn <= '1';

218

end if;

219

 Assignment of nonbuffered outputs

220

out41 <= '1';

221

out39 <= '1';

222

out35 <= '1';

223

end if;

224


225

if state_cur(2) = '1' then

226

 Next state

227

state_next(1) <= '1';

228

 Next values for buffered outputs

229

out40_bufn <= '1';

230

 Assignment of nonbuffered outputs

231

out44 <= '1';

232

end if;

233


234

if state_cur(3) = '1' then

235

 Next state

236

if (in6) = '1' then

237

state_next(3) <= '1';

238

 Next values for buffered outputs

239

out40_bufn <= '1';

240

else

241

 Return from function: memextrct_0

242

if funccall0 = 1 then

243

state_next(17) <= '1';

244

 Next values for buffered outputs

245

end if;

246

 Return from function: memextrct_0

247

if funccall0 = 0 then

248

state_next(17) <= '1';

249

 Next values for buffered outputs

250

end if;

251

end if;

252

 Assignment of nonbuffered outputs

253

out41 <= '1';

254

out65 <= '1';

255

out46 <= '1';

256

end if;

257


258

if state_cur(4) = '1' then

259

 Next state

260

state_next(3) <= '1';

261

 Next values for buffered outputs

262

out40_bufn <= '1';

263

 Assignment of nonbuffered outputs

264

out44 <= '1';

265

end if;

266


267

if state_cur(5) = '1' then

268

 Next state

269

if (in8) = '1' then

270

state_next(20) <= '1';

271

 Next values for buffered outputs

272

else

273

if (not (in7)) = '1' then

274

state_next(5) <= '1';

275

 Next values for buffered outputs

276

else

277

state_next(6) <= '1';

278

 Next values for buffered outputs

279

end if;

280

end if;

281

 Assignment of nonbuffered outputs

282

out84 <= '1';

283

out81 <= '1';

284

out80 <= '1';

285

end if;

286


287

if state_cur(6) = '1' then

288

 Next state

289

if (in8) = '1' then

290

state_next(20) <= '1';

291

 Next values for buffered outputs

292

else

293

if (not (in9)) = '1' then

294

state_next(6) <= '1';

295

 Next values for buffered outputs

296

else

297

state_next(7) <= '1';

298

 Next values for buffered outputs

299

end if;

300

end if;

301

 Assignment of nonbuffered outputs

302

out88 <= '1';

303

out86 <= '1';

304

out81 <= '1';

305

end if;

306


307

if state_cur(7) = '1' then

308

 Next state

309

if (in8) = '1' then

310

state_next(20) <= '1';

311

 Next values for buffered outputs

312

else

313

if (not (in9)) = '1' then

314

state_next(7) <= '1';

315

 Next values for buffered outputs

316

else

317

state_next(16) <= '1';

318

 Next values for buffered outputs

319

end if;

320

end if;

321

 Assignment of nonbuffered outputs

322

out94 <= '1';

323

out93 <= '1';

324

out81 <= '1';

325

end if;

326


327

if state_cur(8) = '1' then

328

 Next state

329

state_next(14) <= '1';

330

 Next values for buffered outputs

331

 Assignment of nonbuffered outputs

332

out98 <= '1';

333

out97 <= '1';

334

end if;

335


336

if state_cur(9) = '1' then

337

 Next state

338

if (in10) = '1' then

339

state_next(10) <= '1';

340

 Next values for buffered outputs

341

out101_bufn <= '1';

342

else

343

state_next(5) <= '1';

344

 Next values for buffered outputs

345

end if;

346

 Assignment of nonbuffered outputs

347

end if;

348


349

if state_cur(10) = '1' then

350

 Next state

351

state_next(11) <= '1';

352

 Next values for buffered outputs

353

 Assignment of nonbuffered outputs

354

out102 <= '1';

355

end if;

356


357

if state_cur(11) = '1' then

358

 Next state

359

state_next(13) <= '1';

360

 Next values for buffered outputs

361

out172_bufn <= '1';

362

 Assignment of nonbuffered outputs

363

out125 <= '1';

364

out124 <= '1';

365

end if;

366


367

if state_cur(12) = '1' then

368

 Next state

369

state_next(9) <= '1';

370

 Next values for buffered outputs

371

 Assignment of nonbuffered outputs

372

out159 <= '1';

373

out157 <= '1';

374

out140 <= '1';

375

end if;

376


377

if state_cur(13) = '1' then

378

 Next state

379

if (in8) = '1' then

380

state_next(20) <= '1';

381

 Next values for buffered outputs

382

else

383

state_next(9) <= '1';

384

 Next values for buffered outputs

385

end if;

386

 Assignment of nonbuffered outputs

387

out173 <= '1';

388

out171 <= '1';

389

out160 <= '1';

390

out81 <= '1';

391

end if;

392


393

if state_cur(14) = '1' then

394

 Next state

395

if (in11) = '1' then

396

state_next(15) <= '1';

397

 Next values for buffered outputs

398

out172_bufn <= '1';

399

out101_bufn <= '1';

400

else

401

state_next(12) <= '1';

402

 Next values for buffered outputs

403

end if;

404

 Assignment of nonbuffered outputs

405

end if;

406


407

if state_cur(15) = '1' then

408

 Next state

409

if (in8) = '1' then

410

state_next(20) <= '1';

411

 Next values for buffered outputs

412

else

413

state_next(14) <= '1';

414

 Next values for buffered outputs

415

end if;

416

 Assignment of nonbuffered outputs

417

out173 <= '1';

418

out178 <= '1';

419

out175 <= '1';

420

out81 <= '1';

421

end if;

422


423

if state_cur(16) = '1' then

424

 Next state

425

state_next(8) <= '1';

426

 Next values for buffered outputs

427

 Assignment of nonbuffered outputs

428

out159 <= '1';

429

out227 <= '1';

430

out225 <= '1';

431

end if;

432


433

if state_cur(17) = '1' then

434

 Next state

435

if (in12) = '1' then

436

if (in4) = '1' then

437

state_next(5) <= '1';

438

 Next values for buffered outputs

439

else

440

if (in3) = '1' then

441

state_next(6) <= '1';

442

 Next values for buffered outputs

443

else

444

if (in2) = '1' then

445

state_next(7) <= '1';

446

 Next values for buffered outputs

447

else

448

if (in1) = '1' then

449

state_next(13) <= '1';

450

 Next values for buffered outputs

451

out172_bufn <= '1';

452

else

453

state_next(15) <= '1';

454

 Next values for buffered outputs

455

out172_bufn <= '1';

456

out101_bufn <= '1';

457

end if;

458

end if;

459

end if;

460

end if;

461

else

462

state_next(18) <= '1';

463

 Next values for buffered outputs

464

end if;

465

 Assignment of nonbuffered outputs

466

out231 <= '1';

467

end if;

468


469

if state_cur(18) = '1' then

470

 Next state

471

state_next(18) <= '1';

472

 Next values for buffered outputs

473

 Assignment of nonbuffered outputs

474

end if;

475


476

 Info: This is the init/reset state

477

if state_cur(19) = '1' then

478

 Next state

479

if (not (in13)) = '1' then

480

state_next(19) <= '1';

481

 Next values for buffered outputs

482

else

483

if (in12) = '1' then

484

state_next(20) <= '1';

485

 Next values for buffered outputs

486

else

487

state_next(6) <= '1';

488

 Next values for buffered outputs

489

end if;

490

end if;

491

 Assignment of nonbuffered outputs

492

out236 <= '1';

493

out235 <= '1';

494

end if;

495


496

if state_cur(20) = '1' then

497

 Next state

498

state_next(21) <= '1';

499

 Next values for buffered outputs

500

 Assignment of nonbuffered outputs

501

out44 <= '1';

502

end if;

503


504

if state_cur(21) = '1' then

505

 Next state

506

if (in14) = '1' then

507

state_next(21) <= '1';

508

 Next values for buffered outputs

509

else

510

state_next(0) <= '1';

511

 Next values for buffered outputs

512

out0_bufn <= '1';

513

end if;

514

 Assignment of nonbuffered outputs

515

out41 <= '1';

516

out238 <= '1';

517

out237 <= '1';

518

end if;

519


520

 Reset input

521

if reset = '1' then

522

 Set the reset state

523

state_next <= (19 => '1', others => '0');

524

 Note: Resetting all buffers for outputs here is not necessary.

525

 It would cost hardware. They will be reset at the next clock front.

526

 Reset state: set the buffered outputs

527

end if;

528


529

end process;

530


531

 Assignment of buffered outputs

532


533

out0 <= out0_buf;

534

out40 <= out40_buf;

535

out101 <= out101_buf;

536

out172 <= out172_buf;

537


538

end architecture;

539

