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


相关推荐

  • IIC通信协议技术说明

    IIC通信协议技术说明简介IICBus最早是Philips半导体开发的两线时串行总线,经常用于微控制器和外设之间的连接。IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485为半双工,SPI和UART为全双工。网络拓扑SDA:串行数据线SCL:串行时钟线数据传输每个字节传输必须带有响应位ACK,相关的响应时钟也有主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。SCL第9位时钟高电平信号期间,SDA拉低代表了有ACK响应位。当出现非响应NACK位:

    2022年6月3日
    36
  • “did not call through to super.onResume”问题解决「建议收藏」

    “did not call through to super.onResume”问题解决「建议收藏」1.错误信息:12-2322:47:26.720:W/dalvikvm(3864):threadid=1:threadexitingwithuncaughtexception(group=0x410af9d8)12-2322:47:26.720:E/AndroidRuntime(3864):FATALEXCEPTION:main12-2322:47:26

    2022年6月2日
    34
  • mybatis在web启动时Could not resolve type alias ‘User'[通俗易懂]

    mybatis在web启动时Could not resolve type alias ‘User'[通俗易懂]mybatis在web启动时Could not resolve type alias ‘User’

    2022年4月23日
    173
  • Cassandra SizeTieredCompaction策略解析

    Cassandra SizeTieredCompaction策略解析

    2021年8月18日
    56
  • 基于LM331的频率电压转换电路「建议收藏」

    基于LM331的频率电压转换电路「建议收藏」常用的模拟信号的传输方式有电压传输、电流传输和频率传输,其中电压传输的方式最为简单方便,成本最低,但是电压信号在传输的过程中最容易受到干扰,并且传输过程会有损耗,因此不适合远距离传输。将电压转换为电流或者频率后,可以进行远距离传输,且抗干扰能力强,其中电流传输的抗干扰能力最好,传输距离最远,但是成本较高,而频率在距离超过100m时波形会失真,抗干扰能力介于电压和电流之间。本文主要介绍基于LM331的频率-电压转换电路,关于LM331的简介和电压-频率转换电路可以参考《基于LM331的电压频率转换电路》。

    2022年5月5日
    144
  • 算术几何平均matlab,算术-几何平均数——高斯的发现

    算术几何平均matlab,算术-几何平均数——高斯的发现“算术-几何平均数”既不是算术平均数,也不是几何平均数,由素有“数学王子”之称的德国数学家高斯首先发现和研究。算术-几何平均数,当然与“算术平均数”和“几何平均数”这两个概念有很深的关系。我们知道,但凡一个数学概念或定理,哪怕再简单不过,只要和高斯扯上关系,那就一定不简单了。带着耐心,我们来看看高斯关于算术-几何平均数的研究。预备知识对于两个正实数a和b(不妨设0我们有基本不等式,等号当且仅当a=…

    2025年6月7日
    0

发表回复

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

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