HDLBits训练3

时间:2024.12.22

Hadd

代码

法一:

module top_module( 
    input a, b,
    output cout, sum );
 assign   {cout,sum}=a+b;
endmodule

法二:

运行结果

Fadd

代码

法一:

module top_module( 
    input a, b, cin,
    output cout, sum );
    assign {cout,sum}=a+b+cin;
endmodule

法二:

运行结果

Adder3

代码

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    
	always@(*)begin
	    integer i;
	    for(i=0;i<3;i=i+1)begin
	        if(i==0)begin
	            {cout[i],sum[i]}=a[i]+b[i]+cin;
	        end else begin
	            {cout[i],sum[i]}=a[i]+b[i]+cout[i-1];
	        end
	    end
	end
endmodule

代码功能概述

这段 Verilog 代码实现了一个简单的 3 位宽的加法器功能,能够对两个 3 位输入信号 ab 进行加法运算,同时考虑了低位向高位的进位输入 cin,并输出相应的 3 位和 sum 以及每一位产生的进位 cout

具体实现思路

  1. 循环结构及目的

    使用 for 循环来逐位处理加法运算,循环变量 i 从 0 递增到 2(因为输入是 3 位宽,索引为 0 到 2),通过循环依次处理每一位的加法操作,以此模拟按位加法的过程,就像手动从最低位开始逐位计算加法并传递进位一样。

  2. 最低位(i == 0 时)的处理

    i 等于 0 时,也就是处理最低位的加法。此时将输入 a 的最低位 a[0]b 的最低位 b[0] 以及进位输入 cin 这三个数相加。使用了拼接操作符 {} 将相加产生的进位和本位的和拼接起来,然后赋值给 {cout[0], sum[0]},这样就同时得到了最低位的和以及向次低位的进位情况。

  3. 其他位(i > 0 时)的处理

    对于除最低位之外的其他位(i 从 1 到 2),其加法运算要考虑来自低位的进位。具体来说,每一位的加法是将 a 的对应位 a[i]b 的对应位 b[i] 以及来自低位的进位 cout[i - 1] 相加,同样使用拼接操作符 {} 将产生的进位和本位的和赋值给 {cout[i], sum[i]},以此实现考虑进位的逐位加法运算,直到最高位处理完成,最终得到完整的 3 位加法结果(sum)以及每一位向更高位的进位情况(cout)。

  4. 敏感列表与 always

    代码使用 always @(*) 语句,意味着只要 always 块内涉及的输入信号(这里是 abcin)发生变化,就会触发该 always 块内的逻辑重新执行,进而根据新的输入值实时更新输出的 sumcout 的值,以保证输出结果能随着输入的改变而正确更新。

总的来说,这段代码通过逐位计算带进位的加法操作,实现了一个简单的多位加法器功能,结构清晰地模拟了手动计算加法时从低位到高位依次运算并传递进位的过程。不过这段代码仅是一种基础的功能实现示例,实际应用中可能还需要考虑更多如时序、复位等方面的设计因素

运行结果

Exams/m2014 q4j

代码

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    
    wire [3:0]cout;
	fa fa_inst[3:0](
	    .a(x),
	    .b(y),
	    .cin({cout[2:0],1'b0}),
	    .cout(cout[3:0]),
	    .sum(sum[3:0]));
	assign sum[4]=cout[3];
	endmodule
	
	module fa(
	    input a,b,cin,
	    output cout,sum);
	    assign{cout,sum}=a+b+cin;
endmodule

整体功能概述

这段代码实现了一个 4 位二进制数的加法器功能,能够对两个 4 位输入信号 xy 进行加法运算,并输出一个 5 位的结果 sum,以完整表示加法运算可能产生的进位情况。整体采用了模块化的设计方式,将一位全加器的功能封装成 fa 模块,然后利用多个一位全加器实例来构建 4 位加法器。

顶层模块(top_module)思路分析

  1. 信号定义

    top_module 中,首先定义了一个 4 位的中间连线信号 cout,用于连接各个一位全加器之间传递进位信号,还定义了输入信号 x(4 位)、y(4 位)以及输出信号 sum(5 位),其中 sum 的最高位用于表示最终的进位输出。

  2. 实例化一位全加器模块

    通过 fa fa_inst[3:0] 语句实例化了 4 个 fa 模块,构成一个 4 位的加法器阵列。这里使用数组形式的实例化方式,方便对多个结构相同的一位全加器进行管理和连接。

  3. 连接输入输出信号到全加器实例

    对于每个 fa 实例,将输入信号 xy 整体连接到其对应的 ab 端口,表示参与加法运算的两个操作数。而对于进位输入 cin,采用了一种巧妙的连接方式,通过将 cout 的低 3 位 cout[2:0] 拼接上一个 0(即 {cout[2:0], 1'b0})来为最低位全加器提供初始进位输入为 0,同时对于后续位的全加器来说,能正确接收来自低位全加器产生的进位信号。各个全加器产生的进位输出则连接到 cout 信号对应的位(cout[3:0]),这样就构建起了进位在各个全加器之间依次传递的链路。

  4. 处理最终进位输出

    使用 assign sum[4] = cout[3]; 语句将最高位全加器产生的进位(即 cout 的最高位 cout[3])赋值给输出结果 sum 的最高位,以此完整地表示出 4 位加法运算最终可能产生的进位情况,使得输出 sum 能够正确反映 xy 相加的完整结果。

一位全加器模块(fa)思路分析

  1. 功能实现
    fa 模块中,定义了三个输入端口 abcin,分别代表参与加法运算的两个本位数字以及来自低位的进位,还有两个输出端口 coutsum,分别用于输出向高位的进位以及本位的和。其核心功能通过 assign {cout, sum} = a + b + cin; 语句实现,利用拼接操作符 {}abcin 三个数相加产生的进位和本位的和分别赋值给 coutsum,简洁地实现了一位全加器的逻辑,即完成本位相加以及向高位进位的功能。

总体而言,这段代码通过模块化设计,清晰地实现了一个 4 位加法器,将复杂的多位加法功能分解为多个简单的一位全加器功能的组合,易于理解、维护以及扩展,是一种较为典型的利用模块复用构建数字电路功能的实现方式。

运行结果

Kmap1

代码

module top_module(
    input a,
    input b,
    input c,
    output out  ); 
assign out=a|b|c?1'b1:1'b0;
endmodule

运行结果

Kmap2

代码

module top_module(
    input a,
    input b,
    input c,
    input d,
    output out  ); 
    
	/*//方法一:圈1
	assign out=~b&~c | ~a&~d | a&c&d | b&c&d;*/
	//方法二:圈0
	assign out=(~a|~c|d) & (~a|~b|c) & (~b|~d|c) & (a|b|~c|~d);
endmodule

运行结果

Dff

代码

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//

    // Use a clocked always block
    //   copy d to q at every positive edge of clk
    //   Clocked always blocks should use non-blocking assignments
    always@(posedge clk)
        q=d;
endmodule

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//

    // Use a clocked always block
    //   copy d to q at every positive edge of clk
    //   Clocked always blocks should use non-blocking assignments
    always@(posedge clk)
        q<=d;
endmodule

运行结果

Dff8

代码

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk)
        q<=d;
endmodule

运行结果

Dff8r

代码

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk)
        begin
            if(reset) q<=8'b0;
            else q<=d;
        end
endmodule

module top_module (
    input wire clk,
    input wire reset,
    input wire[7:0] d,
    output reg[7:0] q
);
    
    always@(posedge clk)begin
        q<=reset==1?1'b0:d;
    end
endmodule

运行结果

注:同步复位(synchronous reset):复位信号不作为敏感列表always@(posedge clk);异步复位(asynchronous reset):复位信号作为敏感列表always@(posedge clk or posedge reset)

Dff8p

代码

module top_module (
    input clk,
    input reset,
    input [7:0] d,
    output [7:0] q
);
    always@(negedge clk)
        begin
            if(reset) q<=8'h34;
            else q<=d;
        end
endmodule

运行结果

相关推荐
Hejjon12 分钟前
SpringBoot 整合 SQLite 数据库
笔记
吕小明么17 分钟前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi
1 9 J33 分钟前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
程序员shen16161135 分钟前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
长潇若雪39 分钟前
《类和对象:基础原理全解析(上篇)》
开发语言·c++·经验分享·类和对象
汝即来归1 小时前
选择排序和冒泡排序;MySQL架构
数据结构·算法·排序算法
咒法师无翅鱼1 小时前
【定理证明工具调研】Coq, Isabelle and Lean.
算法
仍然探索未知中2 小时前
C语言经典100例
c语言
风清云淡_A2 小时前
【java基础系列】实现数字的首位交换算法
java·算法
涵涵子RUSH2 小时前
合并K个升序链表(最优解)
算法·leetcode