/
...
/
/
PMod S7 UART
Search
Try Notion
PMod S7 UART
PC Software
UART Software Coolterm →
UART Scope Plotter→
CoolTermWin32Bit.zip
17257.0KB
Serial-Oscilloscope-v1.5.zip
341.6KB
Example Layout (Using Odd Parity Bit)
UART Timing Diagram
Character Table
Verilog Code for UART (As of 20Dec20)
//=====UART==== reg uart_reset = 1; reg [7:0] uart_message [0:127]; wire [6:0] message_add; wire uart_tx_buff; wire uart_busy; reg [3:0] uart_setup_state = 0; reg [5:0] transfer_id_prev = 0; reg [6:0] uart_message_count = 0; parameter [7:0] char_zero = 8'd48; always @(posedge(output_uart_clk)) begin //9600Hz if((transfer_id != transfer_id_prev) && (ready_to_transfer == 1) && (uart_setup_state == 0)) begin uart_setup_state = 1; transfer_id_prev = transfer_id; uart_message[00] <= biss_message[00] + char_zero; uart_message[01] <= biss_message[01] + char_zero; uart_message[02] <= 8'h41; //'A' uart_message[03] <= biss_message[02] + char_zero; uart_message[04] <= biss_message[03] + char_zero; uart_message[05] <= biss_message[04] + char_zero; uart_message[06] <= biss_message[05] + char_zero; uart_message[07] <= biss_message[06] + char_zero; uart_message[08] <= biss_message[07] + char_zero; uart_message[09] <= biss_message[08] + char_zero; uart_message[10] <= biss_message[09] + char_zero; uart_message[11] <= biss_message[10] + char_zero; uart_message[12] <= biss_message[11] + char_zero; uart_message[13] <= biss_message[12] + char_zero; uart_message[14] <= biss_message[13] + char_zero; uart_message[15] <= biss_message[14] + char_zero; uart_message[16] <= 8'h45; //'E' uart_message[17] <= biss_message[15] + char_zero; uart_message[18] <= biss_message[16] + char_zero; uart_message[19] <= 8'h43; //'C' uart_message[20] <= biss_message[17] + char_zero; uart_message[21] <= biss_message[18] + char_zero; uart_message[22] <= biss_message[19] + char_zero; uart_message[23] <= biss_message[20] + char_zero; uart_message[24] <= biss_message[21] + char_zero; uart_message[25] <= biss_message[22] + char_zero; uart_message[26] <= 8'h20; //Space Bar uart_message[27] <= biss_message[23] + char_zero; uart_message[28] <= 8'h20; //Space Bar uart_message[29] <= error_m_sig; uart_message[30] <= error_l_sig; uart_message[31] <= 8'h20; //Space Bar uart_message[32] <= test1; uart_message[33] <= test2; uart_message[34] <= crc_validity + char_zero; uart_message[35] <= 8'h20; //Space Bar uart_message[36] <= delay_1; uart_message[37] <= delay_2; uart_message[38] <= delay_3; uart_message[39] <= delay_4; uart_message[40] <= 8'h0D; uart_message[41] <= 8'h0A; uart_message[42] <= 8'h00; end case(uart_setup_state) 1: begin uart_reset = 0; if(uart_busy == 1) uart_setup_state = 2; end 2: begin if(uart_busy == 0) begin uart_setup_state = 0; uart_reset = 1; end end endcase end Uart_transmission trans1(.iClk(output_uart_clk), .iRst(uart_reset), .iMessage(uart_message[message_add]),.oTxUA(uart_tx_buff),.oBusy(uart_busy),.oAdd(message_add)); //=============
Verilog
//======Convert Byte to 2 Char in HEX Form===== module byte_to_Char(iByte,oCharLHS,oCharRHS); input [7:0] iByte; output reg [7:0] oCharLHS,oCharRHS; always @(*) begin if(iByte[3:0] >= 10) oCharRHS = iByte[3:0] - 8'd10 + 8'h41; else oCharRHS = iByte[3:0] + 8'h30; if(iByte[7:4] >= 10) oCharLHS = iByte[7:4] - 8'd10 + 8'h41; else oCharLHS = iByte[7:4] + 8'h30; end endmodule //=============================================== module Uart_transmission(iClk,iRst, iMessage, oTxUA, oBusy, oAdd); input iClk, iRst; input [7:0] iMessage; output oTxUA; output oBusy; output [6:0] oAdd; assign oTxUA = uart_tx_buff_f; assign oAdd = message_count; assign oBusy = uart_busy; //=====UART TX===== reg uart_busy; reg prev_iRst; reg[6:0] message_count=0; reg [3:0] uart_state = 0; reg uart_tx_buff_f = 1; reg [7:0] uart_message_buffer; always @(posedge(iClk)) begin if(iRst == 1) uart_state = 0; else if(iRst == 0 && prev_iRst == 1) begin uart_state = 4'd1; message_count = 7'd0; end case(uart_state) 0: begin //Idle State uart_tx_buff_f = 1; uart_busy = 0; message_count = 7'd0; end 1: begin //'0' Logic uart_busy = 1; uart_tx_buff_f = 0; uart_message_buffer = iMessage; message_count = message_count + 1; uart_state = uart_state+1; end 2,3,4,5,6,7,8,9: //Send Data begin uart_tx_buff_f = uart_message_buffer[uart_state-2]; uart_state = uart_state+1; end 10: begin //Parity uart_tx_buff_f = ~^uart_message_buffer; //Odd Parity uart_state = uart_state+1; end 11: begin //Stop Bit 1 uart_tx_buff_f = 1; uart_state = uart_state+1; end 12: begin if((iMessage == 8'd0) ||(message_count == 7'd50)) uart_state = 4'd0; else uart_state = 4'd1; end default: begin uart_state = 4'd0; end endcase prev_iRst = iRst; end //================= endmodule
Verilog