| `default_nettype none |
| |
| // Top level io for this module should stay the same to fit into the scan_wrapper. |
| // The pin connections within the user_module are up to you, |
| // although (if one is present) it is recommended to place a clock on io_in[0]. |
| // This allows use of the internal clock divider if you wish. |
| module user_module_341457971277988435( |
| input [7:0] io_in, |
| output [7:0] io_out |
| ); |
| |
| wire uart_tx; |
| |
| assign io_out[0] = uart_tx; |
| |
| hello_world_341457971277988435 hello_world( |
| .clk(io_in[0]), |
| .reset(io_in[1]), |
| |
| .uart_tx(uart_tx) |
| ); |
| |
| endmodule |
| |
| // Any submodules should be included in this file, |
| // so they are copied into the main TinyTapeout repo. |
| // Appending your ID to any submodules you create |
| // ensures there are no clashes in full-chip simulation. |
| module hello_world_341457971277988435 ( |
| input clk, |
| input reset, |
| |
| output reg uart_tx |
| ); |
| |
| parameter START_BIT = 1'b0; |
| parameter STOP_BIT = 1'b1; |
| parameter IDLE_BIT = 1'b1; |
| |
| reg [3:0] bit_counter; |
| reg [3:0] byte_counter; |
| |
| reg [3:0] next_bit_counter; //0 to 10 |
| reg [3:0] next_byte_counter; //0 to MSG_LEN (one more than MSG_LEN-1, for one extra idle word length) |
| |
| parameter FRAME_LENGTH = 11; //bit lengths per word length |
| |
| parameter MSG_LEN = 13; |
| wire [7:0] hello_world_ascii [0:MSG_LEN-1]; |
| assign hello_world_ascii[0] = "H"; |
| assign hello_world_ascii[1] = "e"; |
| assign hello_world_ascii[2] = "l"; |
| assign hello_world_ascii[3] = "l"; |
| assign hello_world_ascii[4] = "o"; |
| assign hello_world_ascii[5] = " "; |
| assign hello_world_ascii[6] = "W"; |
| assign hello_world_ascii[7] = "o"; |
| assign hello_world_ascii[8] = "r"; |
| assign hello_world_ascii[9] = "l"; |
| assign hello_world_ascii[10] = "d"; |
| assign hello_world_ascii[11] = "!"; |
| assign hello_world_ascii[12] = "\n"; |
| |
| |
| wire [0:FRAME_LENGTH-1] current_frame; //1 + 1 + 8 + 1 |
| assign current_frame = { |
| IDLE_BIT, |
| START_BIT, |
| hello_world_ascii[byte_counter][0], |
| hello_world_ascii[byte_counter][1], |
| hello_world_ascii[byte_counter][2], |
| hello_world_ascii[byte_counter][3], |
| hello_world_ascii[byte_counter][4], |
| hello_world_ascii[byte_counter][5], |
| hello_world_ascii[byte_counter][6], |
| hello_world_ascii[byte_counter][7], |
| STOP_BIT |
| }; |
| |
| always @(posedge clk) begin |
| if (reset) begin |
| bit_counter <= 0; |
| byte_counter <= 0; |
| end else begin |
| bit_counter <= next_bit_counter; |
| byte_counter <= next_byte_counter; |
| end |
| end |
| |
| always @(*) begin |
| next_bit_counter = bit_counter; |
| next_byte_counter = byte_counter; |
| |
| if(bit_counter < FRAME_LENGTH-1) begin |
| next_bit_counter = bit_counter + 1; |
| end else begin |
| next_bit_counter = 0; |
| |
| if(byte_counter < MSG_LEN) begin |
| next_byte_counter = byte_counter + 1; |
| end else begin |
| next_byte_counter = 0; |
| end |
| end |
| |
| uart_tx = IDLE_BIT; |
| if(byte_counter != MSG_LEN) begin |
| uart_tx = current_frame[bit_counter]; |
| end //else leave a blank byte length at the |
| end |
| |
| |
| endmodule |