SPI Using Verilog 1744191828
SPI Using Verilog 1744191828
USING VERILOG
module spi_verilog_master(
input wire clk,
input wire reset,
input wire tx_enable,
output reg mosi,
output reg sclk,
output reg chip_select
);
//state update
always@(posedge clk)begin
if(reset)
state<=idle;
else
state<=next_state;
end
tx_data:
begin
if(bit_count<8)
begin
if(count==7)
begin
bit_count<=bit_count+1;
count<=0;
end
else
count<=count+1;
end
end
tx_end:
begin
bit_count<=0;
count<=count+1;
end
endcase
end
module spi_slave(
input mosi,
input sclk,
input chip_select,
output[7:0] data_out,
output reg done
);
reg[7:0] data=0;
reg[3:0] bit_count=0;
parameter idle=1'b0,sample=1'b1;
reg state;
always@(negedge sclk)begin
case(state)
idle:
begin
done=1'b0;
if(chip_select)
state<=idle;
else
state<=sample;
end
sample:
begin
if(bit_count<8)
begin
data<={data[6:0],mosi};
bit_count<=bit_count+1;
state<=sample;
end
else
begin
state<=idle;
done<=1'b1;
bit_count<=0;
data<=0;
end
end
default: state<=idle;
endcase
end
assign data_out=data;
endmodule
module top_module(
input clk,
input reset,
input tx_enable,
output done,
output[7:0] data_out,
output sclk,
output chip_select,
output mosi
);
spi_verilog_master
spi_m(.clk(clk),.sclk(sclk),.chip_select(chip_select),.tx_enable(tx_enable),.mosi(mosi),.reset(
reset));
spi_slave
spi_s(.sclk(sclk),.chip_select(chip_select),.mosi(mosi),.done(done),.data_out(data_out));
endmodule
module spi_verilog_tb;
reg clk = 0;
reg rst = 0;
reg tx_enable = 0;
wire mosi;
wire chip_select;
wire sclk;
wire done;
wire[7:0] data_out;
initial begin
rst = 1;
repeat(5) @(posedge clk);
rst = 0;
end
initial begin
tx_enable = 0;
repeat(5) @(posedge clk);
tx_enable = 1;
end
endmodule