Клавиатура 4X4 на Spartan6 FPGA

Я застрял на этом некоторое время. Для своего проекта я пытаюсь сделать цифровой замок с вводом с клавиатуры. У меня клавиатура 4X4, но я использую только 3 колонки. В настоящее время я просто пытаюсь заставить клавиатуру работать правильно. Когда я скомпилирую его, мой случай по умолчанию работает, но ничего не изменится, когда я нажму любую из кнопок.

`timescale 1ns / 1ps

module KeypadShit(input  M_CLOCK,     // FPGA clock
        input ROW1, ROW2, ROW3, ROW4, COL1, COL2, COL3, 
       output [3:0] IO_SSEGD, // IO Board Seven Segment Digits          
       output reg [7:0] IO_SSEG,  // 7=dp, 6=g, 5=f,4=e, 3=d,2=c,1=b, 0=a
       output IO_SSEG_COL);   // Seven segment column

assign IO_SSEGD = 4'b0111;      
assign IO_SSEG_COL = 1; // deactivate the column displays

reg [4:0] state;
reg R1, R2, R3, R4, C1, C2, C3;

initial
begin
R1 = 1;
R2 = 1;
R3 = 1;
R4 = 1;
C1 = 1;
C2 = 1;
C3 = 1;
end

always @* 
begin
R1 = ROW1;
R2 = ROW2;
R3 = ROW3;
R4 = ROW4;
C1 = COL1;
C2 = COL2;
C3 = COL3;
end


//////keypad reads 0s so set all to default 1, and send 0's to row and read columns
always @(*)
begin
if( (R1==0) && (C1==0))
state <= 1; //1
else if( (R1==0) && (C2==0))
state <= 2; //2
else if( (R1==0) && (C3==0))
state <= 3;//3
//////////
else if( (R2==0) && (C1==0))
state <= 4; //4
else if( (R2==0) && (C2==0))
state <= 5;//5
else if( (R2==0) && (C3==0))
state <= 6;//6
/////////////
else if( (R3==0) && (C1==0))
state <= 7;//7
else if( (R3==0) && (C2==0))
state <= 8;//8
else if( (R3==0) && (C3==0))
state <= 9;//9
////////////
else if( (R4==0) && (C2==0))
state <= 0;//0
//////////////
else state <= 15;
end

always @(state)
begin

case (state)
0:IO_SSEG = 7'b1000000;//0 
1:IO_SSEG = 7'b1111001;//1
2:IO_SSEG = 7'b0100100;//2
3:IO_SSEG = 7'b0110000;//3
4:IO_SSEG = 7'b0011001;//4
5:IO_SSEG = 7'b0010010;//5
6:IO_SSEG = 7'b0000010;//6
7:IO_SSEG = 7'b1111000;//7
8:IO_SSEG = 7'b0000000;//8
9:IO_SSEG = 7'b0011000;//9
15:IO_SSEG = 7'b0101010;//default random light sequence

endcase
end


endmodule

и мой файл .ucf:

# IO Board Display Segment a
NET "IO_SSEG<0>" LOC = P102; #a
NET "IO_SSEG<1>" LOC = P105; #b
NET "IO_SSEG<2>" LOC = P101; #c
NET "IO_SSEG<3>" LOC = P97;  #d
NET "IO_SSEG<4>" LOC = P98;  #e
NET "IO_SSEG<5>" LOC = P100; #f
NET "IO_SSEG<6>" LOC = P104; #g
#NET    "IO_SSEG<7>" LOC = P99;  #decimal point

#====================================================
# IO Board Seven Segment Digits
#NET    "IO_SSEGD<0>"   LOC = P92; 
#NET    "IO_SSEGD<1>"   LOC = P93;
#NET    "IO_SSEGD<2>"   LOC = P84;
#NET    "IO_SSEGD<3>"   LOC = P88;
#====================================================
# IO Board Seven Segment Display Colon
NET "IO_SSEG_COL"   LOC = P87; 
#====================================================
# IO Board Pushbutton Switches 
# Pushbutton Determines which Digit to Enable
#NET    "IO_PB<3>"      LOC = P80   |  PULLUP; 
#NET    "IO_PB<2>"      LOC = P81   |  PULLUP; 
#NET    "IO_PB<1>"      LOC = P78   |  PULLUP;
#NET    "IO_PB<0>"      LOC = P79   |  PULLUP;

#====================================================
# IO Board Dip Switchs
#NET    "IO_DSW<7>"     LOC = P55   |  PULLUP; 
#NET    "IO_DSW<6>"     LOC = P56   |  PULLUP;
#NET    "IO_DSW<5>"     LOC = P57   |  PULLUP;
#NET    "IO_DSW<4>"     LOC = P58   |  PULLUP;
#NET    "IO_DSW<3>"     LOC = P61   |  PULLUP;
#NET    "IO_DSW<2>"     LOC = P62   |  PULLUP;
#NET    "IO_DSW<1>"     LOC = P66   |  PULLUP;
#NET    "IO_DSW<0>"     LOC = P67   |  PULLUP;
#====================================================
# Clock signal 
NET "M_CLOCK" LOC = P123;

NET "ROW1" LOC = P118; // 0N0
NET "ROW2" LOC = P120; // 0N1
NET "ROW3" LOC = P126; // 0N2
NET "ROW4" LOC = P131; // 0N3
NET "COL1" LOC = P133   |  PULLUP; // 0N4 
NET "COL2" LOC = P137   |  PULLUP; // 0N5
NET "COL3" LOC = P139   |  PULLUP; // 0N6

Я использую файл .ucf из другого моего проекта, поэтому так много комментариев.

В моей голове мой код работает следующим образом:

R1-R4 и C1-C3 — это переменные, которые начинаются с 1, потому что клавиатура ищет закороченные контакты. Эти переменные установлены равными ROW1-4 и COL1-3, потому что я не могу установить входы так, чтобы они имели начальные значения. Затем у меня есть всегда блок, который проверяет, какие контакты закорочены, и устанавливает состояние в соответствии с тем, какая кнопка должна быть.

Затем конечный автомат проверяет состояние и отображает число, нажатое на 7-й сегмент на моей плате ввода-вывода.

В моем файле ucf у меня есть некоторые настройки для подтягиваний, так как мой профессор сказал мне, что это необходимо, но я понятия не имею, что это на самом деле меняет. В какой-то момент он упомянул, что некоторые строки или столбцы должны быть установлены в качестве входных данных, а некоторые — в качестве выходных, но опять же я понятия не имею, что делать с этой информацией, и я не могу найти ничего, что помогло бы мне обернуть голову. вокруг этого.

Заранее благодарю за любую помощь.

Коди

Кто-нибудь может понять, что я делаю неправильно?


person Cody Friszell    schedule 08.12.2016    source источник


Ответы (2)


Конечный автомат никогда не может изменить свое состояние, потому что отсутствует тактовый сигнал.

См. пример: https://www.altera.com/support/support-resources/design-examples/design-software/verilog/ver_statem.html

...
always @(posedge clk //ATTENTION
if ...
  state <= 1
else
  state <=2
...
person strannyi    schedule 16.12.2016

input M_CLOCK, // часы ПЛИС

Не используется в вашем дизайне!!!!!

person strannyi    schedule 16.12.2016
comment
Использование немного большего количества прозы и меньшего количества восклицательных знаков значительно улучшит ответ. - person decltype_auto; 16.12.2016