系统功能

设计一个8位双向移位寄存器,实现并行输入数据、数据左移、右移、清空数据的功能。

设计要求

(1)可以并行置数(用4位拨码开关置数两次得到8位数据);
(2)并行输出(8个led显示)功能;
(3)具有双向移位输出能力(用按键选择功能);
(4)具有异步清零信号;

设计方案

程序主要包括移位寄存器模块和按键去抖模块

① Key1 控制拨码输入:

a) key_flag1, key_state1实现Key1去抖(if(key_flag1 && (!key_state1)));
b) key_cnt [3:0]从0开始在每一次Key1 按下后加1,累积到3后再按下Key1, key_cnt 清零;
c) en_num1为高4位输入使能信号,en_num2为低4位输入使能信号,en_num3为输入确认使能信号(都为高水平有效);
d) key_cnt 的数值控制c)中3个使能信号的值;

② Key2 , Key3控制移位方向:

a) 按键去抖同Key1 a);
b) turn_left为左移使能信号,turn_right为右移使能信号(都为高水平有效);
c) key_cnt 的数值控制c)中3个使能信号的值;

③ Clk 同步时钟信号,Reset异步清零:

Verilog源代码

//1、移位寄存器模块module shift_register(input  clk,
input  rst_n,input sw1,
input sw2,
input sw3,
input sw4,input key_in_num, // 控制数字输入按键,按下第一次输入高4位,再按下一次输入低4位,然后再点两下确认输完数字
input key_left,     // 控制左循环按键
input key_right,    // 控制右循环按键output [7:0] led
);wire  key_flag1,key_state1,key_flag2,key_state2,key_flag3,key_state3;key_filter key_filter0(
.key_in     (key_in_num),
.clk            (clk),
.rst_n      (rst_n),
.key_flag   (key_flag1),
.key_state  (key_state1)
);
reg  en_num1;
reg  en_num2;
reg  en_num3;
reg [2:0]key_cnt;// key1按下次数改变key_cnt值
always @(posedge clk or negedge rst_n)
beginif(!rst_n)key_cnt<=3'd0;else if(key_flag1&&(!key_state1))beginif(key_cnt==3)key_cnt<=3'b000;elsekey_cnt<=key_cnt+1'b1;endelsekey_cnt<=key_cnt;end// key_cnt值控制置数信号
always @(posedge clk or negedge rst_n )
begin if(!rst_n)beginen_num1<=1'b0;en_num2<=1'b0;en_num3<=1'b0;endelse begincase(key_cnt)0:beginen_num1<=1'b0;en_num2<=1'b0;en_num3<=1'b0;end1:beginen_num1<=1'b1;en_num2<=1'b0;en_num3<=1'b0;end2:beginen_num1<=1'b0;en_num2<=1'b1;en_num3<=1'b0;end3:beginen_num1<=1'b0;en_num2<=1'b0;en_num3<=1'b1;enddefault:beginen_num1<=1'b0;en_num2<=1'b0;en_num3<=1'b0;endendcaseendendreg   turn_left;
reg   turn_right;key_filter key_filter2(
.key_in     (key_left),
.clk            (clk),
.rst_n      (rst_n),
.key_flag   (key_flag2),
.key_state  (key_state2)
);key_filter key_filter3(
.key_in     (key_right),
.clk            (clk),
.rst_n      (rst_n),
.key_flag   (key_flag3),
.key_state  (key_state3)
);// key2, key3控制移位方向
always @(posedge clk or negedge rst_n)
beginif(!rst_n)beginturn_left<=1'b0;turn_right<=1'b0;endelse if(key_flag2&&(!key_state2))beginturn_left<=1'b1;turn_right<=1'b0;endelse if(key_flag3&&(!key_state3))beginturn_left<=1'b0;turn_right<=1'b1;endelsebeginturn_left<=1'b0;turn_right<=1'b0;endendreg [7:0] t_data;
reg  [7:0] r_data;always @(posedge clk or negedge rst_n)
beginif(!rst_n)t_data<=8'd0;else if(en_num1)t_data[7:4]<={sw1,sw2,sw3,sw4};else if(en_num2)t_data[3:0]<={sw1,sw2,sw3,sw4};else t_data<=t_data;end// 移位always @(posedge clk or negedge rst_n)
beginif(!rst_n)r_data<=8'd0;else if(en_num3)
// en_num3==1确认输入 r_data<=t_data;else if(turn_left)r_data<={r_data[6:0],r_data[7]};else if(turn_right)r_data<={r_data[0],r_data[7:1]};elser_data<=r_data;endassign led=r_data;endmodule
//2、按键防抖模块module key_filter(
key_in,
clk,
rst_n,
key_flag,
key_state);input key_in;
input clk;
input rst_n;output reg key_flag;
output reg key_state;reg key_s0,key_s1,key_s2,key_s3;
wire pose,nege;
reg [3:0]state;
reg en_cnt;
reg [24:0]cnt;
reg cnt_full;localparam IDLE=4'b0001,FILTER=4'b0010,DOWN=4'b0100,FILTER0=4'b1000;always@(posedge clk or negedge rst_n)beginif (rst_n==0)beginkey_s0<=1'b0;key_s1<=1'b0;endelse beginkey_s0<=key_in;key_s1<=key_s0;endendalways@(posedge clk or negedge rst_n)beginif (rst_n==0)beginkey_s2<=1'b0;key_s3<=1'b0;endelse beginkey_s2<=key_s1;key_s3<=key_s2;endendassign pose=(!key_s3)& key_s2;assign nege=key_s3&&(!key_s2);always@(posedge clk or negedge rst_n)beginif (rst_n==0)cnt<=25'd0;else if(en_cnt)beginif(cnt==999_999)cnt<=25'd0;elsecnt<=cnt+1'b1;endelsecnt<=25'd0;endalways@(posedge clk or negedge rst_n)beginif (rst_n==0)cnt_full<=1'b0;else if(cnt==999_999)cnt_full<=1'b1;elsecnt_full<=1'b0;endalways@(posedge clk or negedge rst_n)beginif (rst_n==0)beginstate<=IDLE;en_cnt<=1'b0;key_flag<=1'b0;key_state<=1'b1;endelse begincase(state)IDLE:beginkey_flag<=1'b0;if(nege)beginen_cnt<=1'b1;state<=FILTER;endelsestate<=IDLE;endFILTER:if(cnt_full)beginen_cnt<=1'b0;key_flag<=1'b1;key_state<=1'b0;state<=DOWN;endelse if(pose)beginstate<=IDLE;en_cnt<=1'b0;endelse state<=FILTER;DOWN:beginkey_flag<=1'b0;if(pose)beginen_cnt<=1'b1;state<=FILTER0;endelsestate<=DOWN;endFILTER0:if(cnt_full)beginen_cnt<=1'b0;key_flag<=1'b1;key_state<=1'b1;state<=IDLE;endelse if(nege)beginstate<=DOWN;en_cnt<=1'b0;endelsestate<=FILTER0;default:beginstate<=IDLE;en_cnt<=1'b0;key_flag<=1'b0;key_state<=1'b1;endendcaseendendendmodule
//3、 testbench测试脚本(未加入防抖模块)`timescale 1 ps/ 1 ps
module shift_8in_2direction_register_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg en_num1;
reg en_num2;
reg en_num3;
reg rst_n;
reg sw1;
reg sw2;
reg sw3;
reg sw4;
reg turn_left;
reg turn_right;
// wires
wire [7:0]  led;// assign statements (if any)
shift_8in_2direction_register i1 (
// port map - connection between master ports and signals/registers   .clk(clk),.en_num1(en_num1),.en_num2(en_num2),.en_num3(en_num3),.led(led),.rst_n(rst_n),.sw1(sw1),.sw2(sw2),.sw3(sw3),.sw4(sw4),.turn_left(turn_left),.turn_right(turn_right)
);initial clk=0;
always #10 clk=~clk;initial
begin// 第一组测试数据 输入(0100_0000) 先左移5次 后右移5次 rst_n=0;sw1=0;sw2=0;sw3=0;sw4=0;en_num1=0;en_num2=0;en_num3=0;turn_left=0;turn_right=0;//#100;rst_n=1;// 为高四位赋(0100)#100;en_num1=1;sw1=0;sw2=1;sw3=0;sw4=0;#100;en_num1=0;// 为低四位赋(0000)#100;en_num2=1;sw1=0;sw2=0;sw3=0;sw4=0;#100;en_num2=0;// 确认输入#100;en_num3=1;#100;en_num3=0;// 左移#100;turn_left=1;#100;turn_left=0;// 右移#100;turn_right=1;#100;turn_right=0;// 开始测试第二组数据 类似上组 输入(0001_1110)#100;rst_n=0;#100;rst_n=1;#100;en_num1=1;sw1=0;sw2=0;sw3=0;sw4=1;#100;en_num1=0;#100;en_num2=1;sw1=1;sw2=1;sw3=1;sw4=0;#100;en_num2=0;#100;en_num3=1;#100;en_num3=0;#100;turn_left=1;#100;turn_left=0;#100;turn_right=1;#100;turn_right=0;#100;$stop;
end
endmodule

仿真结果分析

  1. 初始化:
    rst_n=0; sw1=0; sw2=0; sw3=0; sw4=0;
    en_num1=0; en_num2=0; en_num3=0;
    turn_left=0; turn_right=0;
  1. 测试数据:
    置rst_n=1,en_num1=1,为高位赋值(0100);
    置en_num1=0,en_num2=1,为低位赋值(0000);
    置en_num2=0,en_num3=1,确定赋值(0100_0000);

a) 置en_num3 = 0; turn_left = 1;数据进行五次左移:
0100_0000 → 1000_0000 → 0000_0001 → 0000_0010 → 0000_0100 → 0000_1000

b) 置turn_left = 0; turn_right = 1;数据进行5次右移:
0000_1000 → 0000_0100 → 0000_0010 → 0000_0001 → 1000_0000 → 0100_0000

  1. 复位清零:
    置turn_right = 0; rst_n = 0,数据清零;
    0100_0000 → 0000_0000

约束与综合

原理图

引脚配置图

系统硬件测试

  1. 安装usb-blaster驱动,配置引脚,将程序下载到开发板中;
  2. 按下reset键清空数据;
  3. 第一次按下key1拨动拨码开关置高4位为0110;
  4. 第二次按下key1拨动拨码开关置低4位为1010;
  5. 第三次按下key1,led灯从左至右显示0110_1010;
  6. 第四次按下key1,锁定输入(此时en_num1、en_num2、en_num3全为低电平);
  7. 三次按下key3,使数据左移三次;
  8. 按下reset键清空数据;
  9. 输入第二组数据,类似2~5置0001_0111;
  10. 三次按下key2,使数据右移三次;
  11. 整理设备

[EDA]8位双向移位寄存器的设计相关推荐

  1. 8位双向移位寄存器verilog设计

    设计实现功能 设计一个8位双向移位寄存器,实现并行输入数据.数据左移.右移.清空数据的功能. 程序主要包括 一, Key1 控制拨码输入: a) key_flag1, key_state1实现Key1 ...

  2. 4片74LS194接成16位双向移位寄存器

    本例的设计和上一篇博文"2片74LS194接成8位双向移位寄存器"的设计思路大致相同, 读者在理解上一篇博文的基础上, 只需再把握好"除最低位74LS194的SR和最高位 ...

  3. 8位并行左移串行转换电路_设计8位双向移位寄存器电路精品

    目录 1 多功能双向移位寄存器 ...................................................... 1 1.1 基本工作原理 . .............. ...

  4. 8位并行左移串行转换电路_双向移位寄存器 8位双向移位寄存器电路设计

    目录 摘要 .............................................................................................. ...

  5. 左移寄存器vhdl_双向移位寄存器VHDL设计.doc

    双向移位寄存器VHDL设计.doc 双向移位寄存器 引言 移位寄存器就是指具有移位功能的触发器组,它是在普通寄存器的基础上添加了移位功能的一种特殊的寄存器.通常,移位功能就是指在寄存器里面存储的二进制 ...

  6. 8位并行左移串行转换电路_8位双向移位寄存器电路设计

    目录 摘要 .............................................................................................. ...

  7. 2片74LS194接成8位双向移位寄存器

    为了设计时的便利, 这里我改变了数据左移和右移的参考方向, 需读者注意: 在博文"74LS194功能实验"中, 我以高->低作为参考方向, 而在本篇博文中, 我以低-> ...

  8. 左移寄存器vhdl_双向移位寄存器VHDL设计

    双向移位寄存器 1 . 引言 移位寄存器就是指具有移位功能的触发器组, 它是在普通寄存器的基础上添加了 移位功能的一种特殊的寄存器.通常,移位功能就是指在寄存器里面存储的二进制 数据能够在时钟信号的控 ...

  9. 用D触发器和必要的门电路设计一个2位双向移位寄存器. 具体要求见下表(A、B为控制端), 左移串行输入信号为L, 右移串行信号为R

    A B 输出 0 0 保持原状态 0 1 右移 1 0 左移 1 1 清零 在开始分析前, 我们要理清以下四个概念: ①保持原状态: 在下一系统CLK信号来临时, 寄存器状态不变. ②右移: 设寄存器 ...

最新文章

  1. 空标签作为占位符调整距离
  2. 习题10-3 递归实现指数函数 (15 分)
  3. Centos6 破解系统密码
  4. J2EE项目工具集(转)
  5. java 更新对象_java通过key-list和对应value更新当前对象
  6. 使用序列化查找对象中的脏字段
  7. vim ctags java源码_如何使用vim的插件Ctags查看Linux源码
  8. IIS上发布网站遇到的问题总结
  9. 2021 IT运维调查报告
  10. 在网站中接入 客服QQ
  11. 中报业绩被华夏幸福拖累,“50元”的中国平安是否值得珍惜?
  12. mysql 注册驱动_找不到DriverClassName=org.gjt.mm.mysql.Driver的已注册驱动程序
  13. 避免c++程序在windows7或vista下关闭后出现程序兼容性助手
  14. 使用jpedal解析PDF到XML
  15. 数字经济发展现状_(我的)数字媒体的现状
  16. 谈谈你对间隙锁的理解
  17. 100行python代码实现五子棋-教程
  18. CDA 与 斯坦福联合举办 2022斯坦福中国教育论坛
  19. 赚钱本身就是人生目的
  20. 【ZYNQ】黑金教程_OV5640加LCD显示实验的Bug分享

热门文章

  1. 安全日记—零基础开始学安全(2)
  2. UE、UI、UCD、UED?职责划分?
  3. 头脑王者 艺术,电影,体育,时尚,动漫
  4. 苹果x漫画脸_新一代五十铃mu-X中型SUV首发
  5. k8s学习笔记之 k8s架构的简单了解(转载网上电子书)
  6. C++11 - 无锁队列
  7. 在小程序扫码的方式拿到太阳码的路径
  8. ubuntu官方live cd和dvd下载地址
  9. 破晓黎明在街角转灯处
  10. 2023年最新前端面试题(数组相关)