1.4 bits shift register
构建一个4位的右移计数器,具有异步复位,同步负载,使能功能(右移后高位补0)
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) begin
q <= 4'b0;
end
else if (load) begin
q <= data;
end
else if ((ena==1) && (load == 0)) begin
q <= (q >>1);
end
end
endmodule
2.Rotate100
构建一个100位的循环左移/右移器(高位不补0,为移动的数字)——拼接符
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
3.Shift18
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 << 1 ;
2'b01: q <= q << 8 ;
2'b10: q <= {q[63],q[63:1]};
2'b11: q <= {{8{q[63]}},q[63:8]} ;
endcase
end
else q <= q;
end
end
endmodule
4.Lfsr5
FSR:在移位寄存器向右移位一位以后,左边就会空出一位(如上图所示),这时如果采用一个反馈函数,以寄存器中已有的某些序列作为反馈函数的输入,在函数中经过一定的运算后,将反馈函数输出的结果填充到移位寄存器的最左端,那么这样的移位寄存器就会有源源不断的输出。这样的,拥有反馈函数的移位寄存器称为反馈移位寄存器
LFSR:线性反馈移位寄存器,如果反馈移位寄存器的反馈函数是线性函数(即只进行简单线性运算的函数),那么这种寄存器就被称为线性反馈移位寄存器。
LFSR的反馈函数就是简单地对移位寄存器中的某些位进行异或,并将异或的结果填充到LFSR的最左端。对于LFSR中每一位的数据,可以参与异或,也可以不参与异或。其中,我们把参与异或的位称为抽头。
详细解释连接
module top_module(
input clk,
input reset, // Active-high synchronous reset to 5'h1
output [4:0] q
);
always @ (posedge clk) begin
if(reset) begin
q <= 5'b1;
end
else begin
q[0] <= q[1];
q[1] <= q[2];
q[2] <= q[0] ^ q[3];
q[3] <= q[4];
q[4] <= 0 ^ q[0];
end
end
endmodule
5.Mt2015 lfsr
module top_module (
input [2:0] SW, // R
input [1:0] KEY, // L and clk
output [2:0] LEDR); // Q
always @(posedge KEY[0])
begin
if(KEY[1])
begin
LEDR[0] <= SW[0];
LEDR[1] <= SW[1];
LEDR[2] <= SW[2];
end
else
begin
LEDR[0] <= LEDR[2];
LEDR[1] <= LEDR[0];
LEDR[2] <= LEDR[2]^LEDR[1];
end
end
endmodule
6.Lfsr32
构建一个 32 位 Galois LFSR,在位位置 32、22、2 和 1 处抽头
module top_module(
input clk,
input reset, // Active-high synchronous reset to 32'h1
output [31:0] q
);
always @ (posedge clk) begin
if(reset) begin
q <= 32'h1;
end
else begin
q <= {q[0]^1'b0,q[31:23],q[0]^q[22],q[21:3],q[0]^q[2],q[0]^q[1]};
end
end
endmodule
7.Exams/m2014 q4k
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out);
reg q0,q1,q2;
always @ (posedge clk) begin
if(!resetn) begin
out <= 0;
q0 <= 0;
q1 <= 0;
q2 <= 0;
end
else begin
q0 <= in;
q1 <= q0;
q2 <= q1;
out <= q2;
end
end
endmodule
8.Exams/2014 q4b
module top_module (
input [3:0] SW,
input [3:0] KEY,
output [3:0] LEDR
); //
MUXDFF MUXDFF_U0 (
.clk(KEY[0]),
.l(KEY[2]),//片选
.w(KEY[3]),
.d(LEDR[3]),//上一个q
.r(SW[3]),// sw
.e(KEY[1]),
.q(LEDR[3]),
);
MUXDFF MUXDFF_U1 (
.clk(KEY[0]),
.l(KEY[2]),//片选
.w(LEDR[3]),
.d(LEDR[2]),//上一个q
.r(SW[2]),// sw
.e(KEY[1]),
.q(LEDR[2]),
);
MUXDFF MUXDFF_U2 (
.clk(KEY[0]),
.l(KEY[2]),//片选
.w(LEDR[2]),
.d(LEDR[1]),//上一个q
.r(SW[1]),// sw
.e(KEY[1]),
.q(LEDR[1]),
);
MUXDFF MUXDFF_U3 (
.clk(KEY[0]),
.l(KEY[2]),//片选
.w(LEDR[1]),
.d(LEDR[0]),//上一个q
.r(SW[0]),// sw
.e(KEY[1]),
.q(LEDR[0]),
);
endmodule
module MUXDFF (
input clk,
input l,//片选
input w,
input d,//上一个q
input r,// sw
input e,
output q
);
always@(posedge clk)begin
q<=(e==1'b1)?((l==1)?r:w):((l==1)?r:d);
end
endmodule
9.Exams/ece241 2013 q12
构建一个3输入的查找表(LUTs)
在这个问题中,您将为 8x1 存储器设计一个电路,其中对存储器的写入是通过移入位完成的,读取是“随机访问”,就像在典型的 RAM 中一样。然后,您将使用该电路实现 3 输入逻辑功能。
首先,创建一个带有 8 个 D 型触发器的 8 位移位寄存器。标记 Q[0]…问[7].移位寄存器输入应称为 S,它馈送 Q[0] 的输入(MSB 首先移入)。使能输入控制是否移位。然后,将电路扩展为具有 3 个附加输入 A、B、C 和一个输出 Z。电路的行为应如下:当 ABC 为 000 时,Z=Q[0],当 ABC 为 001 时,Z=Q[1] 时,依此类推。您的电路应仅包含 8 位移位寄存器和多路复用器。(旁注:该电路称为 3 输入查找表 (LUT))。
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
always@(*) begin
case({A,B,C})
3'b000:Z<=Q[0];
3'b001:Z<=Q[1];
3'b010:Z<=Q[2];
3'b011:Z<=Q[3];
3'b100:Z<=Q[4];
3'b101:Z<=Q[5];
3'b110:Z<=Q[6];
3'b111:Z<=Q[7];
endcase
end
endmodule