PSoC üzerinde verilog ile komponent oluşturan varmı?

Başlatan Mucit23, 21 Şubat 2017, 17:25:34

Mucit23

Selamlar. Forumda PSoC ile uğraşan herhalde ben dahil bir elin parmaklarını geçmez.  :) Ben şuanda yeni kompoment nasıl oluşturulur ona bakıyorum. Bu konuda uğramış olanlar varsa fikir alışverişinde bulunmak isterim önemli bir konu çünkü.

Yeni komponent oluşturma ile ilgili internette birkaç video var. O videolara bakarak basit kombinezonal lojik devreler içeren komponentler yaptım. Fakat verilog kullanmadım. Doğrudan devre uzerinde şema çizerek yaptım.

Verilog işi baya karışık. Ben şuanda ortak clock hattı kullanan 6 kanal spi modülü tasarlamaya çalışıyorum. Tam olarak resimdeki gibi 


Böyle bir tasarımı verilog ile nasıl yaparım? Fikir verebilecek olan var mı?

furkanyx

Daha önce SPI modülü tasarımı yapmıştım FPGA için verilog ile. Ama tekliydi. O kodu size yönlendirebilirim.

Mucit23

Gerçekten iyi olur. Şuanda tek kanal 8 bit ile yapmaya çalışıyorum. Onu başarırsam gerisi zor olmaz gibi.

okg

merhaba,

https://www.element14.com/community/thread/23736/l/100-projects-in-100-days?displayFullThread=true

linkte verilog ile ilgili örnek dosya yok ancak psoc ile yapılmış 100 adet güzel proje var, belki başka psoc ile uğraşan vardır.
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL

furkanyx

Verilog ile SPI donanım modülü kodunu ekledim hocam

`timescale 1ns / 1ps
// ==============================================================================
// 										  Define Module
// ==============================================================================
module spi_interface(
		send_data,
		begin_transmission,
		slave_select,
		miso,
		clk,
		rst,
		recieved_data,
		end_transmission,
		mosi,
		sclk
);

// ==============================================================================
// 									   Port Declarations
// ==============================================================================
			input [7:0]      send_data;
			input            begin_transmission;
			input            slave_select;
			input            miso;
			input            clk;
			input            rst;
			output [7:0]     recieved_data;
			output           end_transmission;
			output           mosi;
			output           sclk;
   
// ==============================================================================
// 						     Parameters, Registers, and Wires
// ==============================================================================

			reg [7:0]        recieved_data;
			reg              end_transmission;
			reg              mosi;

			parameter [11:0] SPI_CLK_COUNT_MAX = 12'hFFF;
			reg [11:0]       spi_clk_count;
			
			reg              sclk_buffer;
			reg              sclk_previous;
			
			parameter [3:0]  RX_COUNT_MAX = 4'h8;
			reg [3:0]        rx_count;
			
			reg [7:0]        shift_register;
			
			parameter [1:0]  RxTxTYPE_idle = 0,
								  RxTxTYPE_rx_tx = 1,
								  RxTxTYPE_hold = 2;
			reg [1:0]        RxTxSTATE;
   
// ==============================================================================
// 										Implementation
// ==============================================================================

			//---------------------------------------------------
			// 							  FSM
			//---------------------------------------------------
			always @(posedge clk)
			begin: tx_rx_process
				
				begin
					if (rst == 1'b1)
					begin
							// reset halinde
							// master dan slave e bir yapiliyor. sebebi aktarim modunda shift registerdaki 7.bit degerine esit olacagindan
							// reset yiyince idle durumuna sokuyor.
							// alinan datayi ve gonderilecek yer olan shift register i sifirliyor.
						mosi <= 1'b1;
						RxTxSTATE <= RxTxTYPE_idle;
						recieved_data <= {8{1'b0}};
						shift_register <= {8{1'b0}};
					end
					else
						case (RxTxSTATE)

						   // idle
						   // aktarim baslamadigi icin dolasiyla bitmemis oluyor ve end_transmission sifirlaniyor.
						   // akterim baslasin haberi gelince artik durum idle dan rxtx durumuna geciyor.
						   // hic veri alinmadigindan data counter i sifirlaniyor.
						   // shift registera yollanacak data koyuluyor. Gelen data yine bu registera kaydirila kaydirila yaziliyor.
							RxTxTYPE_idle :
								begin
									end_transmission <= 1'b0;
									if (begin_transmission == 1'b1)
									begin
										RxTxSTATE <= RxTxTYPE_rx_tx;
										rx_count <= {4{1'b0}};
										shift_register <= send_data;
									end
								end

						   // rx_tx
							RxTxTYPE_rx_tx : 	// temelde clk un yukselen kenarinda mosi ye data yaziyor.
												// dusen kenarinda miso dan veri okuyor 
												// ve mosi ye yazdiktan sonra miso dan okmadan hemen once shifting islemi yapiyor.
												// rx_xount maksimum degere ulasitiginda iletisimi hold durumuna getiriyor ve aktarim 
												// bitti diye en_transmission flag ini aktif ediyor. artik ldeki data gittigi icin
												// ve gelen data da shift registera yazildigi icin shift register in son durumu bizim icin
												// gelen data olmus oluyor.
								//send bit
								if (rx_count < RX_COUNT_MAX)
								begin
									if (sclk_previous == 1'b1 & sclk_buffer == 1'b0)
										mosi <= shift_register[7];
									//recieve bit
									else if (sclk_previous == 1'b0 & sclk_buffer == 1'b1)
									begin
										shift_register[7:1] <= shift_register[6:0];
										shift_register[0] <= miso;
										rx_count <= rx_count + 1'b1;
									end
								end
								else
								begin
									RxTxSTATE <= RxTxTYPE_hold;
									end_transmission <= 1'b1;
									recieved_data <= shift_register;
								end

						   // hold
						   // bu pozisyona aktarim bittikten sonra gecilir. 
						   // yeni bir aktarim olmadigindan end_transmission sifirlanir.
						   // slave secici eger aktif olursa mosi ilk konuma cekilir ve aktarim modu idle olur yani haberlesme olmaz.
						   // 	cunku data yollanmasi icin ss sifira cekilmelidir.
						   // aktarim baslamissa yeni durum aktarim modu olur.
						   // aktarim moduna gecerken rx_count sifirlanir data yollanmadigi icin henuz.
						   // shift registera yollacak data koyulur.
							RxTxTYPE_hold :
								begin
									end_transmission <= 1'b0;
									if (slave_select == 1'b1)
									begin
										mosi <= 1'b1;
										RxTxSTATE <= RxTxTYPE_idle;
									end
									else if (begin_transmission == 1'b1)
									begin
										RxTxSTATE <= RxTxTYPE_rx_tx;
										rx_count <= {4{1'b0}};
										shift_register <= send_data;
									end
								end
						endcase
				end
			end
			
			
			//---------------------------------------------------
			// 						Serial Clock
			//---------------------------------------------------
			always @(posedge clk)
			begin: spi_clk_generation
				
				begin
					if (rst == 1'b1)
					begin
						sclk_previous <= 1'b1;					// reset halinde clock polaritesini high level yap
						sclk_buffer <= 1'b1;					// polarite oncesinde high olarak dusundugunden buffer da high oluyor
						spi_clk_count <= {12{1'b0}};			// reset durumunda oldugundan clock calismadigi icin counter sifirlaniyor
					end
					
					else if (RxTxSTATE == RxTxTYPE_rx_tx)		// haberlesme modunda mi diye kontrol ediyor
					begin
						if (spi_clk_count == SPI_CLK_COUNT_MAX)
						begin
							sclk_buffer <= (~sclk_buffer); // spi clk max degere ulastiysa buffer durumunu degistir
							spi_clk_count <= {12{1'b0}};   // spi clk max degere ulastiysa counter i sifirlar
						end
						else
						begin
							sclk_previous <= sclk_buffer;    // spi clock un onceki degerini tutuyor. 
							spi_clk_count <= spi_clk_count + 1'b1;	// clock sayicisi bir arttiriliyor.
						end
					end
					else
						sclk_previous <= 1'b1; 	// baslangic spi clk durumu. clock fazi high level yani
				end
			end
			
			// Assign serial clock output
			assign sclk = sclk_previous; 		// master clk uretiliyor.
   
endmodule