首先,非常感谢“真OO无双”前辈,在学习FPGA过程中给与了极大帮助。在此记录一些问题,希望能帮助别人,也给自己留点记录,方便以后查找。

前辈在(原創) 如何設計一個七段顯示器Controller? 中给了出了一个例子,如下:

我的板子是DE3—150,上面有两颗数码管。将其作为自定义组建加入到SOPC Builder中(具体参考(原創) 如何設計一個七段顯示器Controller? ),其参数修改为:

1 module SEG7_Controller (
2 // Avalon clock interface siganals
3   input csi_clockreset_clk,
4 input csi_clockreset_reset_n,
5 // Signals for Avalon-MM slave port
6   input [ADDR_WIDTH-1:0] avs_s1_address,
7 input avs_s1_write,
8 input [DATA_WIDTH-1:0] avs_s1_writedata,
9 // user logic inputs and outputs
10   output [SEG7_NUM*8-1:0] avs_s1_export_oHEX
11 );
12
13 parameter DATA_WIDTH = 32; // data bus width
14  parameter SEG7_NUM = 8; // specify the number of seg7 unit
15  parameter ADDR_WIDTH = 3; // log2(SEG7_NUM)
16  
17 reg [SEG7_NUM-1:0] base_index;
18 reg [DATA_WIDTH-1:0] write_data;
19 reg [(SEG7_NUM*8-1):0] reg_file;
20
21 assign avs_s1_export_oHEX = ~reg_file;
22
23 always@(posedge csi_clockreset_clk, negedge csi_clockreset_reset_n) begin
24 if (!csi_clockreset_reset_n) begin
25 integer i;
26 base_index <= 8'h00;
27 write_data <= 8'h00;
28
29 for(i = 0; i < SEG7_NUM * 8; i = i + 1)
30 reg_file[i] <= 1'b1;
31 end
32 else begin
33 if (avs_s1_write) begin
34 integer j;
35 write_data <= avs_s1_writedata;
36 base_index <= (avs_s1_address << 3);
37
38 for(j = 0; j < 8; j = j + 1)
39 reg_file[base_index+j] <= write_data[j];
40 end
41 end
42 end
43
44 endmodule
SEG7_NUM = 2;

ADDR_WIDTH = 1;

编译下载到板子上,然后在Nios II中运行测试程序,在低位向高位进位时出现错误现象:

...08—>09—>00—>11—>12...19—>10—>21...

也就是说,低位向高位进位时,低位清零,高位没变化,下一次更新时,高低位一起更新。

  分析代码33~39行,由于使用阻塞赋值,reg_file,base_index以及write_data中的数据其实都是前一时钟周期的,那么其中数值变化如下:

修改代码如下,问题解决。

1 module SEG7_Controller (
2 // Avalon clock interface siganals
3 input csi_clockreset_clk,
4 input csi_clockreset_reset_n,
5 // Signals for Avalon-MM slave port
6 input [ADDR_WIDTH-1:0] avs_s1_address,
7 input avs_s1_write,
8 input [31:0] avs_s1_writedata,
9 // user logic inputs and outputs
10 output [SEG7_NUM*8-1:0] avs_s1_export_oHEX
11 );
12
13 parameter SEG7_NUM = 8; // specify the number of seg7 unit
14 parameter ADDR_WIDTH = 3; // log2(SEG7_NUM)
15 parameter DEFAULT_ACTIVE = 1;
16 parameter LOW_ACTIVE = 1;
17
18 reg [(SEG7_NUM*8-1):0] reg_file;
19
20 assign avs_s1_export_oHEX = (LOW_ACTIVE)?~reg_file:reg_file;
21
22 always@(posedge csi_clockreset_clk, negedge csi_clockreset_reset_n) begin
23 if (!csi_clockreset_reset_n) begin
24 reg_file[(SEG7_NUM*8-1):0] <= (DEFAULT_ACTIVE)?8'hFF:8'h00; // trun on or off
25 end
26 else begin
27 if (avs_s1_write) begin
28 integer j;
29 for(j = 0; j < 8; j = j + 1)
30 reg_file[(avs_s1_address << 3) + j] <= avs_s1_writedata[j];
31 // reg_file[((avs_s1_address << 3) + 7 ):(avs_s1_address << 3)] <= avs_s1_writedata[7:0];
32 end
33 end
34 end
35
36 endmodule

方法二,还可以在起另外一个always块,在其中完成write_data对reg_file的赋值,因为clk非常快,不受avs_s1_write信号控制,可以避免此情况。

总结:

  • reg变量,相当于触发器,若采用阻塞赋值,传递出去的其实是其存放的前一时钟周期的值。
  • 制作自定义组建时,对寄存器的读写,应该与寄存器功能实现分开,如方法2. 

转载于:https://www.cnblogs.com/xiyi/archive/2010/11/03/1868427.html

【随笔】“真OO无双”前辈提供的SEG7_Controller模块的问题改进相关推荐

  1. 如何使用ModelSim作前仿真與後仿真? (真oo无双前辈)

    Abstract 本文介紹使用ModelSim做前仿真,並搭配Quartus II與ModelSim作後仿真. Introduction 使用環境:Quartus II 8.1 + ModelSim- ...

  2. 真 OO无双之真乱舞书 序言

    原本我的Blog是在藍色小鋪的阿森的學習筆記,但我發現博客園功能強多了,而且大家程式設計的水準又高,所以今天打算搬來博客園跟大家做鄰居,今晚會陸續將以前的文章搬過來,以後請大家多多指教. 為什麼要花時 ...

  3. 出来了,真三国无双3PC版的破解。

    2003年注册了ID,从来就是潜水,心中实在有愧.看到这次有人提供原始游戏,有人CRACK,而且我也是昨天才全部下好(小日本游戏太大了,一堆垃圾文件在里面)! 本来也是想潜水到底了,但是后来实在有点手 ...

  4. CSU1020: 真三国无双

    1020: 真三国无双 Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 1042 ...

  5. 真三国无双8二十四项修改器风灵月影版

    点击下载来源:真三国无双8二十四项修改器风灵月影版 真三国无双8修改器风灵月影顾名思义,就是由风灵月影大神专门为<真三国无双8(Dynasty Warriors 8)>量身打造的一款游戏辅 ...

  6. ati自定义分辨率_真三国无双7游戏自定义分辨率的修改方法

    这是一个真三国无双7游戏自定义分辨率的修改方法介绍,一个非常详细的教程,玩家研究并且分享的,告诉玩家如何在游戏中修改自己需要的分辨率来迎合自己的本身的电脑,使游戏的画面效果达到最好,很实用的一个教程, ...

  7. 《真三国无双5》全人研究完整版

    <真三国无双5>全人研究完整版 2010-01-29 13:21 蜀国 赵云 系列传统主角 本作走的依然是平均路线 先说说子龙的优点吧 无双很赞 无双终结技很实用 无双连舞时攻击速度不错 ...

  8. 《真·三国无双ADVANCE》攻略

    <真·三国无双ADVANCE>攻略 基本操作 )?avz终!?   ?鱲?愈  地图画面 5_婛?6牂  方向键:移动游标 =wS(!鷉e蓿  A:选择移动目标 }c%?Q?  B:取消 ...

  9. 魔兽争霸地图修改(三国列传,又名:三国列传之真策略无双3.0 A)

    前几天玩了玩小时玩的三国列传之真策略无双3.0,09年的魔兽地图. 突发奇想,想实现召唤出来的武将死后又能重新招和没有武将招募上限. 原图限制每个势力只能招募一个武将,只有袁术能招募两个,因此打算以袁 ...

最新文章

  1. 机器学习知识点(二)各类型平均数Java实现
  2. linuxl下创建mysql用户和组_Linux中用户与用户组管理
  3. [c语言]运算符的优先级与结合性
  4. 绝地求生6月28日服务器维护,绝地求生6月28日更新到几点 吃鸡6月28日更新内容一览...
  5. 华为鸿蒙系统好在哪,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  6. Adobe Experience Design是什么软件?xd mac版下载安装教程 XD 2021发布
  7. IT众包Web网站服务案例:江苏保税店
  8. android 申请sdcard权限_Android sdcard读写权限问题之中的一个
  9. python编程英语单词下载2019_图形化编程软件-mPython下载2019正式版 下载_久友软件下载...
  10. Effective_STL 学习笔记(九) 在删除选项中仔细选择
  11. 使用BigDecimal时,报NumberFormatException
  12. 【USACO19FEB】Mowing Mischief P(决策单调性)(线段树辅助分治)
  13. 【精华帖】PS拼接图片最简单教程
  14. AI 考古比胡八一更高效
  15. 怎么查二手苹果手机价格
  16. 产品经理修炼之道读后感
  17. webx框架 实现文件上传保存服务器 解析
  18. 中信:易悦组合,更愉悦
  19. 陌陌 ZAO 脸,一念成魔一念成佛
  20. 拉线位移编码器零线有电的原因

热门文章

  1. Kaggle竞赛方案分享:如何分辨杂草和植物幼苗(转)
  2. kaggle數據集下載到colab上并且解压
  3. virtualenv在Ubuntu18.10(64位)中的用法(命令和图形化建立虚拟环境)
  4. sublime中文输入(转)
  5. UISwitch,UISegmentedControl及UISlider的初步学习
  6. vivo9.0系统设备最简单激活XPOSED框架的步骤
  7. 详解ScheduledExecutorService的周期性执行方法
  8. 软考网络工程师--计算机硬件基础
  9. android 服务
  10. lvs增加并发连接,解决因为哈希表过小导致软中断过高问题