Verilog通过按键控制rom的值在数码管上显示

目录

一、调用block ip核

二、代码实现部分

1、通过按键消抖产生一个稳定的flag信号

2、传递addra地址的值

3、设置数码管显示,利用行扫描的办法,每次刷新一位阳极数据(各十百千位),快到人眼无法看见,实现显示,value实现显示每位具体的值

 例化ROM的数据


一、调用block ip核

 在内存类型那里选择存储器类型,这次用到的是single port ROM单端口ROM,接口类型为本地

传输的数据

宽度为8,深度为20,启用端口类型为始终启用

选择文件的位置

二、代码实现部分

 将生成的代码复制到文件中

1、通过按键消抖产生一个稳定的flag信号

reg [29:0] cnt_key;
wire key_flag;
always@(posedge clk)
begin
if(!rst)
   cnt_key<=0;
else if(key==0)
    begin
      if(cnt_key==500)
         cnt_key<=cnt_key;
      else
         cnt_key<=cnt_key+1;
    end
else
   cnt_key<=0;
end
assign key_flag=(cnt_key==499)?1:0;

2、传递addra地址的值

reg [4 : 0] addra;
wire [7 : 0] douta;
always@(posedge clk)
begin
if(!rst)
   addra<=0;
else if(key_flag)
     begin
      if(addra==19)
        addra<=0;
      else
        addra<=addra+1;
     end
else
   addra<=addra;
end

3、设置数码管显示,利用行扫描的办法,每次刷新一位阳极数据(各十百千位),快到人眼无法看见,实现显示,value实现显示每位具体的值

reg [29:0] cnt_hang;
reg [1:0] hang;//4行刷新显示
reg [3:0] value;//0-9显示
always@(posedge clk)
begin
if(!rst)
   cnt_hang<=0;
else if(cnt_hang==5000)
    cnt_hang<=0;
else
   cnt_hang<=cnt_hang+1;
end
always@(posedge clk)
begin
if(!rst)
    hang<=0;
else if(cnt_hang==5000)
    begin
     if(hang==3)
       hang<=0;
     else
        hang<=hang+1;
    end
else
    hang<=hang;
end
always@(posedge clk)
begin
if(!rst)
   begin
    yang<=4'b0001;
    value<=0;
   end
else
    begin
     case(hang)
       0:begin
           yang<=4'b0001;
           value<=douta%10;//个位
         end
         1:begin
           yang<=4'b0010;
           value<=douta/10%10;//十位
         end
         2:begin
           yang<=4'b0100;
           value<=douta/100%10;//百位
         end
         3:begin
           yang<=4'b1000;
           value<=douta/1000%10;//千位
         end
      default: begin
                 yang<=4'b0001;
                  value<=0;
                end  
     endcase
    end
end
always@(posedge clk)
begin
if(!rst)
    yin<=8'b1111_1111;
else 
    begin
     case(value)
       0: yin<=8'b0100_0000;
        1: yin<=8'b0111_1001;
        2: yin<=8'b0010_0100;
        3: yin<=8'b0011_0000;
        4: yin<=8'b0001_1001;
        5: yin<=8'b0001_0010;
        6: yin<=8'b0010_0000;
        7: yin<=8'b0111_1000;
        8: yin<=8'b0000_0000;
        9: yin<=8'b0001_0000;
     endcase
    end      
end

 例化ROM的数据

blk_mem_gen_0 your_instance_name (
  .clka(clk),    // input wire clka
  .addra(addra),  // input wire [4 : 0] addra
  .douta(douta)  // output wire [7 : 0] douta
);

Verilog初学者,欢迎各位指出问题!!!!

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值