2016-03-23 7 views
0

2 farklı 7 segment göstergesinde 3 fpga bassında 4-bit sayıcı göstermeye çalışıyorum. Basys 3 fpga, farklı anotlu 4 farklı 7 segment ekrana sahip, ancak ekran ışığını aydınlatmak için ortak katotlarla geliyor. Ekranlarda iki farklı değer gösteremiyorum.4-bit 0 - 15 arası sayaç görüntülemek için 2 farklı 7 segment ekranı kullanma

Sonunda, 4 farklı 7 ekran parçasını kullanarak 0000 ila 9999 sayacı oluşturmam gerekiyor, bu yüzden onaltılık sayımı kullanmak benim için çalışmaz.

Lütfen

Yardım edin.

Kodu:

module counter(

input press, 
input clock, 
output reg [6:0] seg, 
output reg [3:0] an 
); 

reg [3:0]count = 4'b0000; 
wire pulse; 

// Don't need to worry about the exact code in this function call 

singlepulse sp(clock,press,pulse); 

always @(posedge pulse) begin 
count <= count + 1; 
end 

integer k; 
reg [3:0]ones=0; 
reg [3:0]tenths=0; 

//convert binary to BCD 

always @(count) 
    begin 

    ones = 4'd0; 
    tenths = 4'd0; 

    for (k=4; k>=0; k=k-1) begin 
    if(tenths>=5) tenths=tenths+3; 
    if(ones>=5) ones=ones+3; 
    tenths=tenths<<1; 
    tenths[0]=ones[3]; 
    ones=ones<<1; 
    ones[0]=count[k]; 
    end  

end 

always @(posedge clock) begin 

// Here is the problem, if I let an=4'b1110 only the first display will light up 
// If I let an=4'b1100 both display light shows the same number instead of the correct number 
// How should I make it such that both displays shows different number at the same time? 
case (ones) 
0 : seg=7'b100_0000; 
1 : seg=7'b111_1001; 
2 : seg=7'b010_0100; 
3 : seg=7'b011_0000; 
4 : seg=7'b001_1001; 
5 : seg=7'b001_0010; 
6 : seg=7'b000_0010; 
7 : seg=7'b111_1000; 
8 : seg=7'b000_0000; 
9 : seg=7'b001_0000; 
endcase 

case (tenths) 
0 : seg=7'b100_0000; 
1 : seg=7'b111_1001; 
2 : seg=7'b010_0100; 
3 : seg=7'b011_0000; 
4 : seg=7'b001_1001; 
5 : seg=7'b001_0010; 
6 : seg=7'b000_0010; 
7 : seg=7'b111_1000; 
8 : seg=7'b000_0000; 
9 : seg=7'b001_0000; 
endcase 

end 

endmodule // counter 

Teşekkür

+0

Bir an önce hata, farklı durum ifadeleri aracılığıyla tek bir blokta iki farklı "seg" değerine ihtiyacınız olmasıdır. Mevcut kod, 'seg' * * değerlerinin üzerine yazacaktır. İki çıkış değişkeni kullanın ya da "konum" için "seg [0]" tuşunu kullanın ve onlar için "seg [1]" tuşunu kullanın. Bu, hata sebebi olabilir veya olmayabilir, ancak kesinlikle mantıklı bir hatadır. – sharvil111

+0

Hatanın farkındayım, ancak üsler 3 yalnızca katotlar için 7 girişe ve anot için 4 farklı 7 segment göstergesini kontrol etmek için 4 girişe sahiptir. Sadece bir ay boyunca verilogu öğrendim ve problemi çözmek için başka daha iyi yollar bilmiyorum. – David

cevap

0

Bu yerine bir Verilog sorundan çok, bir mantık tasarım problemi gibi görünüyor. Ben senin çözümün zaman çoklayıcı olduğunu düşünüyorum. Diğer bir deyişle, her 7 segmentli ekranı kısa bir süre boyunca, yeterince hızlı bir şekilde sürmeniz gerekir, böylece göz bunu algılayamaz. Her an çıkışı için seg çıkışlarını farklı şekilde çalıştıran bir devreye ihtiyacınız olacak ve bunu çok hızlı bir şekilde döndürecektir.