赞
踩
第一题: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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。