硬件语言Verilog HDL牛客刷题day11 A里部分 和 Z兴部分

news2025/2/23 5:19:14

1.VL72 全加器

1.题目:

①    请用题目提供的半加器实现全加器电路①

半加器的参考代码如下,可在答案中添加并例化此代码。

 


2. 解题思路  (可以看代码)

        2.1 先看 半加器  s 是加位 ,  C 是进位。

        2.2  再看全加器  s 是加位 ,  C 是进位。

        2.3 解题办法一 , 直接assign 不使用 半加器。

        2.4 解题办法二,  直接assign 使用 半加器,两个相加得出 加位, assign 得出 进位。


3. 解题代码

`timescale 1ns/1ns

module add_half(
   input                A   ,
   input                B   ,
 
   output	wire        S   ,
   output   wire        C   
);

assign S = A ^ B;
assign C = A & B;
endmodule

/***************************************************************/
module add_full(
   input                A   ,
   input                B   ,
   input                Ci  , 

   output	wire        S   ,
   output   wire        Co   
);

assign S = A ^ B ^ Ci;
assign Co = (A & B) | (B & Ci);

/*
wire c_1;
wire c_2;
wire sum_1;
 
add_half add_half_1(
   .A   (A),
   .B   (B),
          
   .S   (sum_1),
   .C   (c_1)  
);
add_half add_half_2(
   .A   (sum_1),
   .B   (Ci),
          
   .S   (S),
   .C   (c_2)  
);
 
assign Co = c_1 | c_2;
*/
endmodule


2.VL73 串行进位加法器

1.题目:

②    请用全加器电路①实现串行进位的4位全加器电路

1位全加器参考代码如下

module add_half(
   input                A   ,
   input                B   ,
 
   output	wire        S   ,
   output   wire        C   
);

assign S = A ^ B;
assign C = A & B;
endmodule

/***************************************************************/
module add_full(
   input                A   ,
   input                B   ,
   input                Ci  , 

   output	wire        S   ,
   output   wire        Co   
);

wire c_1;
wire c_2;
wire sum_1;

add_half add_half_1(
   .A   (A),
   .B   (B),
         
   .S   (sum_1),
   .C   (c_1)  
);
add_half add_half_2(
   .A   (sum_1),
   .B   (Ci),
         
   .S   (S),
   .C   (c_2)  
);

assign Co = c_1 | c_2;
endmodule


2.解题思路

        2.1 四位得加法器

        2.2 C0 两个四位数据得 进位, S[3:0] 两个数据得加位。

        2.3 按照数据的位置加就行了, (分成四位)。


3.解题代码

`timescale 1ns/1ns

module add_4(
   input         [3:0]  A   ,
   input         [3:0]  B   ,
   input                Ci  , 

   output	wire [3:0]  S   ,
   output   wire        Co   
);

wire s1[4:0];
wire c1[4:0];

add_full U1(
    .A (A[0]),
    .B (B[0]),
    .Ci (Ci),
    .S (s1[0]),
    .Co (c1[0])
);

add_full U2(
    .A (A[1]),
    .B (B[1]),
    .Ci (c1[0]),
    .S (s1[1]),
    .Co (c1[1])
);

add_full U3(
    .A (A[2]),
    .B (B[2]),
    .Ci (c1[1]),
    .S (s1[2]),
    .Co (c1[2])
);


add_full U4(
    .A (A[3]),
    .B (B[3]),
    .Ci (c1[2]),
    .S (s1[3]),
    .Co (Co)
);

assign S[0] = s1[0];
assign S[1] = s1[1];
assign S[2] = s1[2];
assign S[3] = s1[3];




endmodule


module add_half(
   input                A   ,
   input                B   ,
 
   output	wire        S   ,
   output   wire        C   
);

assign S = A ^ B;
assign C = A & B;
endmodule

/***************************************************************/
module add_full(
   input                A   ,
   input                B   ,
   input                Ci  , 

   output	wire        S   ,
   output   wire        Co   
);

wire c_1;
wire c_2;
wire sum_1;

add_half add_half_1(
   .A   (A),
   .B   (B),
         
   .S   (sum_1),
   .C   (c_1)  
);
add_half add_half_2(
   .A   (sum_1),
   .B   (Ci),
         
   .S   (S),
   .C   (c_2)  
);

assign Co = c_1 | c_2;
endmodule

         



3.VL74 异步复位同步释放

1.题目:

请使用异步复位同步释放来将输入数据a存储到寄存器中,并画图说明异步复位同步释放的机制原理

 


 


2.解题思路

        2.1 了解 异步复位。

        2.2 了解 同步释放

        2.3 了解需求。

        2.4 观看时序图, 了解 同步时序的两个节拍。

         链接:(29条消息) 异步复位,同步释放_异步复位同步释放_三岁囍的博客-CSDN博客

        

 异步复位、同步释放是指复位信号产生时不受时钟信号的控制,但是释放的时候受到时钟信号的同步。主要目的是防止复位信号释放时候产生亚稳态。

        异步复位:当复位信号拉低时,直接进入复位状态。

        同步释放:当复位信号释放时,加入两级同步缓存器,电路不会立即释放,而是同步到时钟有效时再进行释放。
 


 3.解题代码

`timescale 1ns/1ns

module ali16(
input clk,
input rst_n,
input d,
output reg dout
 );
    reg rstn_reg, rstn_reg_1;
    
    //异步复位,同步释放
    always @(posedge clk, negedge rst_n) begin
        if(!rst_n) begin
            rstn_reg <= 1'b0;
            rstn_reg_1 <= 1'b0;   
        end
        else begin
            rstn_reg <= rst_n;
            rstn_reg_1 <= rstn_reg;  
        end
        
    end
    
    //同步释放
//     always @(posedge clk) begin
//             rstn_reg_1 <= rstn_reg;       
//     end  
    
    //赋值
    always @(posedge clk, negedge rstn_reg_1) begin
        if(!rstn_reg_1) begin
            dout <= 1'b0;
        end
        else
            dout <= d;
        
    end    

endmodule


4.VL75 求最小公倍数

1.题目

  设计一个时序电路,输入2个无符号数,位宽可以通过参数DATA_W确定,输出这两个数的最小公倍数和最大公约数。


2.解题思路

        2.1 首先 最大公约数的求法:辗转相除法, 相减法,穷举法。 (建议采用 相减法,辗转相除法在有 被除数为 0 的时候很尴尬)

        2.1 最小公倍数 的求法是 : 两个数相乘,除去最大公约数。

        2.3 注意时序, (我的时序,最大公约的时候开始的时候错误)

         2.4 主要看代码 (不要注意题目测试的对错)

     


 3. 解题代码:

过关的: (相减法)

`timescale 1ns/1ns

module lcm#(
parameter DATA_W = 8)
(
input [DATA_W-1:0] A,
input [DATA_W-1:0] B,
input 			vld_in,
input			rst_n,
input 			clk,
output	wire	[DATA_W*2-1:0] 	lcm_out,
output	wire 	[DATA_W-1:0]	mcd_out,
output	reg					vld_out
);
reg	[DATA_W*2-1:0]	mcd,a_buf,b_buf;
reg [DATA_W*2-1:0]	mul_buf;
reg					mcd_vld;
reg	[1:0]			cur_st,nxt_st;
parameter IDLE= 2'b00,S0 = 2'b01, S1 = 2'b10, S2 = 2'b11;
//两段式状态机
always @(posedge clk or negedge rst_n)
	if (!rst_n)
		cur_st <= IDLE;
	else
		cur_st <= nxt_st;
always @(posedge clk or negedge rst_n)
	if (!rst_n) begin
		nxt_st <= IDLE;
		mcd	  <= 0;
		mcd_vld <= 0;
		a_buf <= 0;
		b_buf <= 0;
		mul_buf <= 0;
		vld_out <= 1'b0;
	end
	else begin	
		case (cur_st)
		IDLE:if(vld_in) begin	
				a_buf <= A;
				b_buf <= B;
				nxt_st <= S0;
				mul_buf <= A*B;
				mcd_vld <= 0;
				vld_out <= 1'b0;
				end
				else begin
				nxt_st <= IDLE;
				mcd_vld <= 0;
				vld_out <= 1'b0;
				end
		S0:if(a_buf!=b_buf)begin
				if(a_buf>b_buf)begin
					a_buf<=a_buf-b_buf;
					b_buf<=b_buf;
				end
				else begin 
					b_buf <= b_buf - a_buf;
					a_buf <= a_buf;
					vld_out <= 1'b0;
				end
				nxt_st <= S0;
				end
				else begin	
					nxt_st <=S1;
					vld_out <= 1'b0;
					end
		S1:begin	
			mcd <= b_buf;
			mcd_vld <= 1'b1;
			nxt_st	<= IDLE;
			vld_out <= 1'b1;
			end
		default:begin	
			nxt_st<=IDLE;
			vld_out <= 1'b0;
			end
		endcase
	end
	
assign mcd_out = mcd;
assign lcm_out = mul_buf/mcd;
endmodule

    辗转相除法: (我感觉这个可以的, 只是开始的最大公约数的时序不对)

`timescale 1ns/1ns

module lcm#(
parameter DATA_W = 8)
(
input [DATA_W-1:0] A,
input [DATA_W-1:0] B,
input 			vld_in,
input			rst_n,
input 			clk,
output	wire	[DATA_W*2-1:0] 	lcm_out,
output	wire 	[DATA_W-1:0]	mcd_out,
output	reg					vld_out
);
    
    reg [DATA_W-1:0] a_r;
    reg [DATA_W-1:0] b_r;
    wire [DATA_W-1:0] a_w;
    wire [DATA_W-1:0] b_w;
    wire [DATA_W-1:0] res_w;
    reg flag_r;
    reg [DATA_W*2-1:0] lcm_out_r;
    
    assign vld_out = flag_r && (a_r == b_r);
    assign res_w = a_r - b_r;
    assign {a_w, b_w} = res_w > b_r ? {res_w, b_r} : {b_r, res_w};
    assign mcd_out = vld_out ? a_r : 'd0;
    assign lcm_out = lcm_out_r/ mcd_out;
    
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            a_r <= 'd0;
            b_r <= 'd0;
            flag_r <= 'd0;
        end
        else if (vld_in) begin
            {a_r, b_r} <= A > B ? {A, B} : {B, A};
            lcm_out_r <= A * B;
            flag_r <= 'd1;
        end
        else if (vld_out) begin
            flag_r <= 'd0;
        end
        else if (flag_r) begin
            a_r <= a_w;
            b_r <= b_w;
        end
    end
endmodule

 简单版的 相减法 (没有注意时序)

`timescale 1ns/1ns

module lcm#(
parameter DATA_W = 8)
(
input [DATA_W-1:0] A,
input [DATA_W-1:0] B,
input 			vld_in,
input			rst_n,
input 			clk,
output	wire	[DATA_W*2-1:0] 	lcm_out,
output	wire 	[DATA_W-1:0]	mcd_out,
output	reg					vld_out
);
//gcd
reg [DATA_W-1:0] tmp_m,tmp_n,reg_b,reg_s,mcd_out_r;
reg [DATA_W*2-1:0] lcm_out_r;
reg flag;
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        reg_b <= 0;
        reg_s <= 0;
        vld_out <= 0;
        lcm_out_r <= 0;
        mcd_out_r <= 0;
        flag <= 0;
    end
    else if(vld_in && A>B) begin
        reg_b <= A;
        reg_s <= B;
        flag <= 1;
    end
    else if(vld_in) begin
        reg_b <= B;
        reg_s <= A;
        flag <= 1;
    end
    else if(reg_b % reg_s != 0) begin
        reg_b <= reg_s;
        reg_s <= reg_b % reg_s;
    end
    else if(reg_b % reg_s == 0 && flag == 1) begin
        vld_out <= 1;
        mcd_out_r <= reg_s;
        lcm_out_r <= tmp_m * tmp_n / reg_s;
        flag <= 0;
    end
    else begin
        vld_out <= 0;
        mcd_out_r <= 0;
        lcm_out_r <= 0;
    end
end
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        tmp_m <= 0;
        tmp_n <= 0;
    end
    else if(vld_in) begin
        tmp_m <= A;
        tmp_n <= B;
    end
end

assign mcd_out = mcd_out_r;
assign lcm_out = lcm_out_r;
endmodule


5.VL76 任意奇数倍时钟分频 (这个题,有一点细节)

1.题目:

编写一个模块,对输入的时钟信号clk_in,实现任意奇数分频,要求分频之后的时钟信号占空比为50%。模块应包含一个参数,用于指定分频的倍数。

       模块的接口信号图如下:

 


2.解题思路

        2.1 首先是  奇数的时钟分频。

        2.2 开始的时候我们需要计数, 计数的大小为  n 个周期。

        2.3 我们奇数的分频应该是 在其中一个周期 下降沿的时候开始下降。

        2.4 可以这样说  开始的时候 cnt =2 上升延变化, 4 个版周期。外加一个 下降沿的 周期的1 等于5  看图:

        

 


    3.解题代码

`timescale 1ns/1ns

module clk_divider
    #(parameter dividor = 5)
( 	input clk_in,
	input rst_n,
	output clk_out
);
    reg [$clog2(dividor):0] cnt1;
    reg clk1, clk2;
    
    always @ (posedge clk_in, negedge rst_n) begin
        if(!rst_n) begin
            cnt1 <= 0;
        end
        else if(cnt1 == dividor-1) begin
            cnt1 <= 0;
        end
        else begin
            cnt1 <= cnt1 + 1;
        end
    end
    
    always @ (posedge clk_in, negedge rst_n)begin
        if(!rst_n) begin
            clk1 <= 1'b0;
        end
        else if(cnt1 == (dividor - 1)>>1) begin 
            clk1 <= ~clk1;
        end
        else if (cnt1 == (dividor-1)) begin
            clk1 <= ~clk1;
        end
        else begin
            clk1 <= clk1;
        end        
                     
    end

    always @ (negedge clk_in, negedge rst_n)begin
        if(!rst_n) begin
            clk2 <= 1'b0;
        end
        else if(cnt1 == (dividor - 1)>>1) begin
            clk2 <= ~clk2;
        end
        else if (cnt1 == (dividor-1)) begin
            clk2 <= ~clk2;
        end
        else begin
            clk2 <= clk2;
        end
              
    end
    assign clk_out = clk1 || clk2;  //(4+1  == 5)
    
endmodule



6.VL77 编写乘法器求解算法表达式

1.题目:

编写一个4bit乘法器模块,并例化该乘法器求解c=12*a+5*b,其中输入信号a,b为4bit无符号数,c为输出。注意请不要直接使用*符号实现乘法功能。


2.解题代码

`timescale 1ns/1ns

module calculation(
	input clk,
	input rst_n,
	input [3:0] a,
	input [3:0] b,
	output reg [8:0] c
	);
reg[8:0]c1;
always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				c1<=0;
			end
		else
			begin
				 c1 <= 4'd12 * a + 3'd5 * b;
			end

	end

always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				c<=0;
			end
		else
			begin
				 c <=c1;
			end

	end
/*

  reg [8:0] a_tmp;
    reg [8:0] b_tmp;
    reg [8:0] c_tmp;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            a_tmp <= 0;
            b_tmp <= 0;
            c_tmp <= 0;
        end
        else begin
            a_tmp <= (a << 3) + (a << 2);
            b_tmp <= (b << 2) + b;
            c_tmp <= a_tmp + b_tmp;
        end
    end
    assign c = c_tmp;
*/


endmodule

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年新手如何选择云服务器配置来部署自己的网站?

现在做网站的人越来越少了&#xff0c;没有以前那种百万网站站长的势头。但是&#xff0c;不论个人站长还是企业&#xff0c;只要网上开展业务其实都会需要自己网站或小程序、APP等平台。如今&#xff0c;很少有人使用虚拟主机&#xff0c;但是独立服务器成本高&#xff0c;一般…

【2023】Kubernetes-网络原理

目录kubernetes网络模型kubernetes网络实现容器到容器之间通信Pod之间的通信Pod到Service之间的通信集群内部与外部组件之间的通信开源容器网络方案FlannelCalicokubernetes网络模型 Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#x…

异地远程访问本地SQL Server数据库【无公网IP内网穿透】

文章目录1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语转发自CSDN远程穿透的文章&#xff1a;无需公网IP&a…

哪吒探针 - Windows 和Linux端agent安装(详细注意版)

一、Windows端agent安装配置 环境准备 环境: Windows 服务器软件:哪吒探针点击下载、nssm 点击下载(探针agent和nssm都要下载准备好) 设置环境变量下载软件后&#xff0c;解压到任意位置&#xff0c;然后按 winR 打开运行窗口&#xff0c;输入 sysdm.cpl 打开系统属性–>高级…

基于GIS/SCADA的智慧燃气数字孪生Web3D可视化系统

在低碳经济快速发展的今天&#xff0c;天然气在我国能源结构的占比逐年提高&#xff0c;安全供气成为关乎民生福祉、经济发展和社会和谐的大事。 自我国开展燃气铺设以来&#xff0c;经过长期运营的家用燃气和工业燃气设备管道设施设备基础差、检维修难度大&#xff0c;且传统燃…

[Java Web]会话跟踪技术

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Java Web 目录1、会话跟踪技术概述2、数据共享3、Cookie4、Session5、Cookie和Session的区别6、总结1、会话跟踪…

大数据应用——Hadoop运行模式(伪分布式运行)

4.2 伪分布式运行模式4.2.1 启动HDFS并运行MapReduce程序1. 分析 &#xff08;1&#xff09;配置集群&#xff08;2&#xff09;启动、测试集群增、删、查没有改&#xff08;多台机子麻烦&#xff09;&#xff08;3&#xff09;执行WordCount案例2. 执行步骤&#xff08;1&…

NestJS:TypeORM 连接mysql数据库,增删改查

一、安装数据库相关模块 pnpm add nestjs/typeorm typeorm mysql package.json 二、navicat创建nestjs_base数据库&#xff0c;创建products数据表&#xff0c;添加记录 创建nestjs数据库&#xff0c;创建products数据表 navicat&#xff1a;连接MySQL&#xff0c;创建库、表…

【GPT4】微软 GPT-4 测试报告(1)总体介绍

欢迎关注【youcans的AGI学习笔记】原创作品&#xff0c;火热更新中 微软 GPT-4 测试报告&#xff08;1&#xff09;总体介绍 微软 GPT-4 测试报告&#xff08;2&#xff09;多模态与跨学科能力 微软 GPT-4 测试报告&#xff08;3&#xff09;编程能力 微软 GPT-4 测试报告&…

腾讯云SSL证书格式类型及服务器支持说明

腾讯云SSL证书支持服务器类型有Tomcat、Apache、Nginx、IIS等&#xff0c;SSL证书格式包括crt、key、pfx、JKS、pem等格式&#xff0c;腾讯云百科整理了腾讯云SSL证书支持服务器类型格式对照表&#xff1a; 腾讯云SSL证书格式和服务器支持对照表 腾讯云SSL证书格式和服务器支持…

数据库系统工程师——第三章 数据结构与算法

文章目录&#x1f4c2; 第三章、数据结构与算法 &#x1f4c1; 3.1 线性结构 &#x1f4d6; 3.1.1 线性表 &#x1f4d6; 3.1.2 栈和队列 &#x1f4d6; 3.1.3 串 &#x1f4c1; 3.2 数组和矩阵 &#x1f4c1; 3.3 树和图 &#x1f4d6; 3.3.1 树 &#x1f4d6; 3.3.2 图 &…

QCustomPlot实现极坐标图——QtWidgets

前言 前面用QtChart实现了极坐标图&#xff0c;感觉不是很方便&#xff0c;特别是一些点的图形&#xff0c;一般需要自己绘制&#xff0c;而QCustomPlot自带挺多的&#xff1b;还有极坐标的角度轴&#xff08;即 圆圈&#xff09;&#xff0c;相比起来&#xff0c;QCustomPlot…

HTML+CSS+JS 学习笔记(一)———HTML(上)

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;前端 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 代码开发工具 概念 HTML模板 body元素的常用属性 HTML 控制标记&#xff08;标签&#xff09;的类型 HTML语法…

数据库系统概论(第五版) 王珊 第四章 课后习题答案

目录 &#xff08;一&#xff09;数据库安全性の概念 1. 什么是数据库的安全性 2.数据库安全性和计算机系统的安全性有什么关系? 4.试述实现数据库安全性控制的常用方法和技术 5.什么是数据库中的自主存取控制方法和强制存取控制方法? &#xff08;二&#xff09;考试…

FMCW激光雷达,未来已来

2021年1月&#xff0c;一家名为Avea的激光雷达初创公司&#xff0c;与日本电装宣布达成合作协议&#xff0c;双方将共同推进FMCW&#xff08;调频连续波&#xff09;激光雷达的量产&#xff0c;目标是满足大众市场的需求。 众所周知&#xff0c;目前&#xff0c;大多数车载激光…

简单明了的说明STM32的PWM原理以及实现方法

申明以下都是个人理解&#xff0c;仅供参考。如果错误欢迎指教。本文不讲底层&#xff0c;根据实际使用来逆向讲解。 1.什么是pwm&#xff1f; pwm最简单的理解就是“功率”&#xff0c;调节PWM的占空比就是调节功率。 2.如何调节占空比&#xff1f; 图1 根据图1很容易看出…

3d坦克大战

文章目录一、 介绍二、 导入美术资源、调节光亮三、 坦克脚本四、 添加坦克移动效果、挂载脚本五、 制作子弹预制体、脚本六、 子弹发射点、发射子弹脚本七、 坦克血量脚本八、 设置相机视角九、 设置环形滑动条&#xff0c;表示hp十、 下载素材包一、 介绍 有两种模式&#x…

计网第五章.运输层—TCP报文的首部

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 TCP报文格式如下&#xff1a; 那6个标志位对应的中文名&#xff1a; 下面是按TCP首部的顺序介绍各个字段&#xff1a; 源端口和目的端口分别是表示发送TCP报文段的应用进程。从网络编程角度&#xff0c;进程里创建sock…

01.容器接口BeanFactory和ApplicationContext

容器接口BeanFactory和ApplicationContext BeanFactory能做哪些事ApplicationContext有哪些扩展功能事件解耦 重点 到底什么是BeanFactory 它是 ApplicationContext 的父接口它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能 BeanFactory 能干点…

【计算机网络复习】第四章 网络层 1

网络层的位置和基本功能 o 实现了端到端&#xff08;主机-主机&#xff09;的数据传输 o 路由选择 n 根据数据携带的目的主机地址为数据包选择一条的路径&#xff0c;以到达目的主机 o 主机/路由器编址 n 每个网络接口有一个唯一的IP地址 o 网络互联 n 在不同的网…