Shift4

异步复位同步置数和使能。

module top_module(    input clk,    input areset,  // async active-high reset to zero    input load,    input ena,    input [3:0] data,    output reg [3:0] q);     always@(posedge clk or posedge areset)    begin        if(areset)            q <= 'd0;        else if(load)            q <= data;        else if(ena)            q <= {1'b0,q[3:1]};    endendmodule

Rotate100

循环移位,通过ena信号控制左移和右移。

module top_module(    input clk,    input load,    input [1:0] ena,    input [99:0] data,    output reg [99:0] q);     always@(posedge clk)    begin        if(load)            q <= data;        else if(ena == 2'b01)            q <= {q[0],q[99:1]};        else if(ena == 2'b10)            q <= {q[98:0],q[99]};    endendmodule

Shift18

算数移位,注意右移的时候保留符号位,左移正常移位就可以,注意8{q[63]}外面要再加一个大括号。

module top_module(    input clk,    input load,    input ena,    input [1:0] amount,    input [63:0] data,    output reg [63:0] q);     always@(posedge clk)    begin        if(load)            q <= data;        else if(ena) begin            case(amount)                2'b00: q <= {q[62:0],1'b0};                2'b01: q <= {q[55:0],8'b0};                2'b10: q <= {q[63],q[63:1]};                2'b11: q <= {{8{q[63]}},q[63:8]};            endcase        end    endendmodule

Lfsr5

题目给的答案把组合逻辑和时序逻辑分开了,看起来思路会更清晰。

module top_module(    input clk,    input reset,    // Active-high synchronous reset to 5'h1    output reg[4:0] q);     always@(posedge clk)    begin        if(reset)            q <= 5'h1;        else begin            q[0] <= q[1];            q[1] <= q[2];            q[2] <= q[3]^q[0];            q[3] <= q[4];            q[4] <= 1'b0^q[0];        end    endendmodule

Mt2015 lfsr

把之前写的muxdff例化一下就可以了,注意如果是在顶层是不推荐有逻辑的,逻辑可以纳入子模块中,可以更好的优化。

module top_module (    input [2:0] SW,      // R    input [1:0] KEY,     // L and clk    output [2:0] LEDR);  // Q    muxdff u0(KEY[0],KEY[1],SW[0],LEDR[2],LEDR[0]);    muxdff u1(KEY[0],KEY[1],SW[1],LEDR[0],LEDR[1]);    muxdff u2(KEY[0],KEY[1],SW[2],LEDR[1]^LEDR[2],LEDR[2]);endmodulemodule muxdff (    input clk,    input L,    input r_in,    input q_in,    output reg Q);    always@(posedge clk)    begin        Q <= L?r_in:q_in;    endendmodule

Lfsr32

仿照Lfsr5写即可,注意位置是从1开始算的。

module top_module(    input clk,    input reset,    // Active-high synchronous reset to 32'h1    output reg[31:0] q);     reg [31:0]q_next;    always@(*)    begin        q_next = q[31:1];        q_next[31] = q[0];        q_next[21] = q[0]^q[22];        q_next[1] = q[0]^q[2];        q_next[0] = q[0]^q[1];    end        always@(posedge clk)    begin        if(reset)            q <= 32'h1;        else            q <= q_next;    endendmodule

Exams/m2014 q4k

module top_module (    input clk,    input resetn,   // synchronous reset    input in,    output out);    reg [3:0]Q;    always@(posedge clk)    begin        if(~resetn)            Q <= 'd0;        else             Q <= {in,Q[3:1]};    end    assign out = Q[0];endmodule

Exams/2014 q4b

同样是例化之前写的MUXDFF。

module top_module (    input [3:0] SW,    input [3:0] KEY,    output [3:0] LEDR); //    MUXDFF u3(KEY[0],LEDR[1],SW[0],KEY[1],KEY[2],LEDR[0]);    MUXDFF u2(KEY[0],LEDR[2],SW[1],KEY[1],KEY[2],LEDR[1]);    MUXDFF u1(KEY[0],LEDR[3],SW[2],KEY[1],KEY[2],LEDR[2]);    MUXDFF u0(KEY[0],KEY[3],SW[3],KEY[1],KEY[2],LEDR[3]);endmodulemodule MUXDFF (    input clk,    input w, R, E, L,    output Q);    always@(posedge clk)    begin        Q <= L?R:(E?w:Q);    endendmodule

Exams/ece241 2013 q12

3输入查找表,Xilinx的FPGA大多是基于6输入查找表构造的。

通过一个时序逻辑改变保存的值,再通过一个组合逻辑输出结果。

module top_module (    input clk,    input enable,    input S,    input A, B, C,    output Z );     reg [7:0]Q;    always@(posedge clk)    begin        if(enable)            Q <= {Q[6:0],S};    end    assign Z=Q[{A,B,C}];endmodule