原创 Verilog学习笔记7- 综合练习-基于SF-EP1V2的SMG接口设计-千位取位逻辑

2010-5-19 09:47 3794 10 12 分类: FPGA/CPLD

千位取位逻辑:


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

Thousand = x /1000


Hundred = x % 1000 / 100


Ten = x % 1000 % 100 / 10


One = x % 10



 


以上的公式估计不陌生,有学习过单片机基础的同学都知道,是取“千”,“百”,“十”,“个”位的公式。这类有“除”又有“求余”的公式,会大大降低处理的效率。



我们设计“千位取位逻辑”时,不肯能直接照搬来用。但是很庆幸的是Quartus II 老早就为用户准备了“LPM”, LPM用傻瓜的话来说“可配置的自定义模块”。要达到以上公式的效果,我们只要使用“3个”除法器便可实现。


 


点击看大图




 


以上是"千位取位逻辑"的示意图。该构思有一个缺点,就是输入数是有限制。在SF-EP1V2板子上,只有4位而已,故我将设计限制在0~9999之间。另外,随着输入数的不同,“位宽”也会改变。


 


接下来的载图是演示如何调用除法器的LPM


 




点击看大图



1) 打开 “MEgaWizard Plug-In Manager”   2) 点击创建一个新东西



点击看大图



3)打开“Arithmetic”(算法)   4)选择“LPM_DIVIDE”(除法器)




40ccfddd-aa9c-4cd9-bbd1-c5340616e3c0.jpg



5)输入被除数( numerator )的位宽和除数( denominator )的位宽。都是无符号型。 



673e651c-54ca-4140-8616-50fb6c666a52.jpg



6)选择速度优化“Speed




注意点:


“被除数”(numberator)和“除数”(denominator)可以配置位宽,但是“商数”和“余数”必须跟随着前者的设置(图5)。 除此之外,我们放弃了面积和优化而倾向速度,因为组合逻辑尽可以的话就是要“快”。(图6


 


我总共创建了3个除法器:“divide_thousand,divide_hundred”和“divide_ten”,以下是


项目导航操作:


 


点击看大图



Verilog 代码:


1.module number_module


2.(


3. Data_In,


4. Thousand, Hundred, Ten, One


5.);


6.


7.     input [25:0]Data_In;


8.     output [3:0]Thousand;


9.     output [3:0]Hundred;


10.    output [3:0]Ten;


11.    output [3:0]One;


12.


13. /*********************************/


14.


15.    wire [17:0]U1_Remain_Sig;


16.      reg  [17:0]rThousand_Const;


17.


18.    divide_thousand U1 


19.    (


20.       .denom ( rThousand_Const ),


21.       .numer ( Data_In ),


22.       .quotient ( Thousand ),


23.       .remain ( U1_Remain_Sig )


24.    );


25.


26.    reg [15:0]rHundred_Const;


27.    wire [7:0]U2_Remain_Sig;


28.


29.    divide_hunred U2 


30.    (


31.       .denom ( rHundred_Const ),


32.       .numer ( U1_Remain_Sig ),


33.       .quotient ( Hundred ),


34.       .remain ( U2_Remain_Sig )


35.    );


36.


37.    reg [7:0]rTen_Const;


38.


39.    divide_ten U3 


40.    (


41.       .denom ( rTen_Const ),


42.       .numer ( U2_Remain_Sig ),


43.       .quotient ( Ten ),


44.       .remain ( One )


45.    );


46.


47.    /***************************/


48.


49.    always @ ( Data_In )


50.       begin


51.          rHundred_Const = 16'd100;


52.          rTen_Const = 8'd10;


53.          rThousand_Const = 18'd1000;


54.       end


55.


56.    /***************************/


57.


58.endmodule



 


1. 建立了一个Top模块用来阻止这些除法器。组织过后的效果如下:


 


点击看大图





 


示意图如下:


 


点击看大图


 





2. 从上面的示意图可以看到,个个除法器的都是超过“4位”的位宽,当引出到外面的时


   候,除了“前4位”,其余的都被“吃掉”。乍看是很不好的习惯,实际上输出影响不


   大,尽可以的话就避免吧,我为了贪图“方便”。


 


3. 49行到54行。Data_In无论如何产生变化。都不会有任何改变,这是一个赋值“常数”


   的一个“手段”而已。



仿真:


Testbench 代码:



1.module number_module_vlg_tst();



2.     reg [25:0] Data_In;


3.                                               


4.     wire [3:0]  Hundred;


5.     wire [3:0]  One;


6.     wire [3:0]  Ten;


7.     wire [3:0]  Thousand;


8.                  


9.      number_module i1 


10.    (


11.       .Data_In(Data_In),


12.       .Hundred(Hundred),


13.       .One(One),


14.       .Ten(Ten),


15.       .Thousand(Thousand)


16.    );


17.


18.    initial 


19.    begin


20.       Data_In = 26'd7821;


21.    end


22.


23.endmodule



 


仿真载图:


点击看大图



问题和答案:



1: 在建立除法器的时候,有“Pipeline function”也就是流水功能?加和没加有什么特别?


答:这个问题确实有点... 我也尝试过点击这个功能,而延迟为1个时钟,效果也是一样。是


   在很对不起,以目前的知识,实在是很难解释...(o)


 


2: 建立除法器意外,还要建立顶层模块组织它们起来。老实说真的很烦?为什么不直接使


   用公式呢?


答:这个问题,我想你也很清楚,乘法或者除法的运算时非常慢。可能你又会问?那么建


    立除法器和建立公式又有什么不同?建立除法器的概念是“硬件运算”,而建立公式的


    概念是“软件运算”。“硬件运算”和“软件运算”,哪一个比较快呢?


 


3: 你“吃掉”输出的位宽(egThousand的商数输出是26位,但是被载致4位),会发生


    什么怪事?


答: 从多次仿真的结果看来,没有事情发生。但是不保证不会发生事情...



总结:


这一章的实验与以往比较不同。对于我本身也觉得很微妙,当初就只有一个想法而已,想不到既然会实现出来!?我一开始尝试使用公式来达到效果,但是结果都很不理想。浑浑噩噩中在网上冲浪,需找“求余”的Verilog代码,但结果都是空空如也。无奈之下就产生这样的一个念头“IPLPM?可配置模块?除法器?


 


补充一点:在使用LPM时最后将“xxx.qip”和“xxx.v”的文件加入“项目导航”的“文件中”。否者的话,编译器会一直“警告”“警告”的“吠”,真的很烦。


 


源码:


http://j.imagehost.org/download/0411/05-Number_Module

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1373959 2010-5-18 21:19

我顶。

用户1609127 2010-5-18 19:53

源码补上: http://j.imagehost.org/download/0411/05-Number_Module
相关推荐阅读
用户1609127 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
用户1609127 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
用户1609127 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
用户1609127 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
用户1609127 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
用户1609127 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
EE直播间
更多
我要评论
2
10
关闭 站长推荐上一条 /3 下一条