From 134d1e7b7f38371107a82d14d2c7ee183abd22c6 Mon Sep 17 00:00:00 2001 From: David Rice Date: Wed, 10 Jun 2026 10:29:49 +0200 Subject: [PATCH] Update banner: 51-char separators, version field v0.1.0, add bump_version.py --- bump_version.py | 61 ++++++ top.v | 552 ++++++++++++++++++++++++++++++------------------ version.txt | 1 + 3 files changed, 406 insertions(+), 208 deletions(-) create mode 100644 bump_version.py create mode 100644 version.txt diff --git a/bump_version.py b/bump_version.py new file mode 100644 index 0000000..15fd3d6 --- /dev/null +++ b/bump_version.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +"""Increment the PATCH component of version.txt and update banner_char in top.v.""" + +import re +import sys +from pathlib import Path + +VERSION_FILE = Path("version.txt") +TOP_V_FILE = Path("top.v") + +# Fixed 9-character field in banner_char; indices 343-351. +VERSION_FIELD_LEN = 9 +VERSION_START_IDX = 343 + + +def read_version(): + if not VERSION_FILE.exists(): + sys.exit(f"Error: {VERSION_FILE} not found") + return VERSION_FILE.read_text().strip() + + +def bump_patch(version): + parts = version.split(".") + if len(parts) != 3 or not all(p.isdigit() for p in parts): + sys.exit(f"Error: unexpected version format '{version}'") + major, minor, patch = int(parts[0]), int(parts[1]), int(parts[2]) + return f"{major}.{minor}.{patch + 1}" + + +def update_top_v(new_version): + if not TOP_V_FILE.exists(): + sys.exit(f"Error: {TOP_V_FILE} not found") + + padded = new_version.ljust(VERSION_FIELD_LEN) + if len(padded) > VERSION_FIELD_LEN: + sys.exit(f"Error: version '{new_version}' exceeds {VERSION_FIELD_LEN} characters") + + content = TOP_V_FILE.read_text() + + for offset, ch in enumerate(padded): + idx = VERSION_START_IDX + offset + pattern = rf"(9'd{idx}:\s+banner_char\s*=\s*)[^\n]+;" + replacement = rf'\g<1>"{ch}";' + new_content = re.sub(pattern, replacement, content) + if new_content == content: + sys.exit(f"Error: could not find banner_char entry for index {idx} in {TOP_V_FILE}") + content = new_content + + TOP_V_FILE.write_text(content) + + +def main(): + old_version = read_version() + new_version = bump_patch(old_version) + update_top_v(new_version) + VERSION_FILE.write_text(new_version + "\n") + print(f"Version bumped to {new_version}") + + +if __name__ == "__main__": + main() diff --git a/top.v b/top.v index 9694de0..63a4e0a 100644 --- a/top.v +++ b/top.v @@ -162,8 +162,8 @@ module top ( F_WAIT = 3'd3, F_BANNER = 3'd4; - // Banner: ESC[2J ESC[H ESC[33m + 2 separator lines + 6 info lines + ESC[0m - localparam [8:0] BANNER_LEN = 9'd288; + // Banner: ESC[2J ESC[H ESC[33m + 2x51-dash separators + info lines + ESC[0m + localparam [8:0] BANNER_LEN = 9'd411; reg [2:0] fstate; reg [8:0] idx; // byte index within message @@ -174,7 +174,7 @@ module top ( reg [7:0] tx_byte; wire tx_busy; - // ERR layout: ESC[31m + "ERR lines=LLLL width=WWWW\n" + ESC[0m (35 bytes) + // ERR layout: ESC[31m + "ERR lines=LLLL width=WWWW" + ESC[0m + \r\n (36 bytes) function [7:0] err_char(input [7:0] i); case (i) 8'd0: err_char = 8'h1B; @@ -207,16 +207,17 @@ module top ( 8'd27: err_char = "0" + W1_r; 8'd28: err_char = "0" + W2_r; 8'd29: err_char = "0" + W3_r; - 8'd30: err_char = 8'h0A; - 8'd31: err_char = 8'h1B; - 8'd32: err_char = "["; - 8'd33: err_char = "0"; - 8'd34: err_char = "m"; + 8'd30: err_char = 8'h1B; + 8'd31: err_char = "["; + 8'd32: err_char = "0"; + 8'd33: err_char = "m"; + 8'd34: err_char = 8'h0D; + 8'd35: err_char = 8'h0A; default: err_char = 8'h00; endcase endfunction - // OK layout: ESC[32m + "OK\n" + ESC[0m (12 bytes) + // OK layout: ESC[32m + "OK" + ESC[0m + \r\n (13 bytes) function [7:0] ok_char(input [7:0] i); case (i) 8'd0: ok_char = 8'h1B; @@ -226,20 +227,38 @@ module top ( 8'd4: ok_char = "m"; 8'd5: ok_char = "O"; 8'd6: ok_char = "K"; - 8'd7: ok_char = 8'h0A; - 8'd8: ok_char = 8'h1B; - 8'd9: ok_char = "["; - 8'd10: ok_char = "0"; - 8'd11: ok_char = "m"; + 8'd7: ok_char = 8'h1B; + 8'd8: ok_char = "["; + 8'd9: ok_char = "0"; + 8'd10: ok_char = "m"; + 8'd11: ok_char = 8'h0D; + 8'd12: ok_char = 8'h0A; default: ok_char = 8'h00; endcase endfunction - // Banner: ESC[2J ESC[H ESC[33m + separator + info lines + separator + ESC[0m - // Indices 12-55 and 239-282 are '-' (handled by range check). - // Total: 288 bytes (indices 0-287). + // Banner layout (411 bytes, indices 0-410): + // 0-11: ESC[2J ESC[H ESC[33m + // 12-62: '-'x51 63:\r 64:\n + // 65-72: "ARRIVE\r\n" + // 73-74: \r\n (blank) + // 75-112: "PARC LA FAYETTE, 6 RUE ISAAC NEWTON,\r\n" + // 113-128: "25000 BESANCON\r\n" + // 129-130: \r\n (blank) + // 131-163: "Project: LVDS Protocol Analyser\r\n" + // 164-216: "Board: DS90CF386 Interface (CI NU TEST LVDS LVCMOS)\r\n" + // 217-239: "S/N: 1000052088 Rev A\r\n" + // 240-241: \r\n (blank) + // 242-261: "Author: David Rice\r\n" + // 262-296: "Role: Senior Electronics Engineer\r\n" + // 297-326: "Email: david.rice@arrive.com\r\n" + // 327-328: \r\n (blank) + // 329-353: "Software Rev: " + 9-char version field + "\r\n" + // version chars at indices 343-351 (bump_version.py updates these) + // 354-404: '-'x51 405:\r 406:\n + // 407-410: ESC[0m function [7:0] banner_char(input [8:0] i); - if ((i >= 9'd12 && i <= 9'd55) || (i >= 9'd239 && i <= 9'd282)) + if ((i >= 9'd12 && i <= 9'd62) || (i >= 9'd354 && i <= 9'd404)) banner_char = "-"; else begin case (i) @@ -258,203 +277,320 @@ module top ( 9'd9: banner_char = "3"; 9'd10: banner_char = "3"; 9'd11: banner_char = "m"; - // first separator \n - 9'd56: banner_char = 8'h0A; - // "Arrive LVDS Protocol Analyser\n" - 9'd57: banner_char = "A"; - 9'd58: banner_char = "r"; - 9'd59: banner_char = "r"; - 9'd60: banner_char = "i"; - 9'd61: banner_char = "v"; - 9'd62: banner_char = "e"; - 9'd63: banner_char = " "; - 9'd64: banner_char = "L"; - 9'd65: banner_char = "V"; - 9'd66: banner_char = "D"; - 9'd67: banner_char = "S"; - 9'd68: banner_char = " "; - 9'd69: banner_char = "P"; - 9'd70: banner_char = "r"; - 9'd71: banner_char = "o"; - 9'd72: banner_char = "t"; - 9'd73: banner_char = "o"; - 9'd74: banner_char = "c"; - 9'd75: banner_char = "o"; - 9'd76: banner_char = "l"; - 9'd77: banner_char = " "; - 9'd78: banner_char = "A"; - 9'd79: banner_char = "n"; - 9'd80: banner_char = "a"; - 9'd81: banner_char = "l"; - 9'd82: banner_char = "y"; - 9'd83: banner_char = "s"; - 9'd84: banner_char = "e"; - 9'd85: banner_char = "r"; - 9'd86: banner_char = 8'h0A; - // "Board: DS90CF386 Interface S/N: 1000052088 Rev A\n" - 9'd87: banner_char = "B"; - 9'd88: banner_char = "o"; - 9'd89: banner_char = "a"; - 9'd90: banner_char = "r"; - 9'd91: banner_char = "d"; - 9'd92: banner_char = ":"; + // first separator \r\n + 9'd63: banner_char = 8'h0D; + 9'd64: banner_char = 8'h0A; + // "ARRIVE\r\n" + 9'd65: banner_char = "A"; + 9'd66: banner_char = "R"; + 9'd67: banner_char = "R"; + 9'd68: banner_char = "I"; + 9'd69: banner_char = "V"; + 9'd70: banner_char = "E"; + 9'd71: banner_char = 8'h0D; + 9'd72: banner_char = 8'h0A; + // blank line + 9'd73: banner_char = 8'h0D; + 9'd74: banner_char = 8'h0A; + // "PARC LA FAYETTE, 6 RUE ISAAC NEWTON,\r\n" + 9'd75: banner_char = "P"; + 9'd76: banner_char = "A"; + 9'd77: banner_char = "R"; + 9'd78: banner_char = "C"; + 9'd79: banner_char = " "; + 9'd80: banner_char = "L"; + 9'd81: banner_char = "A"; + 9'd82: banner_char = " "; + 9'd83: banner_char = "F"; + 9'd84: banner_char = "A"; + 9'd85: banner_char = "Y"; + 9'd86: banner_char = "E"; + 9'd87: banner_char = "T"; + 9'd88: banner_char = "T"; + 9'd89: banner_char = "E"; + 9'd90: banner_char = ","; + 9'd91: banner_char = " "; + 9'd92: banner_char = "6"; 9'd93: banner_char = " "; - 9'd94: banner_char = "D"; - 9'd95: banner_char = "S"; - 9'd96: banner_char = "9"; - 9'd97: banner_char = "0"; - 9'd98: banner_char = "C"; - 9'd99: banner_char = "F"; - 9'd100: banner_char = "3"; - 9'd101: banner_char = "8"; - 9'd102: banner_char = "6"; + 9'd94: banner_char = "R"; + 9'd95: banner_char = "U"; + 9'd96: banner_char = "E"; + 9'd97: banner_char = " "; + 9'd98: banner_char = "I"; + 9'd99: banner_char = "S"; + 9'd100: banner_char = "A"; + 9'd101: banner_char = "A"; + 9'd102: banner_char = "C"; 9'd103: banner_char = " "; - 9'd104: banner_char = "I"; - 9'd105: banner_char = "n"; - 9'd106: banner_char = "t"; - 9'd107: banner_char = "e"; - 9'd108: banner_char = "r"; - 9'd109: banner_char = "f"; - 9'd110: banner_char = "a"; - 9'd111: banner_char = "c"; - 9'd112: banner_char = "e"; - 9'd113: banner_char = " "; - 9'd114: banner_char = " "; - 9'd115: banner_char = "S"; - 9'd116: banner_char = "/"; - 9'd117: banner_char = "N"; - 9'd118: banner_char = ":"; - 9'd119: banner_char = " "; - 9'd120: banner_char = "1"; - 9'd121: banner_char = "0"; - 9'd122: banner_char = "0"; - 9'd123: banner_char = "0"; - 9'd124: banner_char = "0"; - 9'd125: banner_char = "5"; - 9'd126: banner_char = "2"; - 9'd127: banner_char = "0"; - 9'd128: banner_char = "8"; - 9'd129: banner_char = "8"; - 9'd130: banner_char = " "; - 9'd131: banner_char = "R"; - 9'd132: banner_char = "e"; - 9'd133: banner_char = "v"; - 9'd134: banner_char = " "; - 9'd135: banner_char = "A"; - 9'd136: banner_char = 8'h0A; - // "Author: David Rice\n" - 9'd137: banner_char = "A"; - 9'd138: banner_char = "u"; - 9'd139: banner_char = "t"; - 9'd140: banner_char = "h"; - 9'd141: banner_char = "o"; - 9'd142: banner_char = "r"; - 9'd143: banner_char = ":"; + 9'd104: banner_char = "N"; + 9'd105: banner_char = "E"; + 9'd106: banner_char = "W"; + 9'd107: banner_char = "T"; + 9'd108: banner_char = "O"; + 9'd109: banner_char = "N"; + 9'd110: banner_char = ","; + 9'd111: banner_char = 8'h0D; + 9'd112: banner_char = 8'h0A; + // "25000 BESANCON\r\n" + 9'd113: banner_char = "2"; + 9'd114: banner_char = "5"; + 9'd115: banner_char = "0"; + 9'd116: banner_char = "0"; + 9'd117: banner_char = "0"; + 9'd118: banner_char = " "; + 9'd119: banner_char = "B"; + 9'd120: banner_char = "E"; + 9'd121: banner_char = "S"; + 9'd122: banner_char = "A"; + 9'd123: banner_char = "N"; + 9'd124: banner_char = "C"; + 9'd125: banner_char = "O"; + 9'd126: banner_char = "N"; + 9'd127: banner_char = 8'h0D; + 9'd128: banner_char = 8'h0A; + // blank line + 9'd129: banner_char = 8'h0D; + 9'd130: banner_char = 8'h0A; + // "Project: LVDS Protocol Analyser\r\n" + 9'd131: banner_char = "P"; + 9'd132: banner_char = "r"; + 9'd133: banner_char = "o"; + 9'd134: banner_char = "j"; + 9'd135: banner_char = "e"; + 9'd136: banner_char = "c"; + 9'd137: banner_char = "t"; + 9'd138: banner_char = ":"; + 9'd139: banner_char = " "; + 9'd140: banner_char = "L"; + 9'd141: banner_char = "V"; + 9'd142: banner_char = "D"; + 9'd143: banner_char = "S"; 9'd144: banner_char = " "; - 9'd145: banner_char = "D"; - 9'd146: banner_char = "a"; - 9'd147: banner_char = "v"; - 9'd148: banner_char = "i"; - 9'd149: banner_char = "d"; - 9'd150: banner_char = " "; - 9'd151: banner_char = "R"; - 9'd152: banner_char = "i"; - 9'd153: banner_char = "c"; - 9'd154: banner_char = "e"; - 9'd155: banner_char = 8'h0A; - // "Role: Senior Electronics Engineer\n" - 9'd156: banner_char = "R"; - 9'd157: banner_char = "o"; - 9'd158: banner_char = "l"; - 9'd159: banner_char = "e"; - 9'd160: banner_char = ":"; - 9'd161: banner_char = " "; - 9'd162: banner_char = "S"; - 9'd163: banner_char = "e"; - 9'd164: banner_char = "n"; - 9'd165: banner_char = "i"; - 9'd166: banner_char = "o"; + 9'd145: banner_char = "P"; + 9'd146: banner_char = "r"; + 9'd147: banner_char = "o"; + 9'd148: banner_char = "t"; + 9'd149: banner_char = "o"; + 9'd150: banner_char = "c"; + 9'd151: banner_char = "o"; + 9'd152: banner_char = "l"; + 9'd153: banner_char = " "; + 9'd154: banner_char = "A"; + 9'd155: banner_char = "n"; + 9'd156: banner_char = "a"; + 9'd157: banner_char = "l"; + 9'd158: banner_char = "y"; + 9'd159: banner_char = "s"; + 9'd160: banner_char = "e"; + 9'd161: banner_char = "r"; + 9'd162: banner_char = 8'h0D; + 9'd163: banner_char = 8'h0A; + // "Board: DS90CF386 Interface (CI NU TEST LVDS LVCMOS)\r\n" + 9'd164: banner_char = "B"; + 9'd165: banner_char = "o"; + 9'd166: banner_char = "a"; 9'd167: banner_char = "r"; - 9'd168: banner_char = " "; - 9'd169: banner_char = "E"; - 9'd170: banner_char = "l"; - 9'd171: banner_char = "e"; - 9'd172: banner_char = "c"; - 9'd173: banner_char = "t"; - 9'd174: banner_char = "r"; - 9'd175: banner_char = "o"; - 9'd176: banner_char = "n"; - 9'd177: banner_char = "i"; - 9'd178: banner_char = "c"; - 9'd179: banner_char = "s"; + 9'd168: banner_char = "d"; + 9'd169: banner_char = ":"; + 9'd170: banner_char = " "; + 9'd171: banner_char = "D"; + 9'd172: banner_char = "S"; + 9'd173: banner_char = "9"; + 9'd174: banner_char = "0"; + 9'd175: banner_char = "C"; + 9'd176: banner_char = "F"; + 9'd177: banner_char = "3"; + 9'd178: banner_char = "8"; + 9'd179: banner_char = "6"; 9'd180: banner_char = " "; - 9'd181: banner_char = "E"; + 9'd181: banner_char = "I"; 9'd182: banner_char = "n"; - 9'd183: banner_char = "g"; - 9'd184: banner_char = "i"; - 9'd185: banner_char = "n"; - 9'd186: banner_char = "e"; - 9'd187: banner_char = "e"; - 9'd188: banner_char = "r"; - 9'd189: banner_char = 8'h0A; - // "Email: david.rice@arrive.com\n" - 9'd190: banner_char = "E"; - 9'd191: banner_char = "m"; - 9'd192: banner_char = "a"; - 9'd193: banner_char = "i"; - 9'd194: banner_char = "l"; - 9'd195: banner_char = ":"; - 9'd196: banner_char = " "; - 9'd197: banner_char = "d"; - 9'd198: banner_char = "a"; - 9'd199: banner_char = "v"; - 9'd200: banner_char = "i"; - 9'd201: banner_char = "d"; - 9'd202: banner_char = "."; - 9'd203: banner_char = "r"; - 9'd204: banner_char = "i"; - 9'd205: banner_char = "c"; - 9'd206: banner_char = "e"; - 9'd207: banner_char = "@"; - 9'd208: banner_char = "a"; - 9'd209: banner_char = "r"; - 9'd210: banner_char = "r"; - 9'd211: banner_char = "i"; - 9'd212: banner_char = "v"; - 9'd213: banner_char = "e"; - 9'd214: banner_char = "."; - 9'd215: banner_char = "c"; - 9'd216: banner_char = "o"; - 9'd217: banner_char = "m"; - 9'd218: banner_char = 8'h0A; - // "Software Rev: 1.0.0\n" - 9'd219: banner_char = "S"; - 9'd220: banner_char = "o"; - 9'd221: banner_char = "f"; - 9'd222: banner_char = "t"; - 9'd223: banner_char = "w"; - 9'd224: banner_char = "a"; - 9'd225: banner_char = "r"; - 9'd226: banner_char = "e"; - 9'd227: banner_char = " "; - 9'd228: banner_char = "R"; - 9'd229: banner_char = "e"; - 9'd230: banner_char = "v"; - 9'd231: banner_char = ":"; + 9'd183: banner_char = "t"; + 9'd184: banner_char = "e"; + 9'd185: banner_char = "r"; + 9'd186: banner_char = "f"; + 9'd187: banner_char = "a"; + 9'd188: banner_char = "c"; + 9'd189: banner_char = "e"; + 9'd190: banner_char = " "; + 9'd191: banner_char = "("; + 9'd192: banner_char = "C"; + 9'd193: banner_char = "I"; + 9'd194: banner_char = " "; + 9'd195: banner_char = "N"; + 9'd196: banner_char = "U"; + 9'd197: banner_char = " "; + 9'd198: banner_char = "T"; + 9'd199: banner_char = "E"; + 9'd200: banner_char = "S"; + 9'd201: banner_char = "T"; + 9'd202: banner_char = " "; + 9'd203: banner_char = "L"; + 9'd204: banner_char = "V"; + 9'd205: banner_char = "D"; + 9'd206: banner_char = "S"; + 9'd207: banner_char = " "; + 9'd208: banner_char = "L"; + 9'd209: banner_char = "V"; + 9'd210: banner_char = "C"; + 9'd211: banner_char = "M"; + 9'd212: banner_char = "O"; + 9'd213: banner_char = "S"; + 9'd214: banner_char = ")"; + 9'd215: banner_char = 8'h0D; + 9'd216: banner_char = 8'h0A; + // "S/N: 1000052088 Rev A\r\n" + 9'd217: banner_char = "S"; + 9'd218: banner_char = "/"; + 9'd219: banner_char = "N"; + 9'd220: banner_char = ":"; + 9'd221: banner_char = " "; + 9'd222: banner_char = "1"; + 9'd223: banner_char = "0"; + 9'd224: banner_char = "0"; + 9'd225: banner_char = "0"; + 9'd226: banner_char = "0"; + 9'd227: banner_char = "5"; + 9'd228: banner_char = "2"; + 9'd229: banner_char = "0"; + 9'd230: banner_char = "8"; + 9'd231: banner_char = "8"; 9'd232: banner_char = " "; - 9'd233: banner_char = "1"; - 9'd234: banner_char = "."; - 9'd235: banner_char = "0"; - 9'd236: banner_char = "."; - 9'd237: banner_char = "0"; - 9'd238: banner_char = 8'h0A; - // second separator \n - 9'd283: banner_char = 8'h0A; + 9'd233: banner_char = "R"; + 9'd234: banner_char = "e"; + 9'd235: banner_char = "v"; + 9'd236: banner_char = " "; + 9'd237: banner_char = "A"; + 9'd238: banner_char = 8'h0D; + 9'd239: banner_char = 8'h0A; + // blank line + 9'd240: banner_char = 8'h0D; + 9'd241: banner_char = 8'h0A; + // "Author: David Rice\r\n" + 9'd242: banner_char = "A"; + 9'd243: banner_char = "u"; + 9'd244: banner_char = "t"; + 9'd245: banner_char = "h"; + 9'd246: banner_char = "o"; + 9'd247: banner_char = "r"; + 9'd248: banner_char = ":"; + 9'd249: banner_char = " "; + 9'd250: banner_char = "D"; + 9'd251: banner_char = "a"; + 9'd252: banner_char = "v"; + 9'd253: banner_char = "i"; + 9'd254: banner_char = "d"; + 9'd255: banner_char = " "; + 9'd256: banner_char = "R"; + 9'd257: banner_char = "i"; + 9'd258: banner_char = "c"; + 9'd259: banner_char = "e"; + 9'd260: banner_char = 8'h0D; + 9'd261: banner_char = 8'h0A; + // "Role: Senior Electronics Engineer\r\n" + 9'd262: banner_char = "R"; + 9'd263: banner_char = "o"; + 9'd264: banner_char = "l"; + 9'd265: banner_char = "e"; + 9'd266: banner_char = ":"; + 9'd267: banner_char = " "; + 9'd268: banner_char = "S"; + 9'd269: banner_char = "e"; + 9'd270: banner_char = "n"; + 9'd271: banner_char = "i"; + 9'd272: banner_char = "o"; + 9'd273: banner_char = "r"; + 9'd274: banner_char = " "; + 9'd275: banner_char = "E"; + 9'd276: banner_char = "l"; + 9'd277: banner_char = "e"; + 9'd278: banner_char = "c"; + 9'd279: banner_char = "t"; + 9'd280: banner_char = "r"; + 9'd281: banner_char = "o"; + 9'd282: banner_char = "n"; + 9'd283: banner_char = "i"; + 9'd284: banner_char = "c"; + 9'd285: banner_char = "s"; + 9'd286: banner_char = " "; + 9'd287: banner_char = "E"; + 9'd288: banner_char = "n"; + 9'd289: banner_char = "g"; + 9'd290: banner_char = "i"; + 9'd291: banner_char = "n"; + 9'd292: banner_char = "e"; + 9'd293: banner_char = "e"; + 9'd294: banner_char = "r"; + 9'd295: banner_char = 8'h0D; + 9'd296: banner_char = 8'h0A; + // "Email: david.rice@arrive.com\r\n" + 9'd297: banner_char = "E"; + 9'd298: banner_char = "m"; + 9'd299: banner_char = "a"; + 9'd300: banner_char = "i"; + 9'd301: banner_char = "l"; + 9'd302: banner_char = ":"; + 9'd303: banner_char = " "; + 9'd304: banner_char = "d"; + 9'd305: banner_char = "a"; + 9'd306: banner_char = "v"; + 9'd307: banner_char = "i"; + 9'd308: banner_char = "d"; + 9'd309: banner_char = "."; + 9'd310: banner_char = "r"; + 9'd311: banner_char = "i"; + 9'd312: banner_char = "c"; + 9'd313: banner_char = "e"; + 9'd314: banner_char = "@"; + 9'd315: banner_char = "a"; + 9'd316: banner_char = "r"; + 9'd317: banner_char = "r"; + 9'd318: banner_char = "i"; + 9'd319: banner_char = "v"; + 9'd320: banner_char = "e"; + 9'd321: banner_char = "."; + 9'd322: banner_char = "c"; + 9'd323: banner_char = "o"; + 9'd324: banner_char = "m"; + 9'd325: banner_char = 8'h0D; + 9'd326: banner_char = 8'h0A; + // blank line + 9'd327: banner_char = 8'h0D; + 9'd328: banner_char = 8'h0A; + // "Software Rev: " + 9-char version field (indices 343-351) + "\r\n" + 9'd329: banner_char = "S"; + 9'd330: banner_char = "o"; + 9'd331: banner_char = "f"; + 9'd332: banner_char = "t"; + 9'd333: banner_char = "w"; + 9'd334: banner_char = "a"; + 9'd335: banner_char = "r"; + 9'd336: banner_char = "e"; + 9'd337: banner_char = " "; + 9'd338: banner_char = "R"; + 9'd339: banner_char = "e"; + 9'd340: banner_char = "v"; + 9'd341: banner_char = ":"; + 9'd342: banner_char = " "; + 9'd343: banner_char = "0"; + 9'd344: banner_char = "."; + 9'd345: banner_char = "1"; + 9'd346: banner_char = "."; + 9'd347: banner_char = "0"; + 9'd348: banner_char = " "; + 9'd349: banner_char = " "; + 9'd350: banner_char = " "; + 9'd351: banner_char = " "; + 9'd352: banner_char = 8'h0D; + 9'd353: banner_char = 8'h0A; + // second separator \r\n + 9'd405: banner_char = 8'h0D; + 9'd406: banner_char = 8'h0A; // ESC[0m - 9'd284: banner_char = 8'h1B; - 9'd285: banner_char = "["; - 9'd286: banner_char = "0"; - 9'd287: banner_char = "m"; + 9'd407: banner_char = 8'h1B; + 9'd408: banner_char = "["; + 9'd409: banner_char = "0"; + 9'd410: banner_char = "m"; default: banner_char = 8'h00; endcase end @@ -493,7 +629,7 @@ module top ( if (req_edge_q && (anomaly_u || heartbeat_u)) begin idx <= 9'd0; is_err_msg <= anomaly_u; - msg_len <= anomaly_u ? 9'd35 : 9'd12; + msg_len <= anomaly_u ? 9'd36 : 9'd13; l_rem <= lines_u; w_rem <= width_u; conv_step <= 2'd0; diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..6e8bf73 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.1.0