硬件语言Verilog HDL牛客刷题day08 综合部分

news2024/11/15 7:19:45

1. Johnson Counter

1.题目:

请用Verilog实现4位约翰逊计数器(扭环形计数器),计数器的循环状态如下。

电路的接口如下图所示


2.解题思路

        2.1 一个简单的状态机的配置。

        2.2 注意 起始状态 是 0000 就行


3.解题代码

`timescale 1ns/1ns

module JC_counter(
   input                clk ,
   input                rst_n,
 
   output reg [3:0]     Q  
);
parameter s0 = 4'b0000;
parameter s1 = 4'b1000;
parameter s2 = 4'b1100;
parameter s3 = 4'b1110;
parameter s4 = 4'b1111;
parameter s5 = 4'b0111;
parameter s6 = 4'b0011;
parameter s7 = 4'b0001;

always@(posedge clk or negedge rst_n)
    begin
        if(~rst_n)
            begin
                Q <= s0;
            end
        else 
            begin
                case (Q)
                    s0 : Q<=s1;
                    s1 : Q<=s2;
                    s2 : Q<=s3;
                    s3 : Q<=s4;
                    s4 : Q<=s5;
                    s5 : Q<=s6;
                    s6 : Q<=s7;
                    s7 : Q<=s0;
                    default: Q <= s0;
                endcase
            end
    end



endmodule


2.VL56 流水线乘法器

1.题目:

实现4bit无符号数流水线乘法器设计。


2.解题思路

        2.1 可以利用 for 的循环结构减轻代码量。

        2.2 第一个输入 作为 左移的判断位, 第二个作为左移的单位。

        2.3 然后所有的位置 相加。 


3.解题代码

`timescale 1ns/1ns

module multi_pipe#(
	parameter size = 4
)(
	input 						clk 		,   
	input 						rst_n		,
	input	[size-1:0]			mul_a		,
	input	[size-1:0]			mul_b		,
 
 	output	reg	[size*2-1:0]	mul_out		
);

reg[size*2 -1 :0]  data[size-1:0]; //定义一个存储数据的地方
reg[size*2 -1 :0]  data1;
reg	[size*2-1:0]	mul_out1;	
integer j;
always@(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				mul_out <=0;
				for(j=0; j<size; j=j+1)
					begin
						data[j] <=0;  //寄存器单位置0 
					end
			end
		else
			begin
				for(j=0;j<size ;j=j+1)
					begin
						data[j] <= {4'd0,mul_a} << (mul_b[j] ? j :8);  //
					end
				mul_out1 =0;//开始的时候清零 ,因为是堵塞赋值
				for(j=0;j<size ;j=j+1)
					begin
						mul_out1 = mul_out1+ data[j];//堵塞赋值可以这样用
					end
				mul_out <= mul_out1;//非堵塞赋值, 时序要求。
			end
	end




endmodule



3.VL57 交通灯

1.题目:

要求实现一个交通红绿灯,具有红黄绿三个小指示灯和一个行人按钮,正常情况下,机动车道指示灯按照60时钟周期绿灯,5个时钟周期黄灯,10个时钟周期红灯循环。当行人按钮按下,如果剩余绿灯时间大于10个时钟,则缩短为10个时钟,小于10个时钟则保持不变。

注:机动车道的指示灯和人行道指示灯应该是配对的,当机动车道的灯为绿或者黄时,人行道的灯为红;当机动车道的灯为红时,人行道的灯为绿,为简便起见,只考虑机动车道的指示灯。

模块的信号接口图如下:

 


2.解题思路

        2.1 这个题目做了半天 不懂!!

        2.2 观看题解后,震惊我了。  交通灯的循序   红 -> 黄 -> 绿 ???

        2.3 直接抄答案, 不懂!!

        


3.解题代码

别人的通关代码: (我是做不出!)

`timescale 1ns/1ns

module triffic_light
    (
		input rst_n, //异位复位信号,低电平有效
        input clk, //时钟信号
        input pass_request,
		output wire[7:0]clock,
        output reg red,
		output reg yellow,
		output reg green
    );
	
	parameter 	idle = 2'd0,
				s1_red = 2'd1,
				s2_yellow = 2'd2,
				s3_green = 2'd3;
	reg [7:0] cnt;
	reg [1:0] state;
	reg p_red,p_yellow,p_green;		//用于缓存信号灯的前一时刻的数值,判断上升沿


always @(posedge clk or negedge rst_n) 
    begin
        if(!rst_n)
        begin
			state <= idle;
			p_red <= 1'b0;
			p_green <= 1'b0;
			p_yellow <= 1'b0;			
        end
        else case(state)
		idle:
			begin
				p_red <= 1'b0;
				p_green <= 1'b0;
				p_yellow <= 1'b0;
				state <= s1_red;
			end
		s1_red:
			begin
				p_red <= 1'b1;
				p_green <= 1'b0;
				p_yellow <= 1'b0;
				if (cnt == 3) 
					state <= s2_yellow;
				else
					state <= s1_red;
			end
		s2_yellow:
			begin
				p_red <= 1'b0;
				p_green <= 1'b0;
				p_yellow <= 1'b1;
				if (cnt == 3) 
					state <= s3_green;
				else
					state <= s2_yellow;
			end
		s3_green:
			begin
				p_red <= 1'b0;
				p_green <= 1'b1;
				p_yellow <= 1'b0;
				if (cnt == 3) 
					state <= s1_red;
				else
					state <= s3_green;
			end
		endcase
	end
 
always @(posedge clk or negedge rst_n) 
      if(!rst_n)
			cnt <= 7'd10;
		else if (pass_request&&green&&(cnt>10))
			cnt <= 7'd10;
		else if (!green&&p_green)
			cnt <= 7'd60;
		else if (!yellow&&p_yellow)
			cnt <= 7'd5;
		else if (!red&&p_red)
			cnt <= 7'd10;	
		else cnt <= cnt -1;
 assign clock = cnt;

always @(posedge clk or negedge rst_n) 
        if(!rst_n)
			begin
				yellow <= 1'd0;
				red <= 1'd0;
				green <= 1'd0;
			end
		else 
			begin
				yellow <= p_yellow;
				red <= p_red;
				green <= p_green;
			end		

endmodule

自己写的 (时序图中间卡住了) (没有过关!!)

`timescale 1ns/1ns

module triffic_light
    (
		input rst_n, //异位复位信号,低电平有效
        input clk, //时钟信号
        input pass_request,
		output wire[7:0]clock,
        output reg red,
		output reg yellow,
		output reg green
    );
parameter s0 = 2'd0; //绿灯状态
parameter s1 = 2'd1; //黄灯状态
parameter s2 = 2'd2; //红灯状态

reg[1:0] flag;// 状态标志位
reg[6:0] cnt; //计数器
always@(posedge clk or negedge rst_n)
    begin
        if(~rst_n)
            begin
                flag  <=s0; //交通灯状态
                cnt  <= 7'd10;
               
            end
        else
            begin
                if(pass_request && flag ==s0  && (cnt>10))
                    begin
                        if(cnt >10)
                            begin
                                cnt <=10;
                            end
                    end
                else if(flag == s0 && cnt == 7'd0 )
                    begin
                        flag <= s1;
                        cnt  <= 4;
                    end
                else if(flag == s1 && cnt == 7'd0)
                    begin
                        flag <= s2;
                        cnt  <= 9;
                    end
                else if(flag == s2 && cnt == 7'd0)
                    begin
                        flag <= s0;
                        cnt  <= 59;
                    end
                else
                    begin
                        cnt <= cnt -1;
                    end

            end
    end

always@(posedge clk or negedge rst_n)
    begin
        if(~rst_n)
            begin
              
                red <=0;
                yellow <=0;
                green <=0;
            end
        else
            begin
                case (flag)
                    s0 :begin
                            green <=1;
                            yellow <=0;
                            red <=0;
                        end

                    s1 :begin
                        green <=0;
                        yellow <=1;
                        red <=0;
                    end

                    s2 :begin
                        green <=0;
                        yellow <=0;
                        red <=1;
                        end
                endcase    
            end
    end

assign clock = cnt;


endmodule


4.VL58 游戏机计费程序

1.题目:

要求实现一个游戏机计费模块,某游戏机具有多个模式,价格不同:普通模式每分钟1元,畅玩模式每分钟收费2元,默认情况下为普通模式,在boost按键按下之后进入畅玩模式。
游戏机采用预付费模式,输入端口money的数值为预付费用,在set信号有效时,将money的数值读入。输出端口remain的数值为剩余费用,当费用小于10元时,黄色信号灯yellow亮起。当费用不足时,红色信号灯red亮起,同时关闭电脑。在游戏过程中可以通过set端口续费。每次set信号有效将此时刻money的数值加到remain之中。
注:在程序中以每个时钟周期代表一分钟,每个单位大小表示1元。
模块的信号接口图如下:

 


2.解题思路:

  1. 根据boost类型确定每分钟/周期消费金额,注意充值所在分钟/周期是不消费的。
  2. 两个灯(red yellow)不能同时亮起,先判断红灯是否满足条件,再判断黄灯。


3.解题代码  (if  有点多)

`timescale 1ns/1ns

module game_count
    (
		input rst_n, //异位复位信号,低电平有效
        input clk, 	//时钟信号
        input [9:0]money,
        input set,
		input boost,
		output reg[9:0]remain,
		output reg yellow,
		output reg red
    );
parameter s0=1'd0; //普通模式
parameter s1=1'd1; //畅玩模式
reg[1:0] flag; //标记 电脑模式


always@(posedge clk or  negedge rst_n)
    begin
        if(~rst_n)
            begin
                remain <=0;
            end
        else
            begin
                if(boost == s0)
                    begin
                        if(set == 1'b1)
                            begin
                                remain <= remain +money;
                            end
                        else
                            begin
                                if(remain >0)
                                    begin
                                            remain <= remain -1;
                                    end
                                else
                                    begin
                                            remain <=remain;
                                    end
                            end
                        
                    end
                else if(boost == s1)   
                    begin
                        if(set == 1'b1)
                            begin
                                remain <= remain +money;
                            end
                        else
                            begin
                                if(remain >1)
                                    begin
                                            remain <= remain -2;
                                    end
                                else
                                    begin
                                            remain <=remain;
                                    end
                            end
                    end
            end
    end

always@(posedge clk or negedge rst_n)
    begin
        if(~rst_n)
            begin
                yellow <=0;
                red <=0;
            end
        else
            begin
                if(boost == s0)
                    begin
                        if(remain <1)
                            begin
                                red <=1;
                                yellow <=0;
                            end
                        else if(remain <10)
                            begin
                                red <=0;
                                yellow <=1;
                            end
                        else
                            begin
                                red <=0;
                                yellow <=0;
                            end
                    end
                else if(boost == s1)
                    begin
                        if(remain <2)
                            begin
                                red <=1;
                                yellow <=0;
                            end
                        else if(remain <10)
                            begin
                                red <=0;
                                yellow <=1;
                            end
                        else
                            begin
                                red <=0;
                                yellow <=0;
                            end
                    end

            end
    end


    
endmodule

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

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

相关文章

动态内存管理——C语言【进阶】(下)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;进阶C语言&#xff0c;本专栏主要讲解数据存储&#xff0c;进阶指针&#xff0c;动态内存管理&a…

前端面试题 - 计算机网络与浏览器相关

系列文章目录 vue常见面试题总结 htmlcss 面试题总结附答案 初级前端面试题总结&#xff08;html, css, js, ajax&#xff0c;http&#xff09; js基础面试题整理(包含ES5&#xff0c;ES6) 文章目录 系列文章目录一、网络协议相关1. 从浏览器地址栏输入url到显示页面的步骤…

蓝桥杯欲伸手CTF?有多远爬多远

注意&#xff1a;网络安全类比赛 或者说 CTF 参赛不会需要任何费用 只有国赛/省赛有可能会收取一定运维费用 其他比赛都不会收费 望周知。 先来看个特离谱的事情 早上起床看到几位师傅的朋友圈一脸懵&#xff0c;再仔细一看&#xff0c;好嘛。。。。。。 先看看探姬的回复 接下…

人工智能大模型多场景应用原理解析

前言 在上篇文章《人工智能大模型之ChatGPT原理解析》中分享了一些大模型之ChatGPT的核心原理后&#xff0c;收到大量读者的反馈&#xff0c;诸如:在了解了核心原理后想进一步了解未来的发展趋势(比如生成式人工智能和元宇宙能擦出什么样的火花&#xff1f;)&#xff0c;大模型…

伪命题之MYSQL分库分表

看到使用分库分表来解决性能问题的时候心里总是不能太理解。 如果同事发生大量请求的时候&#xff0c;损害性能的是硬盘的随机读。那么分库分表也没有对性能的瓶颈进行“分治”啊。 应该的做法是使用一块新的硬盘来创建分库。但是基本的文章都没有提到这点。而且基本上也不会有…

价值导向型研发管理数字化建设方案——易趋亮相CCTI中国研发管理峰会

4月15日-16日&#xff0c;由光环国际举办的2023 CCTI中国研发管理峰会在北京中关村国家自主创新示范区会议中心成功举办。 &#xff08;现场签到处&#xff09; 此次峰会邀请了20余位来自腾讯、华为、网易、阿里云等知名企业的研发管理领域专家&#xff0c;带来最新前沿知识和内…

【网络安全知识体系】外网渗透测试 | 14个小实验

写在前面&#xff1a;视频地址 成功上岸360&#xff01;0基础网络安全 入行 到 入yu、漏洞挖掘-外网渗透测试流程目录 一、导读&#xff1a; 二、汇总&#xff1a; 三、知识导图 四、面试常见问题 五、渗透测试流程 1、简述&#xff1a; 2、寻找测试目标 3、信息收集 …

webgl-简单动画

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

程序员必用的6个代码对比神器附下载地址

一、WinMerge WinMerge是一款基于Windows系统下的文件比较和合并工具&#xff0c;使用它可以非常方便地比较多个文档内容&#xff0c;适合程序员或经常需要撰写文稿的朋友使用。WinMerge会将两个文件内容做对比&#xff0c;并在相异之处以高亮度的方式显示&#xff0c;让使用者…

认识网络随机丢包

考虑一根漏水的管子&#xff0c;希望出水口接到和不漏的管子等量的水&#xff0c;要么靠时间&#xff0c;反复将漏掉的水重新注入&#xff0c;直到漏掉的水可忽略&#xff1a; ​ 要么靠空间&#xff0c;在漏的地方将管子加粗&#xff0c;一次性注入更多的水&#xff1a; 不…

什么是HTTP? HTTP和HTTPS的区别?

目录 1、什么是HTTP? 2、HTTP的特点 ① 支持客户/服务器模式 ② 简单快速 ③ 灵活 ④ 无连接 ⑤ 无状态 3、HTTPS 4、HTTP和HTTPS的区别 ① 安全性不同 ② 默认端口不同 ③ 响应速度和资源消耗不同 ④ 网站申请流程不同 ⑤ 对搜索排名的提升不同 1、什么是…

基于OpenCV的硬币面值识别

本项目通过Python与Opencv结合数字图像处理技术对&#xff11;元、&#xff15;角、&#xff11;角三种硬币进行识别。首先通过Canny算子对图像进行边缘检测&#xff0c;然后进一步调用定义的函数去除边缘检测后图像中的孤立点&#xff0c;对处理后的图像进行Hough变换检测圆曲…

涨点技巧: 谷歌强势推出优化器Lion,引入到Yolov5/Yolov7,内存更小、效率更高,秒杀Adam(W)

1.Lion优化器介绍 论文:https://arxiv.org/abs/2302.06675 代码:automl/lion at master google/automl GitHub 1.1 简单、内存高效、运行速度更快 1)与 AdamW 和各种自适应优化器需要同时保存一阶和二阶矩相比,Lion 只需要动量,将额外的内存占用减半; 2)由于 Lion…

港联证券|机器视觉迎重磅利好,5只概念股获两路资金加持

现在我国机器视觉在工业场景中的全体渗透率仍旧在10%以下&#xff0c;比照工业场景巨大的体量而言&#xff0c;机器视觉职业仍有较大开展空间。 近来*ST中潜收到广东证监局行政监管措施决定书。依据深交所的相关要求&#xff0c;公司应当在2023年1月31日前发表公司股票或许被停…

windows安装opencv-python(opencv-python源码安装)

因为我要开启opencv的GStreamer功能&#xff0c;这是和ffmpeg相类似的对视频流操作的一个功能&#xff0c;默认没有开启&#xff0c;需要手动编译。 安装方式链接: opencv-install-with-GStreamer 核心内容如下: git clone --recursive https://github.com/skvark/opencv-py…

数据结构_第十二关:二叉树的基础OJ题练习

目录 1.单值二叉树 2.相同的树 3.另一棵树的子树 4.反转二叉树 5.对称二叉树 6.二叉树的结构及遍历 扩展&#xff1a;如何判断是不是完全二叉树、二叉树的销毁 1&#xff09;判断是不是完全二叉树 2&#xff09;二叉树的销毁 1.单值二叉树 OJ题链接https://leetcode.…

传输协议特点大比拼之UDP

文章目录 前言一.UDP协议端的格式源端口号和目的端口号报文长度校验和 二.UDP的特点无连接面向数据报不可靠缓冲区 前言 本文将比较两种主要的传输协议 ,UDP的特点&#xff0c;以帮助读者更好地理解它们的应用场景和优缺点。 一.UDP协议端的格式 大家先来看一些UDP的报文格式…

企业应用程序单点登录

企业每天都依赖于各种企业应用程序&#xff0c;包括云和本地应用程序。这意味着用户必须经常输入更多密码才能访问这些应用程序并完成他们的工作。为了提高用户的工作效率、减少密码疲劳并使身份管理更有效&#xff0c;您的组织需要部署高效的 SSO 解决方案。 AD360 提供企业 …

[STM32F103C8T6]ADC转换

什么是ADC转换&#xff1f; ADC转换的全称是&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标&#xff1a; ADC分辨率&#xff1a; SSA与VREF-一起接到地&#xff0c;DDA与VREF接到3.3v&#xff0c;所以ADC转换的范围是0---3.3v 所以最后的…

计算机网络复习——第4章 4.2.3 4.2.4 4.3

4.2.3 IP 地址与 MAC 地址 IP地址&#xff1a;虚拟地址、软件地址、逻辑地址。 网络层和以上各层使用。 放在 IP 数据报的首部。 MAC地址&#xff1a;固化在网卡上的 ROM 中。硬件地址、物理地址。数据链路层使用。放在 MAC 帧的首部。IP 地址放在 IP 数据报的首部&#xff…