5459|9

356

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

从零开始学FPGA我的第七个实验(记录一下) [复制链接]

从零开始学FPGA我的第七个实验(记录一下)
第七个实验是编写数码管的驱动
驱动数码管动态扫描显示,驱动的模型是:
左上角是一个六选一的数据选择器输入的数据是24位的,分成了【3:0】【7:4】【11:8】【15:12】【19:16】【23:20】分成了8个数据长度为4的数据。
左下角的是分频器也就是计数器,将50MHZ的时钟分频成为1KHZ的时钟周期为1ms的时钟信号 50MHZ-----一个周期是20ns 1KHZ半个周期是0.5ms=500000ns所以计数器的计数值是500000/20=25000(为什么是用半个周期除以系统时钟周期呢?自己的理解是因为计数是沿边沿计数的)1ms产生移位欺骗人眼的时间要小于20ms
下面是代码:
  1. module SMG(Clk,Rst_n,En,data,sel,seg);
  2.                
  3.                
  4.                 input Clk;
  5.                 input Rst_n;
  6.       input En;
  7.                
  8.                 input [23:0]data;
  9.                
  10.                 output [5:0] sel;//数码管的位选
  11.                 output reg [6:0] seg;//数码管的段选(要显示的内容)
  12.                
  13.                 reg [14:0] div_cnt;//25000-1=24999
  14.                 reg clk_1k;
  15.                 reg [5:0]sel_r;
  16.                 reg [3:0]data_tmp;//数据缓存
  17.         //计数器从0计数到24999       
  18.                 always @(posedge Clk or negedge Rst_n)
  19.                 if(!Rst_n)
  20.                 div_cnt <=15'd0;
  21.                 else if (!En)
  22.                 div_cnt <=15'd0;
  23.                 else if(div_cnt == 24999)
  24.            div_cnt <= 15'd0;
  25.            else
  26.                         div_cnt = div_cnt + 1'b1;
  27. //但计数满了24999的时候clk_1k翻转一次产生1khz的clk 时钟信号
  28.                 always @(posedge Clk or negedge Rst_n)
  29.                 if(!Rst_n)
  30.                         clk_1k <= 1'b0;
  31.                 else if (div_cnt == 24999)
  32.                 clk_1k <= ~clk_1k;
  33.                 else
  34.                    clk_1k <= clk_1k;
  35.                
  36. //循环移位的寄存器
  37.                 always@(posedge clk_1k or negedge Rst_n)
  38.                         if(!Rst_n)
  39.                             sel_r <= 6'b00_0001;
  40.                         else if(sel_r == 6'b10_0000)
  41.                             sel_r <= 6'b00_0001;
  42.                         else
  43.                            sel_r <= sel_r << 1;
  44. //选择显示数据                 
  45.                 always @(*)
  46.                    case (sel_r)
  47.                            6'b00_0001: data_tmp = data[3:0];
  48.                                 6'b00_0010: data_tmp = data[7:4];
  49.                                 6'b00_0100: data_tmp = data[11:8];
  50.                                 6'b00_1000: data_tmp = data[15:12];
  51.                                 6'b01_0000: data_tmp = data[19:16];
  52.                                 6'b10_0000: data_tmp = data[23:20];
  53.                                 default :data_tmp =4'b0000;
  54.                         endcase
  55. //查表显示0到f的数据                       
  56.                 always@(*)
  57.                case(data_tmp)//查表
  58.                         4'h0:seg = 7'b1000000;
  59.                         4'h1:seg = 7'b1111001;
  60.                         4'h2:seg = 7'b0100100;
  61.                         4'h3:seg = 7'b0110000;
  62.                         4'h4:seg = 7'b0011001;
  63.                         4'h5:seg = 7'b0010010;
  64.                         4'h6:seg = 7'b0000010;
  65.                         4'h7:seg = 7'b1111000;
  66.                         4'h8:seg = 7'b0000000;
  67.                         4'h9:seg = 7'b0010000;
  68.                         4'ha:seg = 7'b0001000;
  69.                         4'hb:seg = 7'b0000011;
  70.                         4'hc:seg = 7'b1000110;
  71.                         4'hd:seg = 7'b0100001;
  72.                         4'he:seg = 7'b0000110;
  73.                         4'hf:seg = 7'b0001110;
  74.                 endcase
  75. //        位选的实现       
  76.                         assign sel =(En)? sel_r:6'b00_0000;
  77. endmodule
复制代码


测试代码 testbench:
  1. `timescale 1ns/1ns
  2. `define clk_period 20
  3. //20ns = 50mhz
  4. module SMG_tb;

  5. reg Clk;
  6. reg Rst_n;
  7. reg En;

  8. reg [23:0] data;

  9. wire [5:0]sel;//位选
  10. wire [6:0]seg;//段选





  11. SMG SMG0(
  12.     .Clk(Clk),
  13.     .Rst_n(Rst_n),
  14.          .En(En),
  15.          .data(data),
  16.          .sel(sel),
  17.          .seg(seg)
  18.           );
  19.    initial Clk = 1;
  20.         always #(`clk_period/2) Clk = ~Clk;
  21.        
  22.    initial begin
  23.            Rst_n = 1'b0;
  24.                 En = 1;
  25.                 data = 24'h123456;
  26.                 #(`clk_period *30);
  27.                 Rst_n =1;
  28.                 #20000000;
  29.                 data =24'h201607;
  30.                 #20000000;
  31.                 data =24'h202009;
  32.                 #20000000;
  33.                 $stop;
  34.         end
  35.        
  36. endmodule
复制代码



rtl波形:

符合对应的编码
门级仿真:


quartus ii 15版本的 In system sources and probes editor (issp)还不太会使用,在板子上的仿真就明天发吧。晚安。。


此帖出自FPGA/CPLD论坛

最新回复

a)频率为1MHz,误差的绝对值不大于0.1%; b)脉宽为100ns,误差的绝对值不大于1%; --误差取决于你能提供什么程度的时钟 c)幅度为5±0.1V(负载电阻为50); d)上升时间不大于30ns,过冲不大于5%。 -- 这两个不是FPGA程序能控制的  详情 回复 发表于 2016-7-28 20:17
点赞 关注
 

回复
举报

1万

帖子

2853

TA的资源

管理员

来自 4楼
 
汇总贴在此:
从零开始学FPGA——by ihalin
https://bbs.eeworld.com.cn/forum ... 5881&fromuid=536508
此帖出自FPGA/CPLD论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复

975

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
此帖出自FPGA/CPLD论坛
 
 
 

回复

1万

帖子

2853

TA的资源

管理员

板凳
 
楼主的第五个实验和第六个实验到哪里去了呀?
此帖出自FPGA/CPLD论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

在其他论坛了过几天补回来。  详情 回复 发表于 2016-7-25 17:50
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

356

帖子

0

TA的资源

一粒金砂(中级)

5
 
okhxyyo 发表于 2016-7-25 10:43
楼主的第五个实验和第六个实验到哪里去了呀?

在其他论坛了过几天补回来。
此帖出自FPGA/CPLD论坛
 
 
 

回复

1950

帖子

4

TA的资源

版主

6
 
给茁壮成长的楼主 点赞
能画模块,画时序,能写代码,能仿真
楼主是的高人真传啊。

我也来拆两招,助楼主快速修炼
1. 用 always@(posedge clk_1k or negedge Rst_n)
   比用 always @(*) 好

2.输入输出的信号,尽量都用DFF过
此帖出自FPGA/CPLD论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习了。我之前学习的都是用原理图方式
此帖出自FPGA/CPLD论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主能帮我写个FPGA的程序吗??提供一个标准矩形脉冲信号发生器,要求
a)频率为1MHz,误差的绝对值不大于0.1%;
b)脉宽为100ns,误差的绝对值不大于1%;
c)幅度为5±0.1V(负载电阻为50);
d)上升时间不大于30ns,过冲不大于5%。用的是stm32芯片,万分感谢了
此帖出自FPGA/CPLD论坛

点评

a)频率为1MHz,误差的绝对值不大于0.1%; b)脉宽为100ns,误差的绝对值不大于1%; --误差取决于你能提供什么程度的时钟 c)幅度为5±0.1V(负载电阻为50); d)上升时间不大于30ns,过冲不大于5%。 -- 这两个  详情 回复 发表于 2016-7-28 20:17
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(初级)

9
 
写的很好,很实用
此帖出自FPGA/CPLD论坛
 
 
 

回复

1950

帖子

4

TA的资源

版主

10
 
doudouqiqi 发表于 2016-7-27 21:42
楼主能帮我写个FPGA的程序吗??提供一个标准矩形脉冲信号发生器,要求
a)频率为1MHz,误差的绝对值不大于 ...

a)频率为1MHz,误差的绝对值不大于0.1%;
b)脉宽为100ns,误差的绝对值不大于1%;
--误差取决于你能提供什么程度的时钟

c)幅度为5±0.1V(负载电阻为50);
d)上升时间不大于30ns,过冲不大于5%。
-- 这两个不是FPGA程序能控制的
此帖出自FPGA/CPLD论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表