simplify old posts' tags and categories
some blog contents are alse modified
This commit is contained in:
@@ -19,9 +19,7 @@ tags:
|
||||
- 速度
|
||||
- 面积
|
||||
categories:
|
||||
- - Verilog
|
||||
- - Josh 的学习笔记
|
||||
- Verilog
|
||||
- [Josh 的学习笔记, Verilog]
|
||||
abbrlink: 53b8b42e
|
||||
date: 2020-12-05 00:46:00
|
||||
---
|
||||
@@ -111,11 +109,11 @@ input Clk; // 设计的主时钟
|
||||
input Reset; // 异步复位
|
||||
input FhtStarOne,FhtStarTwo,FhtStarThree,FhtStarFour;
|
||||
// 4 个单步算法的时序控制信号
|
||||
|
||||
|
||||
// FHT 的 16 个输入
|
||||
input [11:0] I0,I1,I2,I3,I4,I5,I6,I7,I8;
|
||||
input [11:0] I9,I10,I11,I12,I13,I14,I15;
|
||||
|
||||
input [11:0] I9,I10,I11,I12,I13,I14,I15;
|
||||
|
||||
// FHT 的 16 个输出
|
||||
output [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7;
|
||||
output [15:0] Out8,Out9,Out10,Out11,Out12,Out13,Out14,Out15;
|
||||
@@ -196,7 +194,7 @@ input FhtStar; // 单步 FHT 运算控制信号
|
||||
// 单步 FT运算输入
|
||||
input [11:0] In0,In1,In2,In3,In4,In5,In6,In7,In8,In9;
|
||||
input [11:0] In10,In11,In12,In13,In14,In15;
|
||||
|
||||
|
||||
// 单步 FT运算输出
|
||||
output [12:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,Out9;
|
||||
output [12:0] Out10,Out11,Out12,Out13,Out14,Out15;
|
||||
@@ -294,13 +292,13 @@ wire [15:0] Temp8,Temp9,Temp10,Temp11,Temp12,Temp13,Temp14,Temp15;
|
||||
reg [2:0] Cnt3; //count from 0 to 4,when Reset Cnt3=7;
|
||||
reg FhtEn; //Enable fht culculate
|
||||
|
||||
always @(posedge Clk or negedge Reset) begin
|
||||
always @(posedge Clk or negedge Reset) begin
|
||||
if (!Reset)
|
||||
Cnt3<= #1 3'b111;
|
||||
Cnt3<= #1 3'b111;
|
||||
else begin
|
||||
if (PreFhtStar)
|
||||
Cnt3<= #1 3'b100;
|
||||
else
|
||||
else
|
||||
Cnt3<= #1 Cnt3-1;
|
||||
end
|
||||
end
|
||||
@@ -315,7 +313,7 @@ else begin
|
||||
FhtEn<= #1 0;
|
||||
end
|
||||
|
||||
// 补码运算, 复制符号位
|
||||
// 补码运算, 复制符号位
|
||||
assign Temp0 = (Cnt3 == 4) ? {In0[11],In0[11],In0[11],In0[11],In0} :Out0;
|
||||
assign Temp1 = (Cnt3 == 4) ? {In1[11],In1[11],In1[11],In1[11],In1} :Out1;
|
||||
assign Temp2 = (Cnt3 == 4) ? {In2[11],In2[11],In2[11],In2[11],In2} :Out2;
|
||||
@@ -358,7 +356,7 @@ always @(posedge Clk or negedge Reset) begin
|
||||
Out14[15:0] <= #1 Temp7[15:0] + Temp15[15:0];
|
||||
Out15[15:0] <= #1 Temp7[15:0] - Temp15[15:0];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -595,13 +593,13 @@ case (var)
|
||||
1. 通过 Buffer 等组合逻辑延迟线调整采样时间
|
||||
|
||||
在早期逻辑电路图设计阶段,有一些设计者养成了手工加入 Buffer 或者非门调整数据延迟的习惯,从而保证本级模块的时钟对上级模块数据的建立、保持时间的要求。这些做法目前主要应用的场合有两种:一是使用分立逻辑元件(如 74 系列)搭建数字逻辑电路;另一种是在 ASIC 设计领域。**目前使用分立逻辑元件搭建数字逻辑电路的场合一般为系统复杂度相对较低,系统灵活性要求不高的场合。**在上述场合使用分立逻辑器件设计数字逻辑电路,由于可以使用的调整延时的手段相对有限,而且采用插入 Buffer 、数字延迟逻辑甚至两个非门等手段调整采样的 Setup 和 Hold 时间是可以接受的。而 ASIC 设计领域采用这种方法是以严格的仿真和约束条件作为强力支持的。
|
||||
|
||||
|
||||
正如 [2.1 同步设计原则](#0201)所述,**使用组合逻辑方法产生延迟,容易产生毛刺**,而且这种设计方法的**时序余量较差**,一旦外界条件变换(环境试验,特别是高低温试验),采样时序就有可能完全紊乱,造成电路瘫痪。另外,一旦芯片更新换代,或者移植到其他器件族的芯片上,采样时延必须重新调整,电路的可维护性和继承性都很差。
|
||||
|
||||
2. 盲目使用时钟正负沿调整数据采样
|
||||
|
||||
很多初学者习惯随意使用时钟的正负沿调整采样,甚至产生一系列不同相位或不同占空比的时钟,使用其正负沿调整数据。这种做法是不推荐的,原因如下:
|
||||
|
||||
|
||||
1. 如果在一个时钟周期内,使用时钟的双沿同时操作,则使用该时钟的同相倍频时钟也能实现相同的功能。换句话说,一个时钟周期内,使用时钟的双沿同时操作,相当于使用了一个同相的倍频时钟。此时因为设计的时钟频率提升,所有相关的使用约束都会变得更紧,不利于可靠实现。
|
||||
|
||||
2. 芯片中的 PLL 和 DLL 一般都能较好地保证某个时钟沿的 Jitter、Skew 和占空比等各种参数指标,而对于另一个时钟沿的指标控制并不是那么严格。特别对于综合、实现等 EDA 的软件,如果没有明确对另外一个沿进行相关,这个沿的时序分析不一定完善,其综合或实现结果就不一定能严格满足用户期望的时序要求(比如 Setup、Hold 时间等),往往造成在该沿操作不稳定的结果。
|
||||
@@ -609,7 +607,7 @@ case (var)
|
||||
总结这两点,如果设计者并不十分清楚同时使用上下沿的方法,不如直接使用同相倍频时钟更加简单、明确、可靠。但是如果设计者十分清楚同一周期使用双沿的注意事项,附加了相应的约束,这种做法并非不可。
|
||||
|
||||
针对使用两个时钟沿,在这里还想补充以下两点:
|
||||
|
||||
|
||||
- 使用者虽然使用了同一个时钟的两个沿,但是**保证不在同一个周期内同时使用双沿,则不会增加时钟频率**。
|
||||
- DDR 、QDR 本身就是利用了上下沿采样的原理,随着存储器件高速发展,时钟速度已经成为存取器件的瓶颈,所以可用时钟上下沿操作缓解对单沿 RAM 时钟振荡器的要求。但是必须清楚,硬件的 DDR、QDR 电路(包括 ASIC 的 DDR、QDR 与 FPGA 内嵌的 DDR、QDR 电路)是专用高速设计电路,对时钟的正沿、负沿的 Jitter 、Skew 和占空比等指标都有详细和明确的要求,这一点是和普通逻辑设计,特别是实现在 FPGA 中设计的情况截然不同,希望读者加以区分。
|
||||
|
||||
@@ -618,16 +616,16 @@ case (var)
|
||||
下面分别介绍 [2.3 小节](#0203)提出的两大类异步时钟域数据同步问题的解决方法。
|
||||
|
||||
1. 同频异相问题
|
||||
|
||||
|
||||
同频异相问题的简单解决方法是**用后级时钟对前级数据采样两次**,即通常所述的**用寄存器打两次**。数据同步如[图 5-10](#图5-10) 所示,这样的做法是有效地减少了亚稳态的传播,使后级电路数据都是有效电平值。但是这种做法并不能保证两级寄存器采样后的数据是正确的电平值,因为一旦 Setup 或 Hold 时间不满足,采样发生亚稳态,则经判决时间(Resolution Time)后,还是可能判决到错误电平值。所以这种方法仅仅适用于对少量错误不敏感的功能单元。
|
||||
|
||||
<a name="图5-10"></a>
|
||||
<div align="center">
|
||||
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-12-05-josh-verilog-part-5/2020-12-05-josh-verilog-part-5-100-DataSynchronization.png!sign" width="700px" alt="数据同步"/>
|
||||
</div>
|
||||
|
||||
|
||||
可靠的做法是用 DPRAM 、FIFO 或者一段寄存器 Buffer 完成异步时钟域的数据转换。把数据存放在 DPRAM 或FIFO 的方法如下:将上级芯片提供的数据随路时钟作为写信号,将数据写入 DPRAM 或者FIFO, 然后使用本级的采样时钟( 一般是数据处理的主时钟),将数据读出即可。由于时钟频率相同,所以 DPRAM 或 FIFO 两端的数据吞吐率一致,实现起来相对简单。
|
||||
|
||||
|
||||
2. 异频问题
|
||||
|
||||
可靠完成异频问题的解决方法就是使用 DPRAM 或 FIFO 。其实现思路与前面所述一致,用上级随路时钟写上级数据,然后用本级时钟读出数据。但是由于时钟频率不同,所以两个端口的数据吞吐率不一致,设计时一定要开好缓冲区,并通过监控(Full、Half、Empty 等指示)确保数据流不会溢出。
|
||||
@@ -702,7 +700,7 @@ case (var)
|
||||
5. **将存储逻辑独立划分成模块**
|
||||
|
||||
RAM、ROM、CAM 和 FIFO 等存储单元应该独立划分模块。这样做的好处是便于利用综合约束属性显化指定这些存储单元的结构和所使用的资源类型,也便于综合器将这些存储单元自动类推为指定器件的硬件原语。另一个好处是在仿真时消耗的内存也会减少,便于提高仿真速度。这是因为大多数仿真器对大面积的RAM都有独特的内存管理方式,以提高仿真效率。
|
||||
|
||||
|
||||
6. **合适的模块规模**
|
||||
|
||||
从理论上讲,模块的规模越大,越利于模块资源共享(Resource Sharing)。但是庞大的模块,将要求对综合器同时处理更多的逻辑结构.这将对综合器的处理能力和计算机的配置提出了较高的要求。另外,庞大的模块划分,不利于发挥目前非常流行的增拭综合与实现技术的优势。
|
||||
|
||||
Reference in New Issue
Block a user