OpenCores
URL https://opencores.org/ocsvn/iso7816_3_master/iso7816_3_master/trunk

Subversion Repositories iso7816_3_master

[/] [iso7816_3_master/] [trunk/] [sources/] [Uart.v] - Diff between revs 4 and 5

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 4 Rev 5
`timescale 1ns / 1ps
`timescale 1ns / 1ps
`default_nettype none
`default_nettype none
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Company: 
// Engineer: Sebastien Riou
// Engineer: Sebastien Riou
// 
// 
// Create Date:    23:57:02 08/31/2010 
// Create Date:    23:57:02 08/31/2010 
// Design Name: 
// Design Name: 
// Module Name:    Uart 
// Module Name:    Uart 
// Project Name: 
// Project Name: 
// Target Devices: 
// Target Devices: 
// Tool versions: 
// Tool versions: 
// Description: Half duplex UART with 1 byte buffer
// Description: Half duplex UART with 1 byte buffer
//
//
// Dependencies: 
// Dependencies: 
//
//
// Revision: 
// Revision: 
// Revision 0.01 - File Created
// Revision 0.01 - File Created
// Additional Comments: 
// Additional Comments: 
//
//
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
module BasicHalfDuplexUart(
module BasicHalfDuplexUart(
    output wire [7:0] rxData,
    output wire [7:0] rxData,
    output wire overrunErrorFlag,       //new data has been received before dataOut was read
    output wire overrunErrorFlag,       //new data has been received before dataOut was read
    output wire dataOutReadyFlag,       //new data available
    output wire dataOutReadyFlag,       //new data available
    output wire frameErrorFlag,         //bad parity or bad stop bits
    output wire frameErrorFlag,         //bad parity or bad stop bits
    output wire txRun,                                  //tx is started
    output wire txRun,                                  //tx is started
    output wire endOfRx,           //one cycle pulse: 1 during last cycle of last stop bit of rx
    output wire endOfRx,           //one cycle pulse: 1 during last cycle of last stop bit of rx
    output wire rxRun,                                  //rx is definitely started, one of the three flag will be set
    output wire rxRun,                                  //rx is definitely started, one of the three flag will be set
    output wire rxStartBit,                     //rx is started, but we don't know yet if real rx or just a glitch
    output wire rxStartBit,                     //rx is started, but we don't know yet if real rx or just a glitch
    output wire txFull,
    output wire txFull,
    output wire isTx,              //1 only when tx is ongoing. Indicates the direction of the com line.
    output wire isTx,              //1 only when tx is ongoing. Indicates the direction of the com line.
 
 
         input wire serialIn,                           //signals to merged into a inout signal according to "isTx"
         input wire serialIn,                           //signals to merged into a inout signal according to "isTx"
         output wire serialOut,
         output wire serialOut,
         output wire comClk,
         output wire comClk,
 
 
    input wire [DIVIDER_WIDTH-1:0] clkPerCycle,
    input wire [DIVIDER_WIDTH-1:0] clkPerCycle,
         input wire [7:0] txData,
         input wire [7:0] txData,
         input wire [CLOCK_PER_BIT_WIDTH-1:0] clocksPerBit,
         input wire [CLOCK_PER_BIT_WIDTH-1:0] clocksPerBit,
         input wire stopBit2,//0: 1 stop bit, 1: 2 stop bits
         input wire stopBit2,//0: 1 stop bit, 1: 2 stop bits
         input wire oddParity, //if 1, parity bit is such that data+parity have an odd number of 1
         input wire oddParity, //if 1, parity bit is such that data+parity have an odd number of 1
    input wire msbFirst,  //if 1, bits order is: startBit, b7, b6, b5...b0, parity
    input wire msbFirst,  //if 1, bits order is: startBit, b7, b6, b5...b0, parity
         input wire startTx,
         input wire startTx,
         input wire ackFlags,
         input wire ackFlags,
         input wire clk,
         input wire clk,
    input wire nReset
    input wire nReset
    );
    );
 
 
//parameters to override
//parameters to override
parameter DIVIDER_WIDTH = 1;
parameter DIVIDER_WIDTH = 1;
parameter CLOCK_PER_BIT_WIDTH = 13;     //allow to support default speed of ISO7816
parameter CLOCK_PER_BIT_WIDTH = 13;     //allow to support default speed of ISO7816
//invert the polarity of the output or not
//invert the polarity of the output or not
parameter IN_POLARITY = 1'b0;
parameter IN_POLARITY = 1'b0;
parameter PARITY_POLARITY = 1'b1;
parameter PARITY_POLARITY = 1'b1;
//default conventions
//default conventions
parameter START_BIT = 1'b0;
parameter START_BIT = 1'b0;
parameter STOP_BIT1 = 1'b1;
parameter STOP_BIT1 = 1'b1;
parameter STOP_BIT2 = 1'b1;
parameter STOP_BIT2 = 1'b1;
 
 
//constant definition for states
//constant definition for states
localparam IDLE_STATE =         3'b000;
localparam IDLE_STATE =         3'b000;
localparam RX_STATE =   3'b001;
localparam RX_STATE =   3'b001;
localparam TX_STATE =   3'b011;
localparam TX_STATE =   3'b011;
 
 
wire rxSerialIn = isTx ? STOP_BIT1 : serialIn;
wire rxSerialIn = isTx ? STOP_BIT1 : serialIn;
//wire serialOut;
//wire serialOut;
wire loadDataIn;
wire loadDataIn;
 
 
wire txStopBits;
wire txStopBits;
 
 
assign isTx = txRun & ~txStopBits;
assign isTx = txRun & ~txStopBits;
//let this to top level to avoid inout signal
//let this to top level to avoid inout signal
//assign serialLine = isTx ? serialOut : 1'bz;
//assign serialLine = isTx ? serialOut : 1'bz;
 
 
assign loadDataIn = startTx & ~rxStartBit & (~rxRun | endOfRx);
assign loadDataIn = startTx & ~rxStartBit & (~rxRun | endOfRx);
 
 
/*//complicated approach... instead we can simply divide the clock at lower levels
/*//complicated approach... instead we can simply divide the clock at lower levels
wire useEarlyComClk = |clkPerCycle ? 1'b1:1'b0;
wire useEarlyComClk = |clkPerCycle ? 1'b1:1'b0;
reg dividedClk;
reg dividedClk;
wire earlyComClk;//earlier than comClk by 1 cycle of clk (use to make 1 cycle pulse signals)
wire earlyComClk;//earlier than comClk by 1 cycle of clk (use to make 1 cycle pulse signals)
always @(posedge clk)begin
always @(posedge clk)begin
        if(useEarlyComClk)
        if(useEarlyComClk)
                dividedClk <= earlyComClk;
                dividedClk <= earlyComClk;
end
end
assign comClk=useEarlyComClk ? dividedClk : clk;//clock for communication
assign comClk=useEarlyComClk ? dividedClk : clk;//clock for communication
wire endOfRxComClk;//pulse of 1 cycle of comClk
wire endOfRxComClk;//pulse of 1 cycle of comClk
assign endOfRx = useEarlyComClk ? endOfRxComClk & earlyComClk & ~comClk : endOfRxComClk;//pulse of 1 cycle of clk
assign endOfRx = useEarlyComClk ? endOfRxComClk & earlyComClk & ~comClk : endOfRxComClk;//pulse of 1 cycle of clk
ClkDivider #(.DIVIDER_WIDTH(DIVIDER_WIDTH))
ClkDivider #(.DIVIDER_WIDTH(DIVIDER_WIDTH))
        clkDivider(
        clkDivider(
                .nReset(nReset),
                .nReset(nReset),
                .clk(clk),
                .clk(clk),
                .divider(clkPerCycle),
                .divider(clkPerCycle),
                .dividedClk(earlyComClk)
                .dividedClk(earlyComClk)
                );
                );
*/
*/
 
wire stopBit;
// Instantiate the module
// Instantiate the module
RxCoreSelfContained #(
RxCoreSelfContained #(
                .DIVIDER_WIDTH(DIVIDER_WIDTH),
                .DIVIDER_WIDTH(DIVIDER_WIDTH))
                .PARITY_POLARITY(PARITY_POLARITY))
 
        rxCore (
        rxCore (
    .dataOut(rxData),
    .dataOut(rxData),
    .overrunErrorFlag(overrunErrorFlag),
    .overrunErrorFlag(overrunErrorFlag),
    .dataOutReadyFlag(dataOutReadyFlag),
    .dataOutReadyFlag(dataOutReadyFlag),
    .frameErrorFlag(frameErrorFlag),
    .frameErrorFlag(frameErrorFlag),
    .endOfRx(endOfRx),
    .endOfRx(endOfRx),
    .run(rxRun),
    .run(rxRun),
    .startBit(rxStartBit),
    .startBit(rxStartBit),
 
         .stopBit(stopBit),
         .clkPerCycle(clkPerCycle),
         .clkPerCycle(clkPerCycle),
    .clocksPerBit(clocksPerBit),
    .clocksPerBit(clocksPerBit),
    .stopBit2(stopBit2),
    .stopBit2(stopBit2),
    .oddParity(oddParity),
    .oddParity(oddParity),
    .msbFirst(msbFirst),
    .msbFirst(msbFirst),
         .ackFlags(ackFlags),
         .ackFlags(ackFlags),
    .serialIn(rxSerialIn),
    .serialIn(rxSerialIn),
    .comClk(comClk),
    .comClk(comClk),
    .clk(clk),
    .clk(clk),
    .nReset(nReset)
    .nReset(nReset)
    );
    );
TxCore #(.DIVIDER_WIDTH(DIVIDER_WIDTH))
TxCore #(.DIVIDER_WIDTH(DIVIDER_WIDTH))
        txCore (
        txCore (
        .serialOut(serialOut),
        .serialOut(serialOut),
        .run(txRun),
        .run(txRun),
        .full(txFull),
        .full(txFull),
   .stopBits(txStopBits),
   .stopBits(txStopBits),
        .dataIn(txData),
        .dataIn(txData),
        .clkPerCycle(clkPerCycle),
        .clkPerCycle(clkPerCycle),
        .clocksPerBit(clocksPerBit),
        .clocksPerBit(clocksPerBit),
        .stopBit2(stopBit2),
        .stopBit2(stopBit2),
   .oddParity(oddParity),
   .oddParity(oddParity),
   .msbFirst(msbFirst),
   .msbFirst(msbFirst),
        .loadDataIn(loadDataIn),
        .loadDataIn(loadDataIn),
        .comClk(comClk),
        .comClk(comClk),
   .clk(clk),
   .clk(clk),
   .nReset(nReset)
   .nReset(nReset)
);
);
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.