FPGA Ödevi

Başlatan Mucit23, 07 Aralık 2015, 09:40:18

Mucit23

Hocam yok anlayamadım nerde hata yaptığımı.

Verdiğiniz linkte modüller bu şekilde kullanılmış

SingleStage s0( .a( a[0] ), .b( b[0]), .cin( cin ), .s( sum[0]), .cout( ripple0 ) );

Buradan anlıyorumki 4 bitlik A değişkeninin 0. bitini kullanmak için .a( a[0] ) şeklinde bir kullanım olacak. Orada yazılanlara bakarak kendi koduma uyguladım

        fulladd stage1(Cin, .A(A[0]), .B(B[0]), .Q(Q[0]), .Carry(Carry[0]));
        fulladd stage2(.Carry(Carry[0], .A(A[1]), .B(B[1]), .Q(Q[1]), .Carry(Carry[1]));
        fulladd stage3(.Carry(Carry[1], .A(A[2]), .B(B[2]), .Q(Q[2]), .Carry(Carry[2]));
        fulladd stage4(.Carry(Carry[2], .A(A[3]), .B(B[3]), .Q(Q[3]), .Q(Q[4]));

Hata sayısı çok arttı.
ERROR:HDLCompilers:26 - "Project.v" line 38 unexpected token: 'fulladd'
ERROR:HDLCompilers:26 - "Project.v" line 38 unexpected token: '.'
ERROR:HDLCompilers:26 - "Project.v" line 38 expecting ')', found ']'
ERROR:HDLCompilers:26 - "Project.v" line 38 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 38 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 38 expecting ';', found ')'
ERROR:HDLCompilers:26 - "Project.v" line 39 unexpected token: 'fulladd'
ERROR:HDLCompilers:26 - "Project.v" line 39 unexpected token: '.'
ERROR:HDLCompilers:26 - "Project.v" line 39 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 39 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 39 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 39 expecting ';', found ')'
ERROR:HDLCompilers:26 - "Project.v" line 40 unexpected token: 'fulladd'
ERROR:HDLCompilers:26 - "Project.v" line 40 unexpected token: '.'
ERROR:HDLCompilers:26 - "Project.v" line 40 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 40 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 40 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 40 expecting ';', found ')'
ERROR:HDLCompilers:26 - "Project.v" line 41 unexpected token: 'fulladd'
ERROR:HDLCompilers:26 - "Project.v" line 41 unexpected token: '.'
ERROR:HDLCompilers:26 - "Project.v" line 41 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 41 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 41 expecting ';', found ','
ERROR:HDLCompilers:26 - "Project.v" line 41 expecting ';', found ')'


Yazım hataları var diyor ama nerde hata yapıyorum onu bulamıyorum.
Yardım edin lütfen. İyice canım sıkılmaya başladı.

C'ye kurban olayım ben.

alicavuslu

Verilog olması şart mı? VHDL ile devam etseniz nasil olur?

Mucit23

Hocam öyle isteniyor. C varken derste assembly anlatmak gibi birşey herhalde.

Kendi FPGA kartımı alacam uygun bir vakitte. VHDL birazdaha kolay anladığım kadarıyla. İleride illaki VHDL kullanırım. Fakat şimdilik verilog ile işimi halletmem lazım.

Sorunum şudur. Bir modül tanımlıyorum ama onu kullanamıyorum.

alicavuslu

#18
4 bitlik toplayıcı kodu aşağıda mevcut. Çalışmaktadır...

module adder4(A,B,Cin,SUM,Cout);
input [3:0] A,B;
input Cin;
output [3:0] SUM;
output Cout;
assign {Cout,SUM}=A+B+Cin;
endmodule

mesaj birleştirme:: 09 Aralık 2015, 15:39:35

Diğer şekilde ise asagıdadır...

module half_adder(x,y,s,c);
input x,y;
output s,c;
xor(s,x,y);
and(c,x,y);
endmodule

module full_adder(x,y,cin,s,cout);
input x,y,cin;
output s,cout;
wire s1,c1,c2;
half_adder ha1(x,y,s1,c1);
half_adder ha2(cin,s1,s,c2);
or(cout,c1,c2);
endmodule

module four_bit_adder(x,y,cin,sum,cout);
input [3:0] x,y;
input cin;
output[3:0] sum;
output cout;
wire c1,c2,c3;
//fourbit adder body
full_adder fa1(x[0],y[0],cin,sum[0],c1);
full_adder fa2(x[1],y[1],c1,sum[1],c2);
full_adder fa3(x[2],y[2],c2,sum[2],c3);
full_adder fa4(x[3],y[3],c3,sum[3],cout);
endmodule

mesaj birleştirme:: 09 Aralık 2015, 15:49:03

Sentaks olarak C'ye yakınlığından dolayı Verilog yazılmcıların daha çok tercih ettiği bir dildir. Benim önerim FPGA programlayacaklar için VHDL'dir.

Mucit23

İyi akşamlar

Bir soru sormak isterim. A ve B 4 bitlik iki sayı olsun. Verilog ile A-B işleminin sonucu negatif ise Sonuç nasıl olur?

Q=A-B; Şeklinde bir işlem yapmak doğrumudur. Yoksa A-B işlemini 2'ye tümleyen mantığıylamı yapmak gerekir?

alicavuslu

#20
signed veri tipini kullanırsan olabilir...

Mucit23

#21
Dün hocamla konuştum bana dediki 2 Adet 4 bitlik sayı doğrudan toplanabiliyor
Sonrasında test dosyası oluşturdum ve A=15, B=4 ve PB0=1 yaparak simüle ettim. PB0=1 olduğu için toplama yapılması lazım. Ama çalışmadı.
Q değeri daima 1 oluyor


Ali bey sebebi nedir sizce?

alicavuslu

Kod aşağıdaki gibi olacak...

module adder4(A,B,Cin,SUM,Cout);
input [3:0] A,B;
input Cin;
output [4:0] SUM;
output Cout;
assign {SUM}=A+B+Cin;
endmodule

Çıktısı aşağıdaki gibidir... 15 signed oldugunda -1, Biz iki sonuç signedda ise 4 bit. 1-0100 şeklinde SUM değeri elde edeceksin. Bu değer toplam olarak 20'dir. Unsgined toplamı. 0100 ise signed toplamı şeklindedir.



MC_Skywalker

konuya şöyle dahil olsam

VHDL olarak yazarsak her bit için aşağıdaki gibi düşüneceğiz

Yout0 <= A0 xor B0 xor Cin0
Cout <= A0 and B0 or Cin0


alicavuslu

VHDL olarak baktıgımızda aslında SIGNED ve UNSIGNED kütüphanesinden hangisini kullanacak ona karar vermesi gerekiyor...

Mucit23

Hocam assign komutunu always içerisine aldığımda hata veriyor.  Ben if bloklarına bağlı bir işlem yapmak istedim. Ama o şekilde hata veriyor. Dedigim şekilde if bloklarına bağlı işlem nasıl yaparım?

Sizin dediğiniz şekilde yaptım ama Q değeri simülasyon sonucunda Q=zzzz1 oldu. Anlayamadım henüz. 

Assign komutunu hangi şartlar kullanabiliyoruz anlayabilmis değilim.  Kafamiza göre istediğimiz yerde kullanamıyoruz sanırım.

alicavuslu

Kodda bu değişkenleri ne amaçla kullanmayı düşündün?

(PB0 or PB1 or PB2 or PB3)

Mucit23

Hocam kart uzerinde anahtarlar var.  PB0 PB1 PB2 ve PB3 Bunlar için.  Benim amacım bu butonlarla işlem yapmak. 

PB0=1 ise toplama yapacam. PB1 = 1 ise çıkarma yapacam vs. Bir türlü doğru düzgün yapamadım bunu.

alicavuslu

Bunun için case yapısını kullanman daha iyi olur. Aşağıda örnek bir çalışma var.  Kodda senin PB ile tanımladıklarını 2 bitlik c_log_arith değerinden kontrol ediyor. Değerlerre göre sonuc üretiyor.

module alu (op,a,b,c_log_arith);
  output reg [3:0] op;     //output of alu
   input [3:0]     a,b;    //inputs to alu
   input [1:0] c_log_arith;//control signal for logical/arithmatic operation
always @(*)
begin
case (c_log_arith)
   2'b00 : begin op = a + b; $display("Addition operation"); end
   2'b01 : begin op = a - b; $display("Subtraction operation"); end
   2'b10 : begin op = ~(a & b); $display("logical NAND operation"); end
   2'b11 : begin op = a ^ b; $display("Logical XOR operation"); end
   default:op = 4'bXXXX;
endcase
end
endmodule

Mucit23

Bu xilinx ise suite windows 10'da düzgün çalışmıyor herhalde. Çünkü en basitinden eski yaptığım and kapısı bile düzgün çalışmıyor. Şimdi kaldırıyorum bilgisayarımdan tekrar kurmayı deneyeceğim.