Verilog顺序逻辑:模式识别器:name-recog.v

时间:2017-07-05 21:05:36

标签: logic verilog sequential

Verilog计划的指示: 此作业的目的是让您学习编程一个Verilog模块,该模块在输入时以正确的顺序识别您的全名的前五个字母,并通过显示“匹配”(为一个)来指示。否则,它将显示匹配为零。

您姓名的前5个字母(由您的姓名,空格和您的姓氏组成),逐个字符区分大小写(仅限您给定和家人的第一个字母)名字是大写的)。

•逐位纹波存储器模块可用于“记忆”单个位序列(作为一元模式),但不能用于字符中的多个位。但是,如果一个字符中的每个位位置都要由一个纹波存储器模块存储,并且每个字符中的七个位中的每一个都有七个存储器模块;因此可以记忆一系列字符。

•由于每个存储器模块保持由字符中相同位位置的到达位组成的一元模式,并且如果一元模式与位序列匹配(来自相同的位位置);它可以宣布匹配。并且当所有存储器模块共同指示时,已经识别出字符串。

Bit Sequence Recognizer

我使用了识别'123'的基线代码并开始更改它以接受名称。我理解RecognizerMod是需要进行大部分更改的地方,但不理解这一部分:

RippleMod Ripple6(clk, ascii[6], Q[6]);
...

nor(submatch[6], Q[6][2], Q[6][1], Q[6][0]);
...
not(invQ12, Q[1][2]);
and(submatch[1], invQ12, Q[1][1], Q[1][0]);
...

and(match, submatch[6], ... submatch[0]);

以下是我目前的代码。

module TestMod;
  parameter STDIN = 32'h8000_0000; // keyboard-input file-handle address

  reg clk;
  reg [6:0] str [1:6];  // to what's to be entered
  wire match;           // to be set 1 when matched
  reg [6:0] ascii;      // each input letter is an ASCII bitmap

  RecognizerMod my_recognizer(clk, ascii, match);

  initial begin
    $display("Enter the first 5 digits of your name: ");
    str[1] = $fgetc(STDIN);  // 1st letter
    str[2] = $fgetc(STDIN);  // 2nd letter
    str[3] = $fgetc(STDIN);  // 3rd letter
    str[4] = $fgetc(STDIN);  // 4th letter
str[5] = $fgetc(STDIN);  // 5th letter
str[6] = $fgetc(STDIN);  // ENTER key

    $display("Time clk    ascii       match");
    $monitor("%4d   %b    %c %b   %b", $time, clk, ascii, ascii, match);

    clk = 0;

    ascii = str[1];
    #1 clk = 1; #1 clk = 0;

    ascii = str[2];
    #1 clk = 1; #1 clk = 0;

    ascii = str[3];
    #1 clk = 1; #1 clk = 0;

ascii = str[4];
    #1 clk = 1; #1 clk = 0;

ascii = str[5];
    #1 clk = 1; #1 clk = 0;
  end
endmodule

module RecognizerMod(clk, ascii, match);
  input clk;
  input [6:0] ascii;
  output match;

  wire [0:2] Q [6:0];   // 3-input sequence, 7 bits each
  wire [6:0] submatch;  // all bits matched (7 3-bit sequences)

  wire invQ12, invQ01;

  //         654 3210   Q
  //     hex binary
  // '1' 31  011 0001 < q2
  // '2' 32  011 0010 < q1
  // '3' 33  011 0011 < q0

  RippleMod Ripple6(clk, ascii[6], Q[6]);
  ...

  nor(submatch[6], Q[6][2], Q[6][1], Q[6][0]);
  ...
  not(invQ12, Q[1][2]);
  and(submatch[1], invQ12, Q[1][1], Q[1][0]);
  ...

  and(match, submatch[6], ... submatch[0]);

//always @(clk) $display("is %b %b %b %b %b %b %b %b %b",
//   match, submatch, Q[6], Q[5], Q[4], Q[3], Q[2], Q[1], Q[0]);

endmodule

module RippleMod(clk, ascii_bit, q);
  input clk, ascii_bit;
  output [0:2] q;

  reg [0:2] q;          // flipflops

  always @(posedge clk) begin
     q[0] <= ascii_bit;
     q[1] <= q[0];
     q[2] <= q[1];
  end

  initial q = 3'bxxx;
endmodule

0 个答案:

没有答案