概述
Verilog-HDL简述
- 0 基本概念
- 0.1 描述方式(写代码方式 思维方式)
- 0.2 寄存器和线网定义
- 1 软件使用和仿真
- 2 组合逻辑电路
- 2.1 基本电路功能
- 3 触发器
- 3.1 异步RS触发器
- 3.1 同步RS触发器
- 3.3 异步T触发器
- 3.3.1 同步T触发器
- 3.4 同步D触发器
- 3.4.1 带有异步D触发器
- 4 时序逻辑带你路
- 4.1 寄存器
- 4.2 移位寄存器
- 4.3 计数器
不肖学生在校期间惹得老师生气,逐出实验室,心中一直由愧疚,但总是害怕无法当面去说,去找常老师道歉或者说明原由,一直时心里的难以迈过去的一道坎,很感谢常老师带我入门,教我知识和做人的道理。
不肖学生时至今日依然受惠于老师很多年前的著作《Verilog HDL工程实践入门》
0 基本概念
module 模块名(端口参数);module G(A,B,F)
端口定义 input A,B;
output F;
寄存器定义 reg C;
线网定义 wire D;
内置门原语 and G1(F,A,B)
或assign语句 assign F=A&B
endmodule
0.1 描述方式(写代码方式 思维方式)
- 门级描述方式;
内置门实例语句8种:and,nand,or,not,nor,xnor,buf;
输出在前,输入在后; and U1(F,A,B); - 数据流描述
最基本方法:连续使用Assign赋值语句。
使用位运算符 : 对应上面功能的部分运算符;
两个基本概念:功能模块和testbench
- 功能模块:就是自己所专注写的逻辑代码; 也成为底层模块。
- testbench:也成为测试程序,测试文件,顶层模块,就是要产生模拟的激励数据序列,并将其加于功能模块,然后把功能模块的输出信息由显示模块显示出来。 在这后面都成为顶层模块。
【例子】
`timescale 1ns/1ns 设置仿真的时延单位和时延精度
module AND_G2_TEST;
reg A,B;
wire F;
AND_G2 AND_G2 (A,B,F);
initial begin
A=0;B=0;
#100 A=1;
#100 A=0;B=1;
#100 A=1;
#200 $finish; //仿真结束
end
endmodule
-
行为级描述
相当于软件设计过程中的流程图描述和算法描述,专注于表达工作的抽象和软件的行为表现,不是具体的实现手段和方法。
行为级描述语法支持: -
case语句使用
case (表达式)
<case 分支项>
endcase
分支项表达式 语句
默认项(default) 语句 -
if_else语句的使用方法
-
function函数的使用方法
function函数的目的就是返回一个用于表达式的值。函数的定义格式如下:
function <返回值位宽或类型说明> 函数名;
端口定义;
局部变量定义;
其他语句;
endfunction -
用于方针的顶层模块
0.2 寄存器和线网定义
简单来说:
寄存器:用于输入;使用在always模块中,时寄存器可存储数据;
线网:用于输出,常用在assign语句中;
1 软件使用和仿真
这个再专门做一个专题;
2 组合逻辑电路
用到基础知识:数字逻辑电路
用Verilog代码实现功能基本就是 组合逻辑电路和时序逻辑电路的功能。
组合逻辑电路定义:该逻辑电路在任意时刻产生的输出只取决于该时刻的输入,而与电路过去的输入无关;
2.1 基本电路功能
- 数据选择器MUX
2-1,4-1 数据选择器
这个网上直接有代码;直接拿过来用;
**使用条件操作符 布尔表达式? 表达式 1 ,表达式 2 ;
用于仿真的顶层模块
`timescale 1ns/1ns
module SELE_TSET; //测试模块
reg [3:0] IN;
reg [1:0] SEL_IN;
wire F;
SEL SEL(IN[0],IN[1],IN[2],IN[3],SEL_IN,F); //底层模块名,实例名及参数定义
always #150 SEL_IN=SEL+1;
always #50 IN=IN+1;
initial begin
IN=0;SEL_IN=0; //参数初始化
#1200 $finish;
end
endmoudule
- 数据比较器
使用行为级描述方式;
module COMP(A,B,LG,EQ,SM);
input [1:0] A,B;
output LG,EQ,SM;
assign {LG,EQ,SM}=FUNC_COMP(A,B); //assign语句,实现function函数调用
function [2:0] FUNC_COMP //function函数及函数名,至enddunction函数为止
input [1:0] A,B;
if(A>B)
FUNC_COMP=3'b100;
else if(A<B)
FUNC_COMP=3'b001;
else
FUNC_COMP=3'b010;
endfunction
endmodule
位拼接运算符{} 和数值常量
数值常量:d为十进制 ; h为十六进制; o为八进制;b为二进制;
【顶层模块书写】
`timescale 1ns/1ns
module COMP_TEST;
reg [1:0] A,B;
wire LG,EQ,SM;
COMP COMP(A,B,LG,EQ,SM); //底层模块名,实例名及参数定义
always
- 编码器
【行为级描述】
module ENC (IN,Y); //模块名,端口及参数定义
input [3:0] IN;
output [1:0] Y;
assign Y=FUNC_ENC(IN);
function [1:0] FUNC_ENC;
input [3:0] SW_IN;
case(IN)
SW_IN0:FUNC_ENC=0;
SW_IN1:FUNC_ENC=1;
SW_IN: FUNC_ENC=2;
SW_IN: FUNC_ENC=3;
endcase
endfunction
endmodule
【测试模块】
`timescale 1ns/1ns
module ENC_TEST;
reg [3:0] IN;
wire [1:0] Y;
integer i,j;
ENC ENC (IN,Y);
initial begin
j={2'b10,2'b00,1'b1};
for(i=0;i<=3;i=i+1)
begin
i=j>>1;
IN=j[3:0];
#200
end
$finish
end
endmodule
4.译码器
BCD译码器描述
3 触发器
时序逻辑电路的基本单元电路是触发器;
时序逻辑电路:在任意时刻,电路产生的稳定输出不仅与当前时刻的输入有关,而且还与电路过去的输入有关。
3.1 异步RS触发器
【行为级描述】
module RS_FF(R,S,Q,QB);
input R,S;
output Q,QB;
reg Q,QB;
always@(R OR S)
case({R,S})
0:begin Q<=Q;QB<=QB;end
1:begin Q<=1;QB<=0; end;
2:begin Q<=0;QB<=1;end
3:begin Q<=1'bx;QB<=1'bx;end
endcase
endmodule
always块语句使用:块内的语句是不断重复执行的,括号内为敏感表达式
3.1 同步RS触发器
加上一个CLK时钟信号;
【功能描述模块】
module SY_RS_FF(R,S,CLK,Q,QB);
input R,S,CLK;
output Q,QB;
reg Q;
assign QB=~Q;
always@(posedge CLK)
case ({R,S})
0:Q<=0;
1:Q<=1;
2:Q<=0;
3:Q<=1'bx;
endcase
endmodule
【顶层模块】
`timescale 1ns/1ns
module SY_RS_FF_TEST
reg R,S,CLK;
wire Q,QB;
parameter STMP=40;
SY_RS_FF SY_RS_FF (R,S,CLK,Q,QB);
always #(STEP/2) CLK=~CLK;
initial begin
CLK=1;R=0;S=0;
#(STMP-10) R=1;
#(STMP) R=0;
#(2*STMP-30) S=1;
#(STMP-20) R=1;
#(2*STEMP-10) $finish;
end
endmodule
3.3 异步T触发器
Q在T上升沿变化时有效,输出端翻转;
3.3.1 同步T触发器
3.4 同步D触发器
3.4.1 带有异步D触发器
4 时序逻辑带你路
着重看由触发器组成的几种时序逻辑电路。
4.1 寄存器
4.2 移位寄存器
4.3 计数器
最后
以上就是还单身书本为你收集整理的Verilog简述0 基本概念1 软件使用和仿真2 组合逻辑电路3 触发器4 时序逻辑带你路的全部内容,希望文章能够帮你解决Verilog简述0 基本概念1 软件使用和仿真2 组合逻辑电路3 触发器4 时序逻辑带你路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复