北航计算机组成P1推荐题目汇总

题目怎么来的

  • 偷来的(搓手手
  • 如果你看了一下推荐题目的URL的话,你会发现cscore简直是天生为爬虫而生的,甚至参数都已经写在URL里面了,这不是勾引是什么?
    http://cscore.buaa.edu.cn/#/problem?ProblemId=334&PieId=1202
  • PieId
    • 似乎是每个P的编号,每年的都不一样,2306的1202代表推荐题目,其他的大都爬不到(悲
  • 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

endmodule

1202-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循环
end

1202-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元,然后就是状态转移方程了
    alt-text
  • 提供一个我使用的新结构框架(应该没有泄露源码之嫌
    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

    endmodule

1202-145 String

  • 其实本质是课下题的升级版,对于左括号进行记录即可
  • 多重括号的辨别使用一个变量寄存左括号数量即可
    • string状态没有分开,看起来有一点乱
      状态转移图
    • 将带有左括号未匹配时单独分出状态,这样大概不会显得乱吧
      wty赞助

1202-336 IntCheck

  • 第一,读到;语句才截止,所以要考虑每个状态遇到;的情况
  • 第二,多个标识符可以复用状态,详情请看下面状态转移图
  • 第三,不要在小情侣后面码代码
    复杂图查看原图