1

我是 Verilog 的新手,我正在尝试创建我的第一个程序,当按下键盘上的键时应该显示一些东西。我想使用 Verilog 课程手册中的示例代码,但我在引脚分配方面遇到了一些问题(我使用的是 Altera 的 DE2-70)。

  1. 为什么我有input ReadKB;,而模块定义中没有这样的东西?
  2. 我知道哪些引脚应该分配给 KBclk 和 KBdata。(PS2_KBCLK PIN_F24 PS/2 Clock和 ( PS2_KBDAT PIN_E24 PS/2 Data) ResetKB 怎么样?

在教科书中没有解释,我真的很好奇。

代码:

module KeyboardInterface(KBclk, KBdata, ResetKB, SYNclk, ScanRdy, ScanCode, KeyReleased);
input KBclk;
input KBdata; 
input ResetKB;
input ReadKB;
input SYNclk;
output ScanRdy;
output ScanCode; 
output KeyReleased;

    //Generate an internal synchronized clock
    reg Clock;
    always @(posedge SYNclk) Clock = KBclk;

    reg[3:0] BitCount;
    reg StartBitDetected, ScanRdy;
    reg[7:0] ScanCode;


    //Count the number of serial bits and collect data into ScanCode
    always @(posedge Clock) begin
        if(ResetKB) begin
            BitCount=0; StartBitDetected =0;
        end else begin
            if(KBdata == 0 && StartBitDetected == 0) begin
                StartBitDetected=1;
                ScanRdy = 0;
            end else if (StartBitDetected) begin
                if(BitCount < 8) begin
                    BitCount = BitCount + 1;
                    ScanCode = {KBdata, ScanCode[7:1]};
                end else begin
                    StartBitDetected = 0;
                    BitCount = 0;
                    ScanRdy = 1;
                end
            end
        end
    end



    reg [1:0] CompletionState;
    wire KeyReleased;

        //keep track of the state of Scan Codes outputted
    always @(posedge SYNclk) begin
        if(ResetKB) CompletionState = 0;

        else case(CompletionState)
            0: if(ScanCode == 8'h70 && ScanRdy == 1) CompletionState =1;
                else CompletionState =0;
            1:  if(ScanRdy == 1) CompletionState =1;
                else CompletionState =2;
            2: if(ScanRdy == 0) CompletionState = 2;
                else CompletionState = 0;
            3: CompletionState = 0;
        endcase
    end

    assign KeyReleased = CompletionState == 3 ? 1 : 0; 

endmodule

谢谢!

4

2 回答 2

1
  1. 这看起来像是一个错字,只需将缺少的线添加到模块定义中即可。
  2. 如果这就是您所要求的,那么您的键盘可能实际上并没有“重置”。如果有的话,我会把它绑在 Altera 上的某个按钮上。
于 2013-01-13T17:21:41.163 回答
1

它只是一个高电平复位信号。您可以将其与按钮连接,然后您可以使用按钮重置 reg 信号、bitcount 和 startbitdetect。

但是你应该注意的一件重要的事情是 reg 信号不能在 always 部分中使用“=”,它应该是“<=”。这就是阻塞赋值和非阻塞赋值的区别,你应该多加注意。祝你好运。:-)

于 2013-01-12T02:43:24.320 回答