AlexBel off Igor_t on
Цитата Сообщение от ewgeny7 Посмотреть сообщение
AlexBel, ткни пжалуста носом в HDL-SPI какойнить попроще для фкуривания
только это Игорь ))))
нечто мудренное , если склероз неизменяет то это готовый модуль для работы с флешой типа 25хх
Код:
module spi
(
input				clk,

input				start,
input				wr,
input				wr_en,
output	reg			done,

input		[7:0]	spi_command,
input		[15:0]	spi_addres,
output	reg	[7:0]	spi_data_out,
input		[7:0]	spi_data_in,

output	reg			spi_clk,
output	reg			spi_cs,
output	reg			spi_di,
input				spi_do

);

initial	done			=	0;
initial	spi_data_out	=	8'h00;
initial	spi_clk			=	0;
initial	spi_cs			=	0;
initial	spi_di			=	0;

reg			wr_en_reg;
reg			wr_reg;
reg	[7:0]	spi_command_reg;
reg	[15:0]	spi_addres_reg;
reg	[7:0]	spi_data_in_reg;

reg	[3:0]	divider;
reg [1:0]	mode;
reg [3:0]	count_addr;
reg [2:0]	count_data;
reg	[1:0]	delay_done;

always@ (posedge clk)
begin
if (start == 1'b1) 
	begin
		if (divider < 4'd12 ) 	
			begin
				divider <= divider + 1'b1;
				if (divider == 4'd6) 	
					begin 
						if (spi_clk == 1'b1)
							begin
								if (mode == 2'd0)
									begin
										count_data <= count_data + 1'b1;
										if(count_data == 3'd7)										
											begin
												if (wr_en_reg == 0)
													begin
														mode <= mode + 1'b1;
													end
												else
													begin
														mode <=  2'd3;
													end
											end
									end
								if (mode == 2'd1)	
									begin
										count_addr <= count_addr + 1'b1;
										if(count_addr == 4'd15)
											begin
												mode <= mode + 1'b1;
											end
									end
								if (mode == 2'd2)
									begin
										count_data <= count_data + 1'b1;
										if(count_data == 3'd7)	
											begin
												mode <= mode + 1'b1;
											end
										if (wr_reg == 1'b0)
											begin
												if (spi_clk == 1'b1) 
													begin
														spi_data_out[~count_data] <= spi_do;
													end
											end
									end
							end	
						else
							begin
								if (mode == 2'd3) 
									begin
										spi_cs <= 1'b1;
										spi_di <= 1'b0;
										delay_done <=  delay_done + 1'b1;
									end
								if(delay_done == 2'b11)	done	<= 1'b1;
							end
					end
			end
		else
			begin
				divider <= 4'd0;
				if (spi_cs == 1'b0)
					begin
						spi_clk <= ~spi_clk;
					end
			end
		if (mode == 2'd0)
			begin
				spi_di <= spi_command_reg[~count_data];
				spi_cs <= 0;
			end
		if (mode == 2'd1)
			begin
				spi_di <= spi_addres_reg[~count_addr];
			end	
		if (mode == 2'd2)
			begin
				if (wr_reg == 1'b1)
					begin
						spi_di	<= spi_data_in_reg[~count_data];
					end
				else
					begin
						spi_di <= 1'b0;
					end
			end
	end
else
	begin
	wr_en_reg		<=	wr_en;
	divider			<=	4'd0;	
	count_addr		<=	4'd0;
	count_data		<=	3'd0;
	mode			<=	2'd0;
	wr_reg			<=	wr;
	delay_done		<=	2'b00;
	done			<=	1'b0;	
	spi_command_reg	<=	spi_command;
	spi_addres_reg	<=	spi_addres;
	spi_data_in_reg	<=	spi_data_in;
	spi_cs			<=	1'b1;
	spi_clk			<=	1'b0;
	spi_di			<=	1'b0;
	end
end

endmodule
блин а тег code тут работает ?????

Igor_t off