Verilog计划的指示: 此作业的目的是让您学习编程一个Verilog模块,该模块在输入时以正确的顺序识别您的全名的前五个字母,并通过显示“匹配”(为一个)来指示。否则,它将显示匹配为零。
•您姓名的前5个字母(由您的姓名,空格和您的姓氏组成),逐个字符区分大小写(仅限您给定和家人的第一个字母)名字是大写的)。
•逐位纹波存储器模块可用于“记忆”单个位序列(作为一元模式),但不能用于字符中的多个位。但是,如果一个字符中的每个位位置都要由一个纹波存储器模块存储,并且每个字符中的七个位中的每一个都有七个存储器模块;因此可以记忆一系列字符。
•由于每个存储器模块保持由字符中相同位位置的到达位组成的一元模式,并且如果一元模式与位序列匹配(来自相同的位位置);它可以宣布匹配。并且当所有存储器模块共同指示时,已经识别出字符串。
我使用了识别'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