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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 基于canal的client-adapter数据同步必读指南

    基于canal的client-adapter数据同步必读指南

    2020年11月19日
  • 史上最全正则表达式

    史上最全正则表达式

    2022年3月7日
  • 临界区保护_临界地带

    临界区保护_临界地带1临界区保护1.1问题引入首先看一下如下问题:原因分析:根本原因在于读-改-写过程中随时会被打断,再恢复运行时写,导致打断过程中其它写的效果被覆盖。1.2临界区概念临界区的概念如下:临界区指的是访问多个任务共享资源的一段代码。当有任务进入临界区时,其它任务必须等待直至该任务离开临界区,以确定共享资源的访问不会冲突。由于共享资源的访问存在于任务与任务之间、任务与中断I…

    2022年10月30日
  • pytest报错_git是什么

    pytest报错_git是什么前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

    2022年7月31日
  • 踩坑啥意思_年轻人踩坑

    踩坑啥意思_年轻人踩坑Unity小科普老规矩,先介绍一下Unity的科普小知识:Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。也可以简单把Unity理解为一个游戏引擎,可以用来专业制作游戏!

    2022年9月4日
  • 安装完 socket.io 以后,客户端 404 问题

    安装完 socket.io 以后,客户端 404 问题

    2022年2月12日

发表回复

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

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