数字逻辑电路设计

数字逻辑电路设计基本技能


1.1 面向硬件电路的设计思维方式

核心:“数据通路(Datapath)+控制逻辑(Control Logic)”

数据通路一个突出特点是:如果实现了它,它就一直在那里,不会消失;如果没有实现它,它就一直不存在,不会突然凭空出现

1.2 行为描述的Verilog 编程风格

使用 Verilog描述电路有两种编程风格,一种叫行为描述,一种叫电路描述。

行为描述侧重于对模块行为功能进行描述

电路描述则是直接对电路的逻辑进行具体描述

1.3 自顶向下的设计划分过程

建议采取“自顶向下、模块划分、逐层细化”的设计步骤

一定要先把电路结构设计想妥当了,再开始动手写Verilog 代码

1.4 常用数字电路的Verilog 描述

1.4.1 一些硬性规定

CPU 设计代码中禁止出现 initial 语句。

CPU 设计代码中禁止出现 casex、casez。

CPU 设计代码中禁止出现用“#”表达电路延迟。

CPU 设计代码中时钟信号 clock 只允许出现在 always @(posedge clock)语句中。

CPU 设计代码中所有带复位的触发器,要么全部是同步复位,要么全部是异步复位。

存在两个模块对接的端口,请把两边的端口定义成一样的名字或是很高相似度的名字。

1.4.2 Verilog 模块语法
(1)模块特点
每个模块的内容都是嵌在module和endmodule两个语句之间

书写格式自由

除endmoudle语句外,每个语句和数据定义的最后都必须由分号

用/....../和//......对Verilog程序进行注释
(2)模块的结构
module <模块名> (<端口列表>)

<I/O说明>
<内部信号声明>
<功能定义>

endmodule
(3)模块内容

I/O说明
输入口(input 端口名1,端口名2,……端口名n)

输出口(output 端口名1,端口名2,……端口名n)

I/O\说明也可以卸载端口声明语句中: module module_name(input port1,input port2,…,output port1,output port2…)
用“assign”声明语句

“assign”,后面再加一个方程式即可

assign a = b & c;    //两个输入的与门
过程块
always过程块
always @(<敏感信号表达式>)
begin
    //过程赋值
    //if语句  
    //case语句
    //while、repeat、for语句
    //task、function调用
end

当敏感信号表达式的值改变时候,就执行一遍块内语句。同时always过程块是不能够嵌套使用的。

关键字posedgenegedge关键字分别是上升沿以及下降沿

例如:同步时序电路的时钟信号为clk,clear为异步清零信号。敏感信号可写为:

//上升沿触发,高电平清0有效
always @(posedge clk or posedge clear) 

//上升沿触发,低电平清0有效
always @(posedge clk or negedge clear)
连续赋值

用连续赋值语句表达的是: assign val=newval;

任何一个输入的改变都将立即导致输出更新;

module orand(out,a,b,c,d,e);
	input a,b,c,d,e;    
	output out;    
	assign out=3&(a|b)&(c|d);
endmodule
1.4.3 基础逻辑门
wire [7:0] a; 
wire [7:0] b;

assign y1 = ~a; //反相器
assign y2 = a & b; //与
assign y3 = a | b; //或
assign y4 = a ^ b; //异或
assign y5 = ~(a & b); //与非
assign y6 = ~(a | b); //或非
当你写的代码想表述一种逻辑关系,如“条件 A1 满足且条件 A2 满足,或者条件 B 满足”,这个时候就用“&&”和“||”;

当你写的代码想表述的是逻辑门,如先行进位加法器的先行进位生成逻辑、乘法器里面的华莱士树,这个时候就用“&”和“|”。
1.4.4 运算符的优先级

在这里插入图片描述

1.4.5 简单 MIPS CPU 中的 ALU

在这里插入图片描述

1.4.6 触发器

在这里插入图片描述

module dff_en(
 input clk,
 input en,
 input din,
 output reg q
);
always @(posedge clk) begin
 if (en) q <= din;
 
end
endmodule
1.4.6数字逻辑电路功能仿真常见错误及其调试方法
(1)功能仿真波形分析
1观察仿真波形的思路

第一步,熟悉待调试的设计

第二步,找到一个你能明确的错误点。

最后一步,从沿着设计的逻辑链条逆向逐级查看信号,直至找到源头。

(2)波形异常类错误的调试

信号为Z:

  1. RTL 里声明为 wire 型的变量从未被赋值;

  2. 模块调用的信号未连接导致的信号悬空。

信号为X:

  1. RTL 里声明为 reg 型的变量,从未被赋值;

  2. RTL 里写成了多驱动的代码,有时候也可能导致“X”。

波形停止:

往往是由于 RTL 里存在组合环路导致的

越沿采样:

越沿采样是指一个被采样的信号在上升沿采样到了其在上升沿后的值,

一般情况下认为这是一个错误,往往是由于 RTL 里阻塞赋值“=”和非阻塞赋值“<=”使用不当导致的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值