4-bit shift register
题目要求:建立一个 4 位移位寄存器(右移),具有异步复位、同步加载和使能功能。
areset:将移位寄存器复位为零。
load: 用数据[3:0]加载移位寄存器,而不是移位。
ena: 右移(q[3] 变为 0,q[0] 被移出并消失)。
q: 移位寄存器的内容。
如果加载输入和 ena 输入都被置信(1),则加载输入的优先级更高。
代码如下:
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 <= 4'b0 ;
else if(load) begin
q <= data ;
end
else if(ena) begin
q <= {1'b0 ,q[3:1]} ;
end
end
endmodule
Rotate100_left/right rotator
题目要求: 建立一个 100 位左右旋转器,具有同步加载和左右使能功能。旋转器从寄存器的另一端移入移出位,而不像移位器那样丢弃移出位并移入 0。如果启用,旋转器会旋转位,而不会修改或丢弃它们。
load: 用数据[99:0]加载移位寄存器,而不是旋转。
ena[1:0]: 选择是否旋转以及旋转的方向。
2'b01 向右旋转一位
2'b10 向左旋转一位
2'b00 和 2'b11 不旋转。
代码:
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) begin
q <= data ;
end
else begin
case(ena)
2'b01 : q <= {q[0],q[99:1]} ;
2'b10 : q <= {q[98:0],q[99]} ;
default : q <= q ;
endcase
end
end
endmodule
Shift18
题目要求:建立一个具有同步加载功能的 64 位算术移位寄存器。移位寄存器既可以左移,也可以右移,移位位数可以是 1 位,也可以是 8 位。算术右移时,移入的是移位寄存器中数字(本例中为 q[63])的符号位,而不是逻辑右移时的零。算术右移的另一种思路是,它假定被移位的数字是带符号的,并保留符号。例如11000算术右移一位 是 11100,逻辑右移一位是01100。01000算数右移一位 是 00100,逻辑右移一位也是00100。
代码如下
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) begin
q <= data ;
end
else begin
if(ena) begin
case(amount)
2'b00: q <= {q[62:0],1'b0} ;
2'b01: q <= q<<8 ;
2'b10: q <= {q[63],q[63:1]} ;//ift right by 1 bit.
2'b11: q <= {{8{q[63]}},q[63:8]};
endcase
end
else
q <= q ;
end
end
endmodule
5-bit LFSR
题目要求:如上图所示,其中要求reset要将LFSR置为1。
代码如下:
module top_module(
input clk,
input reset, // Active-high synchronous reset to 5'h1
output [4:0] q
);
wire mid1 ,mid2 ;
assign mid1 = q[0] ^ 1'b0 ;
assign mid2 = q[0] ^ q[3] ;
always @(posedge clk) begin
if(reset) begin
q <= 5'h1 ;
end
else begin
q[4] <= mid1 ;
q[3] <= q[4] ;
q[2] <= mid2 ;
q[1] <= q[2] ;
q[0] <= q[1] ;
end
end
endmodule
3-bit LFSR/Mt2015 lfsr
题目要求: 编写该顺序电路的 Verilog 代码(子模块也可以,但顶层必须命名为 top_module)。假设要在 DE1-SoC 板上实现该电路。将 R 输入连接到 SW 开关,将 Clock 连接到 KEY[0],将 L 连接到 KEY[1]。将 Q 输出端连接至红灯 LEDR。
代码如下:
module sub_module(
input clk,
input L,
input r,
input q,
output Q);
wire mid ;
assign mid = L? r : q ;
always @(posedge clk) begin
Q <= mid ;
end
endmodule
module top_module (
input [2:0] SW, // R
input [1:0] KEY, // L KEY[1] //clk KEY[0]
output [2:0] LEDR); // Q
//wire Q0,Q1,Q2 ;
sub_module inst1(
.clk(KEY[0]),
.L(KEY[1]),
.r(SW[0]),
.q(LEDR[2]),
.Q(LEDR[0]));
sub_module inst2(
.clk(KEY[0]),
.L(KEY[1]),
.r(SW[1]),
.q(LEDR[0]),
.Q(LEDR[1]));
wire q_mid ;
assign q_mid = (LEDR[1] ^ LEDR[2]) ;
sub_module inst3(
.clk(KEY[0]),
.L(KEY[1]),
.r(SW[2]),
.q(q_mid),
.Q(LEDR[2]));
endmodule
32-bit LFSR
(还没写)
shift register_Exams/m2014 q4k
代码如下:
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out);
wire q1,q2,q3;
always @(posedge clk) begin
if(~resetn) begin
{q1,q2,q3} <= 3'b0 ;
out <= 1'b0 ;
end
else begin
q1 <= in ;
q2 <= q1 ;
q3 <= q2 ;
out <= q3 ;
end
end
endmodule
shift register_Exams/2014 q4b
代码如下:
module top_module (
input [3:0] SW,
input [3:0] KEY,
output [3:0] LEDR
);
MUXDFF inst1(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(KEY[3]),.q(LEDR[3]),.r(SW[3]),.Q(LEDR[3]));
MUXDFF inst2(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(LEDR[3]),.q(LEDR[2]),.r(SW[2]),.Q(LEDR[2]));
MUXDFF inst3(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(LEDR[2]),.q(LEDR[1]),.r(SW[1]),.Q(LEDR[1]));
MUXDFF inst4(.clk(KEY[0]),.E(KEY[1]),.L(KEY[2]),.w(LEDR[1]),.q(LEDR[0]),.r(SW[0]),.Q(LEDR[0]));
endmodule
module MUXDFF (
input clk ,
input E ,
input L ,
input w ,
input q ,
input r ,
output Q );
wire mid1 ,mid2 ;
assign mid1 = E? w : q ;
assign mid2 = L? r : mid1 ;
always @(posedge clk) begin
Q <= mid2 ;
end
endmodule
3-input LUT_Exams/ece241 2013 q12
题意:用 8 个 D 型触发器创建一个 8 位移位寄存器。将触发器的输出标记为 Q[0]...Q[7]。移位寄存器的输入应称为 S,它馈入 Q[0] 的输入。使能输入控制是否移位。然后,扩展电路,增加 3 个输入端 A、B、C 和一个输出端 Z。电路的行为应如下:当 ABC 为 000 时,Z=Q[0];当 ABC 为 001 时,Z=Q[1],以此类推。
代码:
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) begin
q <= {q[6:0],S};
end
else begin
q <= q;
end
end
assign Z = q[{A, B, C}];
endmodule