HDLBits(Shift register)部分答案及解析

第一题: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值