【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL62

news2024/11/16 6:35:27

序列发生器

描述

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

模块的接口信号图如下:

要求使用Verilog HDL实现,并编写testbench验证模块的功能。

输入描述:

clk:时钟信号

rst_n:复位信号,低电平有效

输出描述:

data:输出数据

解题思路

序列信号发生器设计步骤如下:

①确定寄存器的个数n;

由于M(序列信号的长度)= 6,所以n≥3;接下来

②确定寄存器的六个独立状态;

将序列码001011按照移位规律每三位一组,可划分为六个状态:001、010、101、011、110、100

③列态序表和反馈激励函数表;

态序表 

Q_0^nQ_1^nQ_2^nQ_0^{n+1}Q_1^{n+1}Q_2^{n+1}
001010
010101
101011
011110
110100
100001
000001
111110

反馈激励函数表 

Q_0Q_1Q_2F
0010
0101
1011
0110
1100
1001

将态序表的每下一状态所需要的移位(左移)输入作为该状态对应的反馈函数输出

即:Q_0^{n+1} = Q_1^n, Q_1^{n+1} = Q_2^n, Q_2^{n+1} = F

根据反馈激励函数表,画卡诺图

当设计最终的序列输出时,我们发现最后的输出序列为状态Q0的值(因为每次从Q0端移出数据) ;因此

④列出三大方程

状态方程D_0= Q_1^n, D_1 = Q_2^n, D_2 = F=\overset{-}Q_0Q_2+Q_0\overset{-}Q_1

特征方程Q_0 = D_0,Q_1 = D_1, Q_2 = D_2(注意:该题的Q0Q1Q2有初始值,若不设置初始值(如错误代码所示),结果错误)

输出方程Data = Q_0

因此,我们给出了以下两种代码方式;

代码一:例化触发器

`timescale 1ns/1ns
//输出序列:“001011”
module sequence_generator(
	input clk,
	input rst_n,
	output reg data
	);

	wire d0, d1, d2;
	wire q0, q1, q2;

	assign d0 = q1;
	assign d1 = q2;
	assign d2 = ~q0&~q2 | q0&~q1;

	DFF D0(.d({d2,d1,d0}), .clk(clk), .rst_n(rst_n), .q({q2,q1,q0}));

	always @(posedge clk or negedge rst_n) begin
		if (!rst_n) data <= 1'b0;
		else 	data <= q0;
	end

endmodule

//例化D触发器
module DFF (
	input	[2:0] 		d,
	input 		clk,
	input 		rst_n,
	output reg [2:0]	q
);
	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)	q[2:0] = 3'b100;
		else q[2:0] = d[2:0];
	end

endmodule

代码二: 不例化触发器

`timescale 1ns/1ns
//输出序列:“001011”
module sequence_generator(
	input clk,
	input rst_n,
	output reg data
	);

	reg q0, q1, q2;

	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)	begin
			q0 <= 1'b0;
			q1 <= 1'b0;
			q2 <= 1'b1;
		end
		else  begin
			q0 <= q1;
			q1 <= q2;
			q2 <= ~q0&~q2 | q0&~q1;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if (!rst_n) data <= 1'b0;
		else 	data <= q0;
	end

endmodule

错误代码:(即未考虑Q0、Q1、Q2的初始值) 

将Q0、Q1、Q2均使用带复位端的D触发器例化;

`timescale 1ns/1ns
//输出序列:“001011”
module sequence_generator(
	input clk,
	input rst_n,
	output reg data
	);

	wire F;
	wire d0, d1, d2;
	wire q0, q1, q2;

	assign d0 = q1;
	assign d1 = q2;
	assign d2 = ~q0&q1&~q2 | q0&~q1;

	DFF D0(.d(d0), .clk(clk), .rst_n(rst_n), .q(q0));
	DFF D1(.d(d1), .clk(clk), .rst_n(rst_n), .q(q1));
	DFF D2(.d(d2), .clk(clk), .rst_n(rst_n), .q(q2));

	always @(posedge clk or negedge rst_n) begin
		if (!rst_n) data <= 1'b0;
		else 	data <= q0;
	end

endmodule

//例化D触发器
module DFF (
	input 		d,
	input 		clk,
	input 		rst_n,
	output	reg	q
);
	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)	q = 1'b0;
		else q = d;
	end

endmodule

我们再给出一种解法,使用有限状态机

解法二:有限状态机

注意:此处将IDLE注释掉,结果仍然正确。

`timescale 1ns/1ns
//输出序列:“001011”
module sequence_generator(
	input clk,
	input rst_n,
	output reg data
	);
//代码三
	reg [2:0] current_state, next_state;

	parameter IDLE = 3'b000;
	parameter S1 = 3'b001;
	parameter S2 = 3'b010;
	parameter S3 = 3'b101;
	parameter S4 = 3'b011;
	parameter S5 = 3'b110;
	parameter S6 = 3'b100;

	always @(posedge clk or negedge rst_n) begin
		if (!rst_n) current_state <= IDLE;
		else	current_state <= next_state;
	end

	always @(*) begin
		case (current_state)
		IDLE:begin next_state = S1;	data <= 1'b0; end
		S1: begin  next_state = S2; data <= 1'b0; end
		S2: begin  next_state = S3; data <= 1'b0; end
		S3: begin  next_state = S4; data <= 1'b1; end
		S4: begin  next_state = S5; data <= 1'b0; end
		S5: begin  next_state = S6; data <= 1'b1; end
		S6: begin  next_state = S1; data <= 1'b1; end
		default: begin next_state = S1; data <= 1'b0; end
		endcase
	end
endmodule

 

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

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

相关文章

【学习笔记】手写 Tomcat 七

目录 一、优化 Dao 1. 设置 UserDaoImpl 为单例模式 2. 创建 Dao 工厂 3. 在 Service 层获取 UserDao 的实例 二、优化 Service 1. 设置 UserServiceImpl 为单例模式 2. 创建 Service 工厂 3. 在 Servlet 层获取 Service 实现类的对象 三、优化 Servlet 1. 使用配置…

Map+Set

我们前面接触过的string、vector、list这些都算序列式容器&#xff0c;它们都有一定的关联性&#xff0c;即使随便换位置也无伤大雅&#xff0c;因为是它们靠位置顺序来保存的。但是今天的MapSet就不是了&#xff0c;它们算关联式容器&#xff0c;两个位置之间有紧密的联系&…

Linux-df命令使用方法

Linux-df&#xff08;disk filesystem&#xff09;命令 df 命令是 Unix 和 Linux 系统中用于报告文件系统磁盘空间使用情况的工具。 df [OPTION]... [FILE]...OPTION 常用选项&#xff08;博主一般df -h用的较多&#xff0c;可读性较好&#xff09; -h&#xff1a;以人类可读的…

Uniapp 微信小程序 最新 获取用户头像 和 昵称 方法 有效可用

文章目录 前言代码实现运行效果技术分析 前言 同事有个需求 授权获取用户头像 和 昵称 。之前做过线上小程序发版上线流程 就实现了下 最新的方法和 api 有些变化 记录下 代码实现 先直接上代码 <template><view class"container"><buttonclass&qu…

如何部署北斗定位应用,基于国产自主架构LS2K1000LA-i处理器平台

北斗卫星导航系统(以下简称北斗系统)是着眼于国内经济社会发展需要,自主建设、独立运行的卫星导航系统。经过多年发展,北斗系统已成为面向全球用户提供全天候、全天时、高精度定位、导航与授时服务的重要新型基础设施。 图 1 北斗定位系统的应用优势 强可控:北斗系统是国…

Ollama本地部署大模型及应用

文章目录 前言一、下载安装1.Mac2.Windows3.linux4.docker5.修改配置&#xff08;可选&#xff09;1.linux系统2.window 系统3.mac系统 二、Ollama使用1.命令2.模型下载3.自定义模型4.API 服务 三、Open WebUI 使用四、Dify使用 前言 Ollama 是一个专注于本地部署大型语言模型…

第四届摩纳哥智能化可持续发展游艇码头交流会

第四届摩纳哥智能化可持续发展游艇码头交流会 游艇生态和经济转型 2024年9月23日&#xff0c;第四届摩纳哥智能化可持续发展游艇码头交流会于摩纳哥游艇俱乐部顺利落幕。该交流会由摩纳哥游艇码头顾问公司&#xff08;M3&#xff09;主办&#xff0c;吸引了全球250名游艇行业领…

数据集-目标检测系列-口罩检测数据集 mask>> DataBall

数据集-目标检测系列-口罩检测数据集 mask>> DataBall 数据集-目标检测系列-口罩检测数据集 mask 数据量&#xff1a;1W DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;享有百种数据集&#xff0c;持续增加中。 数据项目地址&#xff1a; gitcode: https…

JAVA笔记 | 实际上用到的策略模式(可直接套用)

自己开发中用到了策略模式&#xff0c;这样写不一定是最好的&#xff0c;但是满足了业务场景跟使用要求&#xff0c;做个笔记&#xff0c;下次有用到可以快速复习跟套用 假设使用场景&#xff1a;有几只宠物&#xff0c;猫跟狗等&#xff0c;要求他们做各种动作&#xff0c;比如…

无人机之物流货运篇

一、无人机货运的崛起 随着电商、快递行业的蓬勃发展&#xff0c;传统的地面物流已经难以满足日益增长的快递量和对速度的追求。而无人机货运凭借其高效、快捷、灵活的特点&#xff0c;逐渐成为了物流行业的新宠。无人机可以在城市上空快速穿梭&#xff0c;不受地面交通拥堵的限…

语言模型发展史

四个阶段 第一阶段&#xff1a;基于规则和统计的语言模型 由人工设计特征并使用统计方法对固定长度的文本窗口序列进行建模分析&#xff0c;这种建模方式也被称为N-gram语言模型。 优点&#xff1a; 1&#xff09;采用极大似然估计, 参数易训练 2&#xff09;完全包含了前n-…

Arthas vmtool(从 jvm 里查询对象,执行 forceGc)

文章目录 二、命令列表2.1 jvm相关命令2.1.15 vmtool&#xff08;从 jvm 里查询对象&#xff0c;执行 forceGc&#xff09;举例1&#xff1a;获取对象 二、命令列表 2.1 jvm相关命令 2.1.15 vmtool&#xff08;从 jvm 里查询对象&#xff0c;执行 forceGc&#xff09; vmtoo…

nodejs 014: React.FC 与 Evergreen(常青树) React UI 框架的的Dialog组件

React.FC React.FC是React中用于定义函数组件“Function Component”的类型。它代表&#xff0c;可以帮助你在TypeScript中提供类型检查和自动补全。使用React.FC时&#xff0c;可以明确指定组件的props类型&#xff0c;并且它会自动推导children属性。下面是一个使用 React.F…

微服务-- Gateway服务网关

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 为什么需要网关…

从0开始linux(5)——vim

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 vim的多种模式底行模式命令命令模式视块模式&#xff08;visual block&#xff09; vim的配置 vim是linux系统的文本编辑器。就像windows的记事本一样。 使用vim指令可以使用vim打开一个文本文…

MacOS多桌面调度快捷键

单桌面调度快捷键 可能是我用着妙控鼠标用着不习惯&#xff0c;所以追求快捷键操作&#xff0c;看起来也比较酷。而且在Windows上&#xff0c;我基本不使用多桌面&#xff0c;但是看着同事用Mac的多桌面用的飞起&#xff0c;炫酷程度不亚于win7的Windows键Tab。在不使用多桌面的…

小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态

随着信息技术的飞速发展&#xff0c;企业在处理海量数据时所面临的挑战日益严峻。特别是在年轻娱乐领域&#xff0c;用户行为的多样性和数据量的激增对数据存储与分析技术提出了更高的要求。在此背景下&#xff0c;小川凭借其前瞻性的技术视野&#xff0c;选择了MongoDB作为其数…

乒乓buffer(国科微笔试填空)_2024年9月26日

乒乓buffer是否提高了并行度&#xff1f;是 流水线式处理&#xff0c;提高并行度 位宽为4&#xff0c;深度为8的sram&#xff1a; 当sel拉高时&#xff0c;a、b模块在wren和rden有效时分别写和读&#xff1b;当sel拉低时&#xff0c;a、b模块在rdenwren有效时分别读和写

远程访问软路由

远程访问软路由主要涉及通过互联网从远程位置访问和控制基于软件的路由器系统。以下是远程访问软路由的一般方法&#xff1a; 一、远程访问软路由的方法 通过Web管理界面访问&#xff1a; 适用于大多数支持Web管理的软路由系统。用户只需在浏览器中输入软路由的公网IP地址或域…

【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)

文章目录 一、sizeof和strlen的对⽐1.sizeof2.strlen3.sizeof与strlen对比 二、数组和指针笔试解析1.一维数组2.字符、字符串数组和字符指针代码1代码2代码3代码4代码5代码6 3.二维数组4.总结 三、指针运算笔试题解析代码1代码2代码3代码4代码5代码6 一、sizeof和strlen的对⽐ …