Q1 vector a和vector b每位不同

a,b都是32位二进制数,a从左往右读,b从右往左读,判断a和b不同的位数。

解题思路:

一道简单的组合逻辑问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module different (
input [31:0] a, b,
output [5:0] count
);
integer i; //用于循环计数
reg [5:0] cnt; //定义一个计数变量
always @(*) begin //组合逻辑
初始化 cnt 为 0
for (i = 31; i >= 0; i = i - 1) begin
遍历 a 和 b 的每一位,如果对应位不同,则计数加 1
end
end
assign count = cnt;
endmodule

Q2 奇偶交替数列

一个数列由01组成,连续的0或者1的个数分别为奇偶,则符合要求,如001110000111符合奇偶交替数列,0011100001110不符合。每个时钟上升沿读入number,如果是奇偶交替数列,则check为1,否则为0。res_n为异步复位信号,低电平有效。

解题思路

检测输入信号的奇偶交替,并输出一个 check 信号。 记录 10 的长度,并计算二者长度的差值。如果差值是偶数,则 check 输出为 0,否则为 1

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
module alternate (
input clk, res_n, number,
output check
);
reg [31:0] onecnt, zerocnt;
reg last_number;//记录上一次的number
reg [31:0] res;//记录交替次数的差值,res为偶数则check为0,否则为1
reg flag;//数列不符合奇偶交替,flag记录为1,check输出始终为0
initial begin
初始化变量,last_number置为2
end
always @(posedge clk or negedge res_n) begin
if (!res_n) begin
变量复位,last_number置为2
end
if (当res为偶数 && 当前number与last_number不同) begin
flag = 1;
end
if (flag为0) begin
case (number)
1: begin
如果last_number为1,onecnt加1,否则onecnt置为1
end
0: begin
如果last_number为0,zerocnt加1,否则zerocnt置为1
end
endcase
end
res = (zerocnt或onecnt为0) ? 0 : (onecnt > zerocnt) ?
(onecnt - zerocnt) : (zerocnt - onecnt);
更新last_number
end

assign check = (res为偶数) ? 0 : 1;
endmodule

Q3 序列匹配

题目描述

{key1:value1, key2:value2, ···,}为符合要求的序列集合,其中key只由大小写字母和数字组成,且不能以数字开头,value由数字组成,keyvalue的长度大于等于1。
输入格式为xxxx{xxxx:xxxx,···,xxxx:xxxx}xxxx,其中xxxx为任意字符且不包含{:,}{:,}之间的空格不影响判断序列符合要求。
每个时钟上升沿读取一个字符chrrst为异步复位信号,高电平有效
输出八位each和total,分别表示所在集合中的符合要求的序列个数和单个集合中最多符合要求的序列个数。注意,当读到}时,将把each清零,而将更新total的值。(回忆版,大致是这样)

状态转移设计思路

S chr S’ 说明
0 { 1 进入当前集合
1 other 2 该序列不符合要求
1 key 3 cnt记录key的长度
2 , 1 读取下一个序列
3 : 4 读到:,进入value
4 value 4 读取value,用cnt记录value的长度
4 other 2 该序列不符合要求
4 , 1 符合要求,each+1
4 } 0 集合结束,each清零,total取较大值

空格出现位置的状态转移说明
在读取key或value时,若cnt为0,说明空格出现在key或value之前,不影响判断,保持原状态,若cnt大于0,说明空格出现在key或value之后,此时将变量space置1,继续读取,如果chr仍是key或value,说明不符合要求,将进入状态2。

以上是本人的解题过程,但第三题bug并没有解决,可以帮我de一下bug 仅供参考。