当前位置: 首页 > news >正文

特权FPGA之Johnson移位

完整代码:


module johnson(
			clk,
			rst_n,
			led,
			sw1_n,
			sw2_n,
			sw3_n
		);

input clk;		                  //时钟信号,50MHz
input rst_n;	                  //复位信号,低电平有效
output[3:0] led;	              //LED控制,1--灭,0--亮
input sw1_n,sw2_n,sw3_n; 	      //三个独立按键,低表示按下

reg led_dir;	                  //1'b1--left,1'b0--right
reg led_on;	                      //1'b1--on,1'b0--off

//------------------------------------
reg[23:0] cnt24;

always @(posedge clk or negedge rst_n)
	if(!rst_n) cnt24 <= 24'd0;
	else cnt24 <= cnt24+1'b1;

//------------------------------------
reg[3:0] led_r;

always @(posedge clk or negedge rst_n)
	if(!rst_n) led_r <= 4'b0001;
	else if(cnt24 == 24'hffffff && led_on) begin
			if(led_dir) led_r <= {led_r[0],led_r[3:1]};	//left
			else led_r <= {led_r[2:0],led_r[3]};	//right
		end

assign led = led_r;
	

//------------------------------------
//---------------------------------------------------------------------------
reg[2:0] key_rst;  

always @(posedge clk  or negedge rst_n)
    if (!rst_n) key_rst <= 3'b111;
    else key_rst <= {sw3_n,sw2_n,sw1_n};

reg[2:0] key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) key_rst_r <= 3'b111;
    else key_rst_r <= key_rst;
   
//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 
wire[2:0] key_an = key_rst_r & (~key_rst);
/*
key_rst     1 1 1 0 0 1
~key_rst    0 0 0 1 1 0
key_rst_n     1 1 1 0 0 1
key_an        0 0 1 0 0
*/
//---------------------------------------------------------------------------
reg[19:0]  cnt;	//计数寄存器

always @ (posedge clk  or negedge rst_n)
    if (!rst_n) cnt <= 20'd0;	//异步复位
	else if(key_an) cnt <=20'd0;
    else cnt <= cnt + 1'b1;
  
reg[2:0] low_sw;

always @(posedge clk  or negedge rst_n)
    if (!rst_n) low_sw <= 3'b111;
    else if (cnt == 20'hfffff) 	//满20ms,将按键值锁存到寄存器low_sw中	 cnt == 20'hfffff
      low_sw <= {sw3_n,sw2_n,sw1_n};
      
//---------------------------------------------------------------------------
reg  [2:0] low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clk  or negedge rst_n )
    if (!rst_n) low_sw_r <= 3'b111;
    else low_sw_r <= low_sw;
/*          clk clk clk clk clk clk 
low_sw		111 111 111 110 110 110  
~low_sw     000 000 000 001 001 001
low_sw_r        111 111 111 110 110 110

led_ctrl	000 000 000 001 000 000 
   */
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期 
wire[2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);


  
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
		led_on = 1'b0;
		led_dir = 1'b0;
      end
    else begin		//某个按键值变化时,LED将做亮灭翻转
        if ( led_ctrl[0] ) led_on <= ~led_on;	
        if ( led_ctrl[1] ) led_dir <= 1'b0;
        if ( led_ctrl[2] ) led_dir <= 1'b1;
      end



endmodule




 

让代码开口说话!

相关文章:

  • node-modules-inspector 使用以及 node_modules可视化 依赖关联关系快速分析
  • Java 为什么不支持多继承?
  • 多类型医疗自助终端智能化升级路径(代码版.下)
  • C++类与对象进阶知识深度解析
  • 基于大模型的ALS预测与手术优化系统技术方案
  • 用MSYS2在windows下编译gsl-2.8库用于vs2022调用
  • 打破系统壁垒:CRM、ERP、OA一体化如何重塑企业竞争力
  • 域名系统DNS
  • 直流减速电机控制实验:Simulink应用层开发(3)
  • Ansible:roles角色
  • 物联网平台支持在水务行业使用
  • React 和 JSX 中,这些符号 (=>, <, ? :)的用法
  • 简历EasyExcel相关
  • 【Java中级】11章、枚举 - java引用数据类型,枚举介绍、快速入门,了解枚举类的基本使用方式【1】
  • 基于webGis绘制点、面
  • Python标准库os模块完全指南
  • 安装node.js
  • 1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)
  • 蓝桥杯2022年第十三届省赛真题-统计子矩阵
  • ruby基础语法
  • 著名植物学家、园艺学家,国际植物园协会原主席贺善安逝世
  • 风雨天涯梦——《袁保龄公牍》发微
  • 首个偏头痛急性治疗药物可缓解前期症状
  • 第四届长三角国际应急博览会开幕,超3000件前沿装备技术亮相
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额超5万元
  • 人民网评:守护健康证的“健康”,才有舌尖上的安全