verilog 移位寄存器与流水灯「建议收藏」

verilog 移位寄存器与流水灯「建议收藏」用Verilog写一个简单的多功能移位寄存器,并在移位寄存器的基础上进行修改,利用移位功能形成流水灯的效果基本的功能如下:寄存器示意图见下方虚拟面板图有两种改进方式:第一种是把最后一个功能改成循环右移,即此功能模式下,按一下时钟按键(代表时钟信号到来),高三位往右移一位,最低位移动到最高位。按一次移位一次,形成流水灯效果第二种在第一种的基础上把按键时钟改成接入内部时钟,每隔一段时间时钟…

大家好,又见面了,我是你们的朋友全栈君。

用Verilog写一个简单的多功能移位寄存器,并在移位寄存器的基础上进行修改,利用移位功能形成流水灯的效果
基本的功能如下:
在这里插入图片描述
寄存器示意图见下方虚拟面板图
有两种改进方式:
第一种是把最后一个功能改成循环右移,即此功能模式下,按一下时钟按键(代表时钟信号到来),高三位往右移一位,最低位移动到最高位。按一次移位一次,形成流水灯效果
第二种在第一种的基础上把按键时钟改成接入内部时钟,每隔一段时间时钟信号来临一次,无需手动操作,形成自动移位的流水灯效果

基本功能的移位寄存器的主要文件Virtual_Lab_Top.v中的代码:

//移位寄存器实验
`default_nettype none 
module Virtual_Lab_Top 
(
    input  wire  CLOCK,
    input  wire  [4:0] BUTTON, //按键
    input  wire [35:0] SWITCH, //开关
    output wire [35:0] LED,    //指示灯 
    output wire  [3:0] HEX0,   //数码管
	 output reg   [3:0] Z
); 

//输入端口赋值给内部信号
wire C    = BUTTON[1];
wire R    = BUTTON[0];
wire E    = SWITCH[6];
wire f1   = SWITCH[5];
wire f0   = SWITCH[4];
wire [3:0] X = SWITCH[3:0];

//实验逻辑
wire i;
wire [3:0] D;
assign i = f1&~f0&Z[3];
assign D = {4{~f1&f0}}&X|{4{f1&i}};

always @ (posedge C or posedge R)
begin
	if(R)
		Z<=0;
	else if(C&E&~f1)
		Z<=D;
	else
		Z<={i,Z[3:1]};
end

//内部信号赋值给输出端口(指示灯)观察
assign LED[3:0]  = Z[3:0];

//内部信号赋值给输出端口(数码管)观察
assign HEX0 = D;

endmodule

第一种改进后主要文件Virtual_Lab_Top.v中的代码:

//流水灯实验
`default_nettype none 
module Virtual_Lab_Top 
(
    input  wire  CLOCK,
    input  wire  [4:0] BUTTON, //按键
    input  wire [35:0] SWITCH, //开关
    output wire [35:0] LED,    //指示灯 
	 output reg   [3:0] Z
); 

//输入端口赋值给内部信号
wire C    = BUTTON[1];
wire R    = BUTTON[0];
wire E    = SWITCH[6];
wire f1   = SWITCH[5];
wire f0   = SWITCH[4];
wire [3:0] X = SWITCH[3:0];

//实验逻辑
wire i;
assign i = f1&~f0&Z[3];

always @ (posedge C or posedge R)
begin
	if(R)
		Z<=0;
	else if(C&E&~f1&~f0)
		Z<={Z[0],Z[3:1]};
	else if(C&E&~f1&f0)
		Z<=X;
	else
		Z<={i,Z[3:1]};
end

//内部信号赋值给输出端口(指示灯)观察
assign LED[3:0]  = Z[3:0];

endmodule

第二种改进:
把第一种改进的代码中的 wire C = BUTTON[1]; 这条语句删掉,然后把 always @ (posedge C or posedge R) 语句中的C改成CLOCK。我们要接入内部时钟,所以要先把按键时钟删掉。
加入分频器文件clock_divider.v,采用的是偶分频方法。一般板子的晶振频率太高,所以要将原有时钟频率分频降低,常见板子的晶振频率为50MHz,以这个频率为标准,在工程中的JuLabPocket_TOP.v文件中,将直接接入原频率的语句 wire CLOCK = CLOCK_50; 删去,然后在该文件合适处加入下列语句

//------------ 时钟 --------------------------------------------------------// 
	wire CLOCK_divided;
	//使用时钟分频器模块产生1kHz的时钟。可以修改RATIO参数改变输出频率。
	clock_divider #(.RATIO(10000000)) clk_inst(.clkin(CLOCK_50), .rst(1'b0), .clkout(CLOCK_divided));

   wire CLOCK = CLOCK_divided;  //用分频后的CLOCK_divided作为时钟
 

这样调用了分频器给时钟信号变量接入分频后的频率,如果流水灯移位的速度还是太快,可以把参数RATIO调大,太慢就调小,建议直接在后面加一个0或减一个0或着减半

完整的工程文件我已经上传到CSDN了,可以去我的主页查看并下载完整的工程文件进行使用,压缩包中有三个文件夹,对应三个版本的完整工程文件,基础版本的是shifter文件夹,第一种改进的是led文件夹,第二种改进的是CLOCK & led文件夹,若CLOCK & led文件夹的工程文件不能在Quartus II中正常打开,则把文件夹名中的&符号删掉再打开即可
前两种版本的工程内包含文件如下图,第三种的多了一个clock_divider.v:
在这里插入图片描述
WeLab虚拟面板设置图片:

在这里插入图片描述
以上为基础版本,第一种改进版本删去数码管,第二种改进版本删去clock时钟对应的按键
X输入数据,f1、f0是输入控制位F的高位和地位,数码管表示选择器的结果,enable开关置1则使能,置0则不使能,重置按键重置显示结果,按键时钟按下即代表时钟信号来临一次

注意:接入内部时钟的时候虚拟实验板由于软件的接收静态数据原因可能显示不出来流水灯的自动移位动态效果,但实际板子上会有效果显示出来,实际板子上分配的led灯真的会有流水灯的自动移位动态效果,如果是使用实际的实验板可以观察实验板

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160230.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQLldr_sqlldr远程数据库

    SQLldr_sqlldr远程数据库1.SQLLDR导入 1.1简介 SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。 2.2语法和参数语法:SQLLDRkeyword=value[,keyword=value,..

    2025年7月30日
    3
  • 【数据结构】— kmp算法和strstr函数

    【数据结构】— kmp算法和strstr函数kmp算法和strstr函数注:现实生活中,字符串匹配在很多的应用场景里都有着极其重要的作用,包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测等等,至此诞生了很多的算法,那么我们今天就来探索这两种经典的算法。一、概念分析首先我们需要了解到什么是kmp算法和strstr函数概念如下:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R….

    2022年6月25日
    23
  • cultural context_servlet访问路径

    cultural context_servlet访问路径绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程

    2025年12月12日
    2
  • 指针函数到函数指针作为函数的返回值

    指针函数到函数指针作为函数的返回值转载自:https://www.cnblogs.com/yangjiquan/p/11465376.html首先说一下指针函数:1.指针函数的定义顾名思义,指针函数即返回指针的函数。其一般定义形式如下:类型名*函数名(函数参数表列);其中,后缀运算符括号”()”表示这是一个函数,其前缀运算符星号”*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个”指向返回值为…的指针(地址),”类型名”表示函数返回的指针指向的类…

    2022年6月22日
    25
  • 微软hlk服务器密码,Windows HLK 安装程序疑难解答「建议收藏」

    微软hlk服务器密码,Windows HLK 安装程序疑难解答「建议收藏」WindowsHLK安装程序疑难解答10/15/2017本文内容本文包含的信息可帮助你解决Windows硬件实验室工具包(WindowsHLK)安装和设置问题。无法在Studio或客户端计算机上浏览\\\HLKInstall\如果无法从WindowsHLKStudio或客户端浏览到HLKInstall文件夹,请查看在测试服务器上的”步骤1:安装控制器和工作室”主题中…

    2022年5月5日
    90
  • 玩儿转ffmeg的7个技巧「建议收藏」

    玩儿转ffmeg的7个技巧「建议收藏」转载自:http://blog.csdn.net/c395565746c/article/details/6528357 FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg-formats查看FFmpeg支持的视音频格式,左侧若是E表明可以编码,D表明可

    2022年9月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号