fpga领域--uart异步串行通信--uart接收模块--数码管显示2

4 篇文章 0 订阅
3 篇文章 0 订阅

数码管显示写起来非常简单
并且可以被顶层调用,下边附代码。

module  seventobe (

input     wire       clk,
input     wire       rst,
input     wire[23:0] number,
output    reg [7:0]  seg,     //数码管段选
output    reg [5:0]  sel      //数码管片选

);


reg  [25:0] cnt=0;
localparam  T=50_000;    //刷新时间为1ms
//采用三段式状态机
reg [2:0] cstate;    //定义现态
reg [2:0] nstate;   //定义次态
//状态空间,6个数码管,所以定义6个状态
localparam s0=0; 
localparam s1=1; 
localparam s2=2; 
localparam s3=3; 
localparam s4=4; 
localparam s5=5; 
//定义计数器
always@(posedge clk or posedge rst) begin

if(rst)
   cnt<=0;
else if(cnt==T-1)
   cnt<=0;
else
   cnt<=cnt+1;
end
//【1】现态跟随次态
always @ (posedge clk or posedge rst) begin

if(rst)
  cstate<=0;
else 
  cstate<=nstate;
end 
//【2】状态的判断和转移
always@(*) begin
if(rst) 
  nstate=s0;
else
   case(cstate)
      s0  :      begin
	               if(cnt==T-1)
				      nstate=s1;
				   else
				      nstate=s0;
	               end

      s1  :      begin
	               if(cnt==T-1)
				      nstate=s2;
				   else
				      nstate=s1;
	               end
      s2  :      begin
	               if(cnt==T-1)
				      nstate=s3;
				   else
				      nstate=s2;
	               end

      s3  :      begin
	               if(cnt==T-1)
				      nstate=s4;
				   else
				      nstate=s3;
	               end
      s4  :      begin
	               if(cnt==T-1)
				      nstate=s5;
				   else
				      nstate=s4;
	               end

      s5  :      begin
	               if(cnt==T-1)
				      nstate=s0;
				   else
				      nstate=s5;
	               end
    default:   nstate=s0;
	endcase
end 

//定义显示数据
reg [3:0] value=0;
always @ (posedge clk or posedge rst) begin

if(rst) begin
	sel<=6'b111_111;    //低电平有效,6个1 代表数码管不亮
	value<=0;
end  
else
    case(cstate) 
	   s0    :    begin
	   
					sel<=6'b111_110;
					value<=number[3:0];    //每个数码管都是4个位宽,因此每4位赋一个值
	   	   	      end
	   s1    :    begin
	   
					sel<=6'b111_101;
					value<=number[7:4];
	   	   	      end
	   s2    :    begin
	   
					sel<=6'b111_011;
					value<=number[11:8];
	   	   	      end
	   s3    :    begin
	   
					sel<=6'b110_111;
					value<=number[15:14];
	   	   	      end
	   s4    :    begin
	   
					sel<=6'b101_111;
					value<=number[19:16];
	   	   	      end
	   s5    :    begin
	   
					sel<=6'b011_111;
					value<=number[23:20];
	   	   	      end
    default  :    begin
                  	sel<=6'b111_111;
                  	value<=0;
                  end
	endcase
end 

//定义字符译码
always@ (*) begin
		case(value)
			 0   :   seg=8'b11000000;//seg[0]=a,seg[1]=b
			 1   :   seg=8'b11111001;
			 2   :   seg=8'b10100100;
			 3   :   seg=8'b10110000;
			 4   :   seg=8'b10011001;
			 5   :   seg=8'b10010010;
			 6   :   seg=8'b10000010;
			 7   :   seg=8'b11111000;
			 8   :   seg=8'b10000000;
			 9   :   seg=8'b10010000;
			 10  :   seg=8'b10001000;
			 11  :   seg=8'b10000011;
			 12  :   seg=8'b11000110;
			 13  :   seg=8'b10100001;
			 14  :   seg=8'b10000110;
			 15  :   seg=8'b10001110;
	     default :   seg=8'b00000000;
		endcase

end
endmodule 
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值