硬件语言Verilog HDL牛客刷题 day09 哲K部分

news2024/11/28 19:29:25

1.VL59 根据RTL图编写Verilog程序

1.题目:

根据以下RTL图,使用 Verilog HDL语言编写代码,实现相同的功能,并编写testbench验证功能

 


2.解题思路

        2.1 了解D触发器的知识 (在时钟是上升沿的时候, 输入是什么输出什么)

        2.2 注意经过D触发器的器件需要 延时一个周期。

        链接:时序约束系列之D触发器原理和FPGA时序结构 - 知乎 (zhihu.com) 


3.解题代码

        

`timescale 1ns/1ns

module RTL(
	input clk,
	input rst_n,
	input data_in,
	output reg data_out
	);
reg flag;
always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				flag<=0;
			end
		else
			begin
				flag <=data_in ;
			end
	end

always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				data_out<=0;
			end
		else
			begin
				data_out <= ~flag && data_in ;
			end
	end




endmodule


2.VL60 使用握手信号实现跨时钟域数据传输

1.题目:

分别编写一个数据发送模块和一个数据接收模块,模块的时钟信号分别为clk_a,clk_b。两个时钟的频率不相同。数据发送模块循环发送0-7,在每个数据传输完成之后,间隔5个时钟,发送下一个数据。请在两个模块之间添加必要的握手信号,保证数据传输不丢失。
    模块的接口信号图如下:

data_req和data_ack的作用说明:
data_req表示数据请求接受信号。当data_out发出时,该信号拉高,在确认数据被成功接收之前,保持为高,期间data应该保持不变,等待接收端接收数据。
当数据接收端检测到data_req为高,表示该时刻的信号data有效,保存数据,并拉高data_ack。
当数据发送端检测到data_ack,表示上一个发送的数据已经被接收。撤销data_req,然后可以改变数据data。等到下次发送时,再一次拉高data_req。 

 


2.解题思路

        2.1 两个部分一个接收端, 一个发送端。

        2.2  两个部分的需求分析

         2.3 开始   使用计时器 启动 发送部分的 data_req 信号。

         2.4 信号需要延时两个周期。

  


3.解题代码

`timescale 1ns/1ns
module data_driver(
	input clk_a,
	input rst_n,
	input data_ack,
	output reg [3:0]data,
	output reg data_req
	);
    reg data_ack_r1, data_ack_r2;
    reg [2:0] cnt;
    
    always @ (posedge clk_a or negedge rst_n)
        if (!rst_n) 
        begin
            data_ack_r1 <= 1'b0;
            data_ack_r2 <= 1'b0;
        end
        else
        begin
            data_ack_r1 <= data_ack;
            data_ack_r2 <= data_ack_r1;
        end
    
    always @ (posedge clk_a or negedge rst_n)
        if (!rst_n) 
            data <= 4'b0;
        else if(data_ack_r1 && !data_ack_r2)
            data <= data + 1'b1;
        else
            data <= data;
    
    always @ (posedge clk_a or negedge rst_n)
        if (!rst_n) 
            cnt <= 1'b0;
        else if (data_ack_r1 && !data_ack_r2)
            cnt <= 1'b0;
        else if (data_req)  //正在请求时不计数
            cnt <= cnt;
        else 
            cnt <= cnt + 1'b1;
             
    always @ (posedge clk_a or negedge rst_n)
        if (!rst_n) 
            data_req <= 1'b0;
        else if (cnt == 3'd4)  
            data_req <= 1'b1;
        else if (data_ack_r1 && !data_ack_r2)
            data_req <= 1'b0;
        else 
            data_req <= data_req;
    
endmodule



module data_receiver(
    input clk_b,
    input rst_n,
    output reg data_ack,
    input [3:0]data,
    input data_req
    );
    reg [3:0]data_in_reg;
    reg data_req_1, data_req_2;
    
    always @ (posedge clk_b or negedge rst_n)
        if (!rst_n) begin
            data_req_1 <= 1'b0;
            data_req_2 <= 1'b0;
        end
        else begin
            data_req_1 <= data_req;
            data_req_2 <= data_req_1;
        end
 
    always @ (posedge clk_b or negedge rst_n)
        if (!rst_n) begin
            data_ack <= 1'b0;
            data_in_reg <= 4'b0;
        end
        else if (data_req_1 && !data_req_2) begin
            data_ack <= 1'b1;
            data_in_reg <= data;
        end
        else begin 
            data_ack <= 1'b0;
            data_in_reg <= data_in_reg; 
        end
    
endmodule


3. VL61 自动售卖机

1. 题目

请设计状态机电路,实现自动售卖机功能,A饮料5元钱,B饮料10元钱,售卖机可接收投币5元钱和10元钱,每次投币只可买一种饮料,考虑找零的情况。

电路的接口如下图所示。sel信号会先于din信号有效,且在购买一种饮料时值不变。

  • sel为选择信号,用来选择购买饮料的种类,sel=0,表示购买A饮料,sel=1,表示购买B饮料;
  • din表示投币输入,din=0表示未投币,din=1表示投币5元,din=2表示投币10元,不会出现din=3的情况;
  • drinks_out表示饮料输出,drinks_out=0表示没有饮料输出,drinks_out=1表示输出A饮料,drinks_out=2表示输出B饮料,不出现drinks_out =3的情况,输出有效仅保持一个时钟周期;
  • change_out表示找零输出,change_out=0表示没有找零,change_out=1表示找零5元,输出有效仅保持一个时钟周期。

接口电路图如下:


2.解题思路

        2.1 首先 注意这个题有一点细节, 在买 B 饮料的时候, 可以存钱。(我去他的)。

                2.1.1 在第一次 5 元 存入 , 第二次 5元 输出饮料。零钱清零。

                2.1.2 在第一次 5元 存入 , 第二次  10元 输出饮料。 零钱输出 5 元。

        2.1 信号延时 1 个周期输出。 (这是这个周期是 符合条件, 下一个 周期输出信号)。


3.解题代码

`timescale 1ns/1ns

module sale(
   input                clk   ,
   input                rst_n ,
   input                sel   ,//sel=0,5$dranks,sel=1,10&=$drinks
   input          [1:0] din   ,//din=1,input 5$,din=2,input 10$
 
   output   reg  [1:0] drinks_out,//drinks_out=1,output 5$ drinks,drinks_out=2,output 10$ drinks
   output	reg        change_out   
);
reg money;

always@(posedge clk or negedge rst_n)
    begin
        if(~rst_n)
            begin
                drinks_out <=0;
                change_out <=0;
                money <=0;
            end
        else
            begin
                if(sel == 1'b1)
                    begin
                        if(din == 2'd1)//题目没有说可以存钱啊!1
                            begin
                                drinks_out <=0;
                                change_out <=1'd0; //连续输入两次5 元也可以
                                money <=1;
                                if(money)
                                    begin
                                        drinks_out <=2'd2;
                                        change_out <=1'd0;
                                        money <=0;
                                    end
                            end
                        else if(din == 2'd2)
                            begin
                                drinks_out <=2'd2;
                                change_out <=0;
                                 if(money)
                                    begin
                                        drinks_out <=2'd2;
                                        change_out <=1'd1;
                                        money <=0;
                                    end
                            end
                        else
                            begin
                                drinks_out <=0;
                                change_out <=0;
                            end
                    end
                else if(sel == 1'b0)
                    begin
                        if(din == 2'd1)
                            begin
                                drinks_out <=2'd1;
                                change_out <=1'd0;
                            end
                        else if(din == 2'd2)
                            begin
                                drinks_out <=2'd1;
                                change_out <=1'd1;
                            end
                         else
                            begin
                                drinks_out <=0;
                                change_out <=0;
                            end
                    end
            end
    end



endmodule


4.VL62 序列发生器

1.题目:

       编写一个模块,实现循环输出序列001011。

模块的接口信号图如下:


2. 解题思路

        2.1 第一种设置  参数  flag 001011 直接左移  输出  flag[5 ].

        2.2 设置标志位 对应输出。

        2.3 注意信号延时一个 周期。


3.解题代码

`timescale 1ns/1ns

module sequence_generator(
	input clk,
	input rst_n,
	output reg data
	);

parameter s0 = 3'd0;
parameter s1 = 3'd1;
parameter s2 = 3'd2;
parameter s3 = 3'd3;
parameter s4 = 3'd4;
parameter s5 = 3'd5;
reg[2:0] flag;
//需要延后一个周期 与
always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				flag <= s0;	
			end
		else
			begin
				case(flag)
					s0 : flag <=s1;
					s1 : flag <=s2;
					s2 : flag <=s3;
					s3 : flag <=s4;
					s4 : flag <=s5;
					s5 : flag <=s0;
					default:flag <=s0;
				endcase
			end
	end

always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				data <=0;
			end
		else
			begin
				case (flag)
					s0: data <= 0;
					s1: data <= 0;
					s2: data <= 1;
					s3: data <= 0;
					s4: data <= 1;
					s5: data <= 1;
				endcase
			end
	end



endmodule

 

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

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

相关文章

UE “体积”的简单介绍

目录 一、阻挡体积 二、摄像机阻挡体积 三、销毁Z体积 四、后期处理体积 一、阻挡体积 你可以在静态网格体上使用阻挡体积替代碰撞表面&#xff0c;比如建筑物墙壁。这可以增强场景的可预测性&#xff0c;因为物理对象不会与地面和墙壁上的凸起细节相互作用。它还能降低物理模…

visio的使用技巧

一、调节箭头方向 1.打开你要修改的Microsoft Visio文件 2.选中你要修改的箭头&#xff0c;在上方的开始工具栏中找到“线条”选项&#xff0c;鼠标左键单击打开&#xff1b; 3.在下面找到“箭头”这个选项&#xff0c;鼠标移到上面去&#xff0c;就会展开&#xff1b;带阴影的…

Linux网络编程 第七天

目录 网络编程阶段项目 项目目标 Web服务器开发准备 Html语言基础 Html简介 Html标签介绍 题目标签 文本标签 列表标签 图片标签 超链接标签 http请求消息 请求类型 http响应消息 http常见状态码 http常见文件类型分…

“万物智联·共数未来”2023年移远通信物联网生态大会圆满落幕

4月12日&#xff0c;以“万物智联共数未来”为主题的2023年移远通信物联网生态大会在深圳前海华侨城JW万豪酒店隆重举办。 大会邀请到来自运营商、主流芯片商、行业客户、产业协会、标准联盟、媒体等产业链合作伙伴的40多位行业大咖&#xff0c;共话物联网产业的现在和未来。参…

node开通阿里云短信验证服务,代码演示 超级详细

阿里云官网步骤&#xff1a;Node.js SDK (aliyun.com) 首先先搭建一个node项目&#xff1a;app.js const express require(express); // 引入 Express 框架const app express(); app.use(express.json()); // 解析请求中的 JSON 数据const PORT process.env.PORT || 3000; …

URL 以及 URLConnection 类的使用

1. 概述 java 提供了两个类&#xff0c;在这两个类里封装了大部分 Web 相关的各种操作。这两个类是 URL 类 和 URLConnection 类。2. URL 类 java.net.URL 类定义了一个统一的资源定位器&#xff0c;它是指向互联网“资源”的指针。可以定 位互联网上的资源。并且…

LInux一天10题 day1

su(switch user) 命令用于更改其他使用者身份&#xff0c; usermod -l 修改账号名称&#xff0c;使用格式&#xff1a;usermod -l new_name old_name 修改用户权限&#xff1a; 方法1 1、先切换到root权限的用户登录下&#xff0c;修改 /etc/sudoers 文件&#xff0c;找…

games103——作业1

实验一主要实现简单的刚体动画模拟(一只兔子)&#xff0c;包括 impulse 的碰撞检测与响应&#xff0c;以及 Shape Matching方法。 完整项目已上传至github。 文章目录简单刚体模拟(不考虑碰撞)平移运动旋转运动粒子碰撞检测与响应碰撞检测碰撞响应Penalty MethodsQuadratic Pen…

如何安全的从硬盘恢复文件?

可以从硬盘中恢复永久删除的文件吗&#xff1f; “我删除了一些看起来不重要的文件夹&#xff0c;并清空了回收站。但在几天后&#xff0c;我意识到删除的文件夹里有些重要的数据。如何恢复永久删除的文件&#xff1f;谢谢&#xff01;” 随着科技的进步与发展&#xff0c…

LeetCode 2404. 出现最频繁的偶数元素

原题链接&#xff1a;2404. 出现最频繁的偶数元素 给你一个整数数组 nums &#xff0c;返回出现最频繁的偶数元素。 如果存在多个满足条件的元素&#xff0c;只需要返回 最小 的一个。如果不存在这样的元素&#xff0c;返回 -1 。 示例 1&#xff1a; 输入&#xff1a;nums …

OpenAI团队抢着用的编程语言?

作为一名合格的&#xff08;准&#xff09;程序员&#xff0c;必做的一件事是关注编程语言的热度&#xff0c;编程榜代表了编程语言的市场占比变化&#xff0c;它的变化更预示着未来的科技风向和机会&#xff01; 快一起看看本月排行有何看点&#xff1a; 4月Tiobe排行榜前15…

如何学习智能交通?

AI的专业领域知识是指AI与具体应用领域相结合时所需要的该应用领域的知识。AI的应用领域非常广泛&#xff0c;例如计算机视觉、智能交通、智能制造、智慧金融、智慧教育、智慧农业、智慧能源、智能通信、智能芯片等。本文主要介绍智能交通的基本概念、发展历程、主要研究内容、…

DAMA数据治理认证,一定要先考CDGA才能考CDGP吗?

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

react4:配置网络请求axios --- 配置@路径别名

1. axios 请求安装&#xff1a;npm i axios axios 二次封装&#xff1a;配置,拦截器等应用 在&#xff1a;utils文件夹下request.js中配置 //utils文件夹下request.js中配置//导入 axios import axios from "axios";//实例化axios var service axios.create({time…

QT5学习教程一——Hello World例子

一、打开 Qt Creator -文件-新建文件或项目-Application-Qt Widgets Application-选择&#xff0c;如图 1.1 图 1.2 将项目放到指定目录&#xff0c;便于管理。单击[下一步] 选择构建的环境&#xff0c;可以根据自己的配置来选择&#xff0c;本例子选择MSVC2015。MSVC是指微软的…

JAVA阶段考内容知识点的梳理

前言&#xff1a;这些都是很基本的&#xff0c;还有很多没有写出来&#xff0c;重点在于编程序理解。 目录 第一章概述 课堂总结 相关习题 第二章&#xff1a;语言基础 课堂总结 相关习题 第三章&#xff1a;类和对象 内容总结 相关习题 第四章&#xff1a;类的派生与…

【Linux】网络编程套接字(下)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

【三十天精通 Vue 3】 第十天 Vue 状态管理详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 状态管理概述1.1 状态管理的概念1.2 状态管理的作用…

Spark基础 - 名词汇总及集群模式概述

原文地址&#xff1a; Spark基础 - 名词汇总及集群模式概述 本文档内容参考Spark官方文档&#xff1a;Cluster Mode Overview 一. Glossary(术语) TermMeaningcommentApplicationUser program built on Spark. Consists of a driver program and executors on the cluster.…

Springboot应用整合Sentinel实现限流、熔断、降级笔记

可以使用官方的sentinel 也可使用进行持久化改造后的Sentinel &#xff0c;本文基于此进行记录。Sentinel持久化到Nacoshttps://blog.csdn.net/chenjian723122704/article/details/130098896 Sentinel版本为 1.8.6 Nacos版本为 2.2.0 关于网关限流、限流和熔断&#xff0c;我…