blob: a32800c82234df083fb4431f53342c7726a89a4b [file] [log] [blame]
`default_nettype none
/*
*-------------------------------------------------------------
*
* user_proj_example
*
* This is an example of a (trivially simple) user project,
* showing how the user project can connect to the logic
* analyzer, the wishbone bus, and the I/O pads.
*
* This project generates an integer count, which is output
* on the user area GPIO pads (digital output only). The
* wishbone connection allows the project to be controlled
* (start and stop) from the management SoC program.
*
* See the testbenches in directory "mprj_counter" for the
* example programs that drive this user project. The three
* testbenches are "io_ports", "la_test1", and "la_test2".
*
*-------------------------------------------------------------
*/
module user_proj_example #(
parameter BITS = 32
)(
`ifdef USE_POWER_PINS
inout vdda1, // User area 1 3.3V supply
inout vdda2, // User area 2 3.3V supply
inout vssa1, // User area 1 analog ground
inout vssa2, // User area 2 analog ground
inout vccd1, // User area 1 1.8V supply
inout vccd2, // User area 2 1.8v supply
inout vssd1, // User area 1 digital ground
inout vssd2, // User area 2 digital ground
`endif
// Wishbone Slave ports (WB MI A)
input wb_clk_i,
input wb_rst_i,
input wbs_stb_i,
input wbs_cyc_i,
input wbs_we_i,
input [3:0] wbs_sel_i,
input [31:0] wbs_dat_i,
input [31:0] wbs_adr_i,
output wbs_ack_o,
output [31:0] wbs_dat_o,
// Logic Analyzer Signals
input [127:0] la_data_in,
output [127:0] la_data_out,
input [127:0] la_oenb,
// IOs
input [`MPRJ_IO_PADS-1:0] io_in,
output [`MPRJ_IO_PADS-1:0] io_out,
output [`MPRJ_IO_PADS-1:0] io_oeb,
// IRQ
output [2:0] irq
);
wire clk;
wire rst;
wire RX_w,TX_w;
wire [`MPRJ_IO_PADS-1:0] io_in;
wire [`MPRJ_IO_PADS-1:0] io_out;
wire [`MPRJ_IO_PADS-1:0] io_oeb;
wire [31:0] rdata;
wire [31:0] wdata;
wire [BITS-1:0] count;
wire valid;
wire [3:0] wstrb;
wire [31:0] la_write;
// WB MI A
assign valid = wbs_cyc_i && wbs_stb_i;
assign wstrb = wbs_sel_i & {4{wbs_we_i}};
assign wbs_dat_o = rdata;
assign wdata = wbs_dat_i;
// IO
assign io_oeb[0] = 1'b1;
assign io_oeb[1] = 1'b0;
assign RX_w = io_in[1];
assign io_out[0] = TX_w;
assign io_oeb[(`MPRJ_IO_PADS-1):2] = {(`MPRJ_IO_PADS-3){rst}};
// IRQ
assign irq = 3'b000; // Unused
// LA
assign la_data_out = {{(127-BITS){1'b0}}, count};
// Assuming LA probes [63:32] are for controlling the count register
assign la_write = ~la_oenb[63:32] & ~{BITS{valid}};
// Assuming LA probes [65:64] are for controlling the count clk & reset
assign clk = wb_clk_i;
assign rst = wb_rst_i;
/*
counter #(
.BITS(BITS)
) counter(
.clk(clk),
.reset(rst),
.ready(wbs_ack_o),
.valid(valid),
.rdata(rdata),
.wdata(wbs_dat_i),
.wstrb(wstrb),
.la_write(la_write),
.la_input(la_data_in[63:32]),
.count(count)
);
*/
UART_top top(
.system_clk(clk),
.system_rst(rst),
.RX(RX_w),
.TX(TX_w)
);
endmodule
module UART_top(
input system_clk ,
input system_rst ,
input RX ,
output TX
);
wire busy ;
wire [7:0]data_o_w;
wire data_en_o_w;
wire corrupted_w;
UART_transmitter uut(system_clk,system_rst,data_o_w,data_en_o_w,TX,busy);
UART_receiver uut2 (system_clk,system_rst,RX,data_o_w,data_en_o_w,corrupted_w);
endmodule
module UART_transmitter(
input system_clk ,
input system_rst ,
input [7:0] data ,
input data_en ,
output reg TX=1 ,
output reg bitti=0
);
reg [20:0]cycles_per_bit=434;
reg mesgul=1'b0;
reg [3:0] index=4'b0;
integer num_of_cycles=0;
wire parity_bit = data[7]^data[6]^data[5]^data[4]^data[3]^data[2]^data[1]^data[0];
wire [10:0] frame= {1'b1,parity_bit,data,1'b0};
always @ (posedge system_clk ) begin
if(!system_rst)begin
if(data_en && !mesgul && index==0) begin
if(num_of_cycles==cycles_per_bit-1)begin
num_of_cycles<=0;
bitti <= 1'b0;
mesgul <= 1'b1;
TX <= frame[index] ;
index <= index + 1;
end
else begin
num_of_cycles<= num_of_cycles+1;
bitti <= 1'b0;
mesgul <= 1'b1;
TX <= frame[index] ;
end
end
if(mesgul)begin
if (index < 12) begin
if(num_of_cycles==cycles_per_bit-1)begin
num_of_cycles<=0;
if(index==11)begin
index <= 1'b0;
bitti <= 1'b1;
mesgul <= 1'b0;
TX <= 1'b1;
end
else begin
TX <= frame[index] ;
index <= index + 1;
end
end
else begin
if(index==11)begin
index <= 1'b0;
bitti <= 1'b1;
mesgul <= 1'b0;
TX <= 1'b1;
num_of_cycles<= 0;
end
else begin
TX <= frame[index] ;
num_of_cycles<= num_of_cycles+1;
end
end
end
end
end
else if ( system_rst) begin
bitti <= 1'b0;
mesgul <= 1'b0;
TX <= 1'b1;
index <= 4'd0;
num_of_cycles<=0;
end
end
endmodule
module UART_receiver(
input system_clk ,
input system_rst ,
input RX ,
output reg [7:0] data ,
output reg data_en=0,
output reg corrupted
);
reg[20:0] cycles_per_bit =434;
reg [3:0] index=4'd0;
integer num_of_cycles=0;
reg mesgul=0;
reg parity_bit=0;
reg stop_bit=0;
always @(posedge system_clk) begin
if( system_rst )begin
data_en<=0;
index<=4'd0;
num_of_cycles<=0;
mesgul<=0;
end
else if ( !system_rst ) begin
if(!mesgul && RX==0&& num_of_cycles ==(cycles_per_bit-1)/2)begin
data_en<=0;
mesgul <=1;
num_of_cycles <= num_of_cycles+1;
end
else if(mesgul&& num_of_cycles ==(cycles_per_bit-1)/2 ) begin
if(index <8) begin
data[index] <= RX;
index <= index+1;
end
if(index==8)begin
index <= index+1;
parity_bit <= RX;
end
if(index==9) begin
stop_bit <= RX;
index <= index+1;
if(parity_bit==(data[7]^data[6]^data[5]^data[4]^data[3]^data[2]^data[1]^data[0]))begin
corrupted <=0;
end
else begin
corrupted <=1;
end
end
if(index==10)begin
index <=0;
mesgul<=0;
data_en<=1;
end
end
end
if (!system_rst && num_of_cycles<cycles_per_bit-1) begin
num_of_cycles <= num_of_cycles+1;
end
else if (!system_rst) begin
num_of_cycles <=0;
end
end
endmodule
/*
module counter #(
parameter BITS = 32
)(
input clk,
input reset,
input valid,
input [3:0] wstrb,
input [BITS-1:0] wdata,
input [BITS-1:0] la_write,
input [BITS-1:0] la_input,
output ready,
output [BITS-1:0] rdata,
output [BITS-1:0] count
);
reg ready;
reg [BITS-1:0] count;
reg [BITS-1:0] rdata;
always @(posedge clk) begin
if (reset) begin
count <= 0;
ready <= 0;
end else begin
ready <= 1'b0;
if (~|la_write) begin
count <= count + 1;
end
if (valid && !ready) begin
ready <= 1'b1;
rdata <= count;
if (wstrb[0]) count[7:0] <= wdata[7:0];
if (wstrb[1]) count[15:8] <= wdata[15:8];
if (wstrb[2]) count[23:16] <= wdata[23:16];
if (wstrb[3]) count[31:24] <= wdata[31:24];
end else if (|la_write) begin
count <= la_write & la_input;
end
end
end
endmodule
*/
`default_nettype wire