北航计算机组成P1推荐题汇总
北航计算机组成P1推荐题目汇总
题目怎么来的
偷来的(搓手手- 如果你看了一下推荐题目的
URL
的话,你会发现cscore
简直是天生为爬虫而生的,甚至参数都已经写在URL
里面了,这不是勾引是什么?http://cscore.buaa.edu.cn/#/problem?ProblemId=334&PieId=1202
PieId
- 似乎是每个P的编号,每年的都不一样,2306的
1202
代表推荐题目,其他的大都爬不到(悲
- 似乎是每个P的编号,每年的都不一样,2306的
ProblemId
- 下辖的题目编号,额,毫无规律可言,建议遍历爬取
- 但是似乎每年相同模块(例如推荐题目)的相同题目编号都有题目(未经
- 以及题目按照难度依次上升(笔者认为的,毫无参考价值(bushi )
源码获取
组合电路
- 过于简单,仅有提示
1202-405 FloatType
module FloatType(
input[31: 0] num,
output reg[4: 0] float_type
);
//定义状态
parameter zero = 5'b1;
...
reg[7: 0] exponent;
reg[22: 0] fraction;
always @(*) begin
exponent = num[30: 23];
fraction = num[22: 0];
//计算次态
if (exponent == 8'b0 && fraction == 23'b0) begin
float_type = zero;
....
end
endmodule1202-202 Comparator
cin = 1'b1;
cout = (A[0] & ~B[0]) | (cin & (A[0] ^ ~B[0]));
cin = cout;
cout = (A[1] & ~B[1]) | (cin & (A[1] ^ ~B[1]));
cin = cout;
cout = (A[2] & ~B[2]) | (cin & (A[2] ^ ~B[2]));
cin = cout;
S = A[3] ^ ~B[3] ^ cin;
cout = (A[3] & ~B[3]) | (cin & (A[3] ^ ~B[3]));
cin = cout;
Out = S; - 核心就是一个四位的行波全加器,为了实现减法电路
1202-424 Voter
module VoterPlus(
input clk,
input reset,
input[31: 0] np,
input[7: 0] vip,
input vvip,
output reg[7: 0] result
);
reg[31: 0] np_vote, next_np_vote;
reg[7: 0] vip_vote, next_vip_vote;
reg vvip_vote, next_vvip_vote;
reg[7: 0] next_result;
integer i;
always @(posedge clk or posedge reset) begin
if (reset) begin
//复位
end else begin
//状态转移
end
end
always @(*) begin
//默认复位,注意题意要求
next_np_vote = np_vote | np;
next_vip_vote = vip_vote | vip;
next_vvip_vote = vvip_vote | vvip;
next_result = 8'b0;
//计算次态,使用for循环
end1202-102 ALU
module alu(
input[31: 0] A,
input[31: 0] B,
input[2: 0] ALUOp,
output reg[31: 0] C
);
//定义状态
reg[32: 0] ext_a, ext_b;
reg[32: 0] sum;
reg cout;
always @(*) begin
case (ALUOp)
sgtu: begin
ext_a = {0, A};
ext_b = {0, B};
ext_a = ~ext_a;
sum = ext_a + ext_b + 1;
C = sum[32];
end
sgt: begin
ext_a = {A[31], A};
ext_b = {B[31], B};
ext_a = ~ext_a;
sum = ext_a + ext_b + 1;
C = sum[32];
end
default: begin
C = 32'b0;
end
endcase
end
endmodule - 注意使用拓展位的减法电路实现比较即可
有限状态机
1202-334 Drink
为什么我航的售卖机没有一键退币功能,大一被坑了多少饮料- 本题似乎是一个
Moore
型优先状态机的问题,但是我决定使用我的新结构,所以我们使用Mealy
机+Register
的方式解决输出不与状态同步的问题 - 四个状态还是很好想的,
售货机没吞钱
售货机吞0.5元
售货机吞1元
售货机吞1.5元
,然后就是状态转移方程了 - 提供一个我使用的新结构框架(
应该没有泄露源码之嫌)module drink(
input clk,
input reset,
input[1: 0] coin,
output reg drink,
output reg[1: 0] back
);
//定义状态
parameter s0 = 2'b0;
......
//定义寄存器变量
reg[1: 0] state, next_state;
reg next_drink;
reg[1: 0] next_back;
always @(posedge clk or posedge reset) begin
if (reset) begin
//复位
......
end else begin
//状态转移
state <= next_state;
back <= next_back;
drink <= next_drink;
end
end
always @(*) begin
//默认赋值
next_back = 2'b0;
next_drink = 1'b0;
next_state = state;
case (state)
s0: begin
//状态转移
......
end
......
default: begin
//......
end
endcase
end
endmodule1202-145 String
- 其实本质是课下题的升级版,对于左括号进行记录即可
- 多重括号的辨别使用一个变量寄存左括号数量即可
- 第一,读到
;
语句才截止,所以要考虑每个状态遇到;
的情况 - 第二,多个标识符可以复用状态,详情请看下面状态转移图
- 第三,不要在小情侣后面码代码
查看原图
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Trash Bin for Chi!
评论