第一题:shift4:要求如下
构建一个4位移位寄存器(右移位),具有异步复位、同步加载和启用功能。
areset:重置移位寄存器为零。
load:用数据[3:0]加载移位寄存器,而不是移位。
ena:右移(q[3]变为零,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)begin
q[3:0]<=4'd0;
end
else if(load)begin
q[3:0]<=data[3:0];
end
else if(ena)begin
q[0]<=q[1];
q[1]<=q[2];
q[2]<=q[3];
q[3]<=0;
end
else begin
q[3:0]<=q[3:0];
end
end
endmodule
异步复位:使输出不只受clk的影响,假如clk为posedge,当areset为posedge高电平有效的时候并不需要等到clk高电平有效才能使用,他们等级相等。
第二题:rotate100:
有没有一种可能,本题需要你尝试一下数字的翻转,比如向右旋转,是q99变成了q[0],然后是q[98:0]这样;向左便是q[0]变成了q[99],然后q[99-1]挪到一边;
翻转型号的寄存器:
正确答案:
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[99:0]<=data[99:0];
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:
该题题目要求为:
load:用数据[63:0]加载移位寄存器,而不是移位。
ena:选择是否移位。
amount:选择移动的方向和数量。
2'b00:左移1位。
2'b01:左移8位。
2'b10:右移1位。
2'b11:右移8位。
问:移位器的内容。
与前题不同的是,右移的操作是将移出来的数字附上q[63]的值,然后移一位就是一个q[63],几位就是几个q[63],但逻辑左移不同,左移只需要把数字移出来,然后空出的部分为0就可以了。
正确答案:
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[63:0]<=data[63:0];
end
else if(ena)begin
case(amount)
2'b00:
q[63:0]<={q[62:0],1'b0};
2'b01:
q[63:0]<={q[55:0],8'b0};
2'b10:
q[63:0]<={q[63],q[63:1]};
2'b11:
q[63:0]<={{8{q[63]}},q[63:8]};
endcase
end
else begin
q<=q;
end
end
endmodule
第四题:ifsr5:
构造线性移位寄存器,reset应当使LFSR归1。
该线性移位寄存器是reset值为1的,然后从情况为1开始判断,如为0,则无法判断。
然后按照电路图来写出这个逻辑式。
正确答案:
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[4:0]<=1;
end
else begin
q[4]<=q[0]^0;
q[3]<=q[4];
q[2]<=q[3]^q[0];
q[1]<=q[2];
q[0]<=q[1];
end
end
endmodule
第五题:mt 2015fsr:
为这个顺序电路编写Verilog代码(子模块是允许的,但是顶层必须命名为top_module)。假设您要在DE1-SoC板上实现电路。R输入接SW开关,Clock接KEY[0], L接KEY[1]。将Q输出连接到红灯led。
module top_module (
input [2:0] SW, // R
input [1:0] KEY, // L and clk
output [2:0] LEDR); // Q
wire clk;
assign clk = KEY[0];
always@(posedge clk)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
第六题:ifsr32:
构建一个32位的Galois LFSR,其taps位置为32、22、2和1。
这道题我并不明白含义,去找了一份大佬的答案来尝试理解,大概是在0,1,21的时候,在32,22,1,的前一位的时候将该值和q[0]异或,q[31]时将q[0]和0异或。
module top_module(
input clk,
input reset, // Active-high synchronous reset to 32'h1
output [31:0] q
);
integer i;
always @(posedge clk)begin
if(reset)begin
q <= 32'h1;
end
else begin
for(i=0;i<32;i++)begin
if((i==21)||(i==1)||(i==0))begin
q[i] <= q[i+1] ^ q[0];
end
else if(i==31)begin
q[31] <= 1'b0 ^ q[0];
end
else begin
q[i] <= q[i+1];
end
end
end
end
endmodule
————————————————
版权声明:本文为CSDN博主「日拱一卒_未来可期」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42334072/article/details/109452144
第五题:exams/m2014q4k:
使用逻辑语言完成设计以下电路:
正确答案:
module top_module (
input clk,
input resetn, // synchronous reset
input in,
output out);
wire [3:0]tmp;
assign out = tmp[3];
always@(posedge clk)begin
if(!resetn)begin
tmp<=0;
end
else begin
tmp<={tmp[2:0],in};
end
end
endmodule
第六题:exams/2014q4b:
为移位寄存器编写一个顶级Verilog模块(名为top_module),假设n = 4。在顶层模块中实例化MUXDFF子电路的四个副本。假设您要在DE2板上实现电路。
实例化方案:
将R输入连接到SW开关。
clk按下键KEY[0],
E到KEY[1],
L to KEY[2],和
w键[3]。
将输出端连接到红色指示灯LEDR[3:0]。
module top_module (
input [3:0] SW,
input [3:0] KEY,
output [3:0] LEDR
); //
MUXDFF u1(.r(SW[0]), .clk(KEY[0]), .e(KEY[1]), .l(KEY[2]), .w(LEDR[1]), .q(LEDR[0]));
MUXDFF u2(.r(SW[1]), .clk(KEY[0]), .e(KEY[1]), .l(KEY[2]), .w(LEDR[2]), .q(LEDR[1]));
MUXDFF u3(.r(SW[2]), .clk(KEY[0]), .e(KEY[1]), .l(KEY[2]), .w(LEDR[3]), .q(LEDR[2]));
MUXDFF u4(.r(SW[3]), .clk(KEY[0]), .e(KEY[1]), .l(KEY[2]), .w(KEY[3]), .q(LEDR[3]));
//注意该题中的w是前面一个模块的输出,所以不需要用KEY[**],或者你可以先赋值再这样表达,单纯写KEY[**]可能是没有用的。
endmodule
module MUXDFF (input w,x,e,l,clk,r,output q);
always@(posedge clk)begin
if(e&&l)begin
q<=r;
end
else if(e&&!l)begin
q<=w;
end
else if(!e&&l)begin
q<=r;
end
else begin
q<=q;
end
end
endmodule
使用了比较直观的逻辑语言,可在该基础上加以简化。
第七题:3input LUT:
在这个问题中,你将为一个8x1存储器设计一个电路,在这个电路中,写入到存储器是通过移位来完成的,而读取是“随机访问”,就像在一个典型的RAM中一样。然后您将使用该电路实现一个3输入逻辑功能。
首先,用8个d类型触发器创建一个8位移位寄存器。标记为Q[0]到Q[7]。移位寄存器输入称为S,输入Q[0] (MSB先移位)。使能输入enable控制是否移位,扩展电路使其有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)begin
Q[7:0]<={Q[6:0],S};
end
else begin
Q<=Q;
end
end
assign Z = Q[{A,B,C}];
endmodule