Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => PSoC Mikrodenetleyici => Konuyu başlatan: Mucit23 - 21 Şubat 2017, 17:25:34

Başlık: PSoC üzerinde verilog ile komponent oluşturan varmı?
Gönderen: Mucit23 - 21 Şubat 2017, 17:25:34
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 
(https://s21.postimg.cc/6l44khfdv/My_Module.jpg) (https://postimg.cc/image/6l44khfdv/)

Böyle bir tasarımı verilog ile nasıl yaparım? Fikir verebilecek olan var mı?
Başlık: Ynt: PSoC üzerinde verilog ile komponent oluşturan varmı?
Gönderen: furkanyx - 21 Şubat 2017, 23:02:46
Daha önce SPI modülü tasarımı yapmıştım FPGA için verilog ile. Ama tekliydi. O kodu size yönlendirebilirim.
Başlık: Ynt: PSoC üzerinde verilog ile komponent oluşturan varmı?
Gönderen: Mucit23 - 22 Şubat 2017, 00:25:56
Gerçekten iyi olur. Şuanda tek kanal 8 bit ile yapmaya çalışıyorum. Onu başarırsam gerisi zor olmaz gibi.
Başlık: Ynt: PSoC üzerinde verilog ile komponent oluşturan varmı?
Gönderen: okg - 22 Şubat 2017, 02:00:02
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.
Başlık: Ynt: PSoC üzerinde verilog ile komponent oluşturan varmı?
Gönderen: furkanyx - 22 Şubat 2017, 14:07:59
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