本文先简单列举了fpga/CPLD开发常用模块
然后通过一个实例学习下modelsim的仿真流程
第一部分:
模块是构成系统的基础
所以只有把最基本的模块知识都掌握扎实才能设计出高效 实用 可靠的系统
同时对 组合逻辑 时序电路以及常用驱动的学习也有助于对开发工具和设计思想的熟悉
学之前自己也打算复习下数字电路的基本知识
同时感觉学这些模块的时候对单片机和arm的理解和应用也是有帮助的
这里只是综合列出常见的模块(觉得有些地方可以参考74系列的数据手册)
还是需要花大量的时间来一个个学习
然后通过练习,仿真和分析来慢慢了解设计方法,verilog语言和应用环境。
数字逻辑电路可分为两种类型:组合逻辑电路和时序逻辑电路。
- 组合逻辑:输出只是输入逻辑电平的函数(有延时),与电路的原始状态无关。
时序逻辑:输出不只是输入的逻辑电平的函数,还与电路所处的状态有关。
同步时序逻辑是在同一时钟跳变节拍的前提下,如输入条件满足,则进入下一状态,否则仍留在原来的状态的状态机。
组合逻辑:由与、或、非门组成的网络。常用的有:多路器、数据通路开关、加法器、乘法器等,没有记忆功能。
时序逻辑: 由多个触发器和多个组合逻辑块组成的网络。常用的有:计数器、复杂的数据流动控制逻辑、运算控制逻辑、指令分析和操作控制逻辑。同步时序逻辑的设计是设计复杂的数字逻辑系统的核心。
存储器和寄存器:用于暂时存储数据信息。
竞争与冒险
信号在通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变 化,成为“竞争”;往往导致出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。
如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在“冒险”。冒险是由变量的竞争引起的。冒险又分为逻辑冒险和功能冒险。
竞争与冒险的关系:有竞争不一定会产生冒险,但有冒险就一定有竞争
http://blog.163.com/zhangmaochu@126/blog/static/3736062220094300473146/
组合逻辑设计要点
组合逻辑的两种Verilog HDL表示:
-用 assign 语句:
assign q = (al==1?) d : 0 ;
-用 always 块:
always @(al or d)
begin
if (al==1) q = d ;
else q = 0;
End
用always块时,必须注意电平敏感的信号表是否完全,如:
always @ (a or b or c or d )
begin
out = (a & b & c) | (d & e);
end
此时生成的不是纯组合逻辑,因为当 e 变化时,out 不
能立即跟着变化。只有当a 或 b 或 c 或 d 变化时e 的
变化后果才显示出来。可见需要有一个寄存器来储存 e
的变化。
组合逻辑举例之一
一个八位数据通路控制器
`define ON 1 ‘b 1
`define OFF 1 ‘b 0
wire ControlSwitch;
wire [7:0] out, in;
assign out = (ControlSwith== `ON) ? in : 8 ‘h00
基本逻辑 与,或,非
比较器
编码器 8-3线 16-4线
译码器 3-8 4-16 bcd LED显示译码器
选择器 2选1 3选1 4选1
缓冲器
运算器 加法 乘法 除法 阶乘运算器
----------------------------------------------------------------------------------------------------------
时序逻辑的 Verilog HDL表示:
- 用 always:
如: always @(posedge clock)
if (!reset)
do_reset;
else case(state)
state_1: do_state_1;
state_2: do_state_2;
state_3: do_state_3;
state_4: do_state_4;
state_5: do_state_5;
default: state <=xx;
Endcase
task do_reset;
begin
Reset_Every_Register;
Prepare_For_Next_State;
end
Endtask
2,创建新工程file-new----proj
|