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


相关推荐

  • matlab 画图的颜色

    matlab 画图的颜色plot函数代表不同颜色的标示符一共有八种:y:黄色;k:黑色;w:白色;b:蓝色;g:绿色;r:红色;c:亮青色;m:锰紫色;其他的就要自己设定了,‘color’,[000];三原色你值得拥有;…

    2022年5月31日
    407
  • java输入Scanner基本用法[通俗易懂]

    java输入Scanner基本用法[通俗易懂]1.基本介绍java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入,每个next获取输入对应的字符。Scannersc=newScanner(System.in);当我们通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext与hasNextLine判断是否还有输入的数据:next()–>hasNext() nextLine()–…

    2022年7月7日
    36
  • Java中HashMap的用法

    Java中HashMap的用法HashMap学习java基础的时候对map不熟悉,再加上图算法经常用到这个结构来存储,特此加一篇文章来介绍Mapimportjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map.Entry;publicclassHashMap{publi……

    2022年7月26日
    16
  • 人脸去重算法_哈希去重算法

    人脸去重算法_哈希去重算法对比其他算法『百度的去重算法』百度的去重算法最简单,就是直接找出此文章的最长的n句话,做一遍hash签名。n一般取3。工程实现巨简单,据说准确率和召回率都能到达80%以上。『shingle算法』shingle原理略复杂,不细说。shingle算法我认为过于学院派,对于工程实现不够友好,速度太慢,基本上无法处理海量数据。『其他算法』具体看微博上的讨论…

    2025年7月20日
    5
  • 1165. 单词环(spfa求负环)「建议收藏」

    1165. 单词环(spfa求负环)「建议收藏」我们有 n 个字符串,每个字符串都是由 a∼z 的小写英文字母组成的。如果字符串 A 的结尾两个字符刚好与字符串 B 的开头两个字符相匹配,那么我们称 A 与 B 能够相连(注意:A 能与 B 相连不代表 B 能与 A 相连)。我们希望从给定的字符串中找出一些,使得它们首尾相连形成一个环串(一个串首尾相连也算),我们想要使这个环串的平均长度最大。如下例:ababcbckjacacaahoynaab第一个串能与第二个串相连,第二个串能与第三个串相连,第三个串能与第一个串相连,我们按照此顺序相连,

    2022年8月9日
    4
  • 代码走查总结[通俗易懂]

    代码走查总结[通俗易懂]什么是代码走查代码走查就是,项目开发人员在一起,对代码进行讨论。项目开发人员可以向大家阐述代码的逻辑和写代码的思路!在向别人阐述的时候,会发现做自己写的代码出现的一些问题。收获我进行代码阐述的时候,是按照功能来进行的,在阐述的过程中,我能感觉到我自己是清楚这个逻辑思路的,但是说着说着就发现了一些说不通的地方,还有一些不合理的地方。这让我突然想到了,之前出现的一个bug但是,死活不知道是…

    2025年7月31日
    8

发表回复

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

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