首页 > 其他 > 详细

Verilog基础

时间:2020-06-17 19:40:43      阅读:256      评论:0      收藏:0      [点我收藏+]

一、常量parameter
1.模块中的参数传递
module rom #(
parameter depth = 15,
parameter width = 8
)
(
input [depth-1:0] addr,
input [width-1:0] data,
output result
);
endmodule
直接调用模块:
module top();
wire [31:0] addr;
wire [15:0] data;
wire result;
rom #(
.depth(32),
.width(16)
) uut_rom
(
.addr(addr),
.data(data),
.result(result)
);
endmodule

二、变量
1.wire
Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储
存值,用连续赋值语句 assign 赋值。
技术分享图片

2.reg
技术分享图片
技术分享图片

3.memory
可以用 memory 类型来定义 RAM,ROM 等存储器,其结构为 reg [n-1:0] 存储器名[m-1:0],意义
为 m 个 n 位宽度的寄存器。例如,reg [7:0] ram [255:0]表示定义了 256 个 8 位寄存器,256 也即
是存储器的深度,8 为数据宽度。前面是数据宽度,后面是数据深度

三、运算法
1.赋值运算符
“=”阻塞赋值,”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为
顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句
执行完成后,才进行赋值。 如下面的阻塞赋值:
always @(posedge clk) begin
a = din;
b = a;
c = b;
end

阻塞赋值
技术分享图片

非阻塞赋值
技术分享图片
这个就相当于延迟一个时钟进行数据的打拍。

一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免仿真时出现竞争冒险现象;在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变;在 assign 语句中必须用阻塞赋值。

四、组合逻辑
组合逻辑电路的特点是任意时刻的输出仅仅取决于输入信号,输入信号变化,输出立即变化,不依赖于时钟。
在组合电路仿真的时候,使用下列语句:
forever
begin

({$random}%100)
a=~a;

({$random}%100)
b=~b;
end
1.门电路
1.与门& c=a&b; 按位与
2.或门| c=a|b;
3.非门~ b=~a;
4.异或^ c=a^b; a,b不同则为1。

2.比较器
c=a>b; a大于b,则c为1,否则为0;

3.半加器
a,b,sum,count(进位)
技术分享图片
sum = a^b;也就是异或
count = a&b;

4.全加器
cin,a,b,sum,count
技术分享图片

5.乘法器
c=a*b;

6.数据选择器
sel[1:0] Mux为输出信号
技术分享图片
always语句中使用电平触发(输入的数据变化或者sel变化则触发),通过使用case语句。

  1. 3-8译码器
    A[2:0] b[7:0]
    等同于数据选择器。

1.8三态门
技术分享图片

五、时序逻辑
1.触发器
D 触发器在时钟的上升沿或下降沿存储数据,输出与时钟跳变之前输入信号的状态相同。

2.两级D触发器
组合逻辑电路在逻辑功能上特点是任意时刻的输出仅仅取决于当前时刻的输入,与电路原来的状态无关。而时序逻辑在逻辑功能上的特点是任意时刻的输出不仅仅取决于当前的输入信号,而且还取决于电路原来的状态。
技术分享图片

3.带异步复位的D触发器
异步复位是指独立于时钟,一旦异步复位信号有效,就触发复位操作。 这个功能在写代码时会经常用到,用于给信号复位,初始化。
技术分享图片

4.移位寄存器
移位寄存器是指在每个时钟脉冲来时,向左或向右移动一位,由于 D 触发器的特性,数据输出同步于时钟边沿,其结构如下,每个时钟来临,每个 D 触发器的输出 q 等于前一个 D 触发器输出的值,从而实现移位的功能。
input d;
output reg [7:0] q;
q <= {q[6:0],d};

5.单口ram

六、有限状态机
1.Mealy 有限状态机,输出不仅与当前状态有关,也与输入信号有关,在 RTL 中会与输入信号有连接。

2.Moore 有限状态机,输出只与当前状态有关,与输入信号无关,输入信号只影响状态的改变,不影响输出,比如对 delay_cnt 和 q 的处理,只与 state 状态有关。
三段式状态机的写法。
module top
(
input shift_start,
input shift_stop,
input rst,
input clk,
input d,
output reg [7:0] q
);
parameter Idle = 2‘d0 ; //Idle state
parameter Start = 2‘d1 ; //Start state
parameter Run = 2‘d2 ; //Run state
parameter Stop = 2‘d3 ; //Stop state
reg [1:0] current_state ; //statement
reg [1:0] next_state ;
reg [4:0] delay_cnt ; //delay counter
//First part: statement transition
always @(posedge clk or negedge rst)
begin
if (!rst)
current_state <= Idle ;
else
current_state <= next_state ;
end
//Second part: combination logic, judge statement transition condition
always @(*)
begin
case(current_state)
Idle : begin
if (shift_start)
next_state <= Start ;
else
next_state <= Idle ;
end
Start : begin
if (delay_cnt == 5‘d99)
next_state <= Run ;
else
next_state <= Start ;
end
Run : begin
if (shift_stop)
next_state <= Stop ;
else
next_state <= Run ;
end
Stop : next_state <= Idle ;
default: next_state <= Idle ;
endcase
end
//Last part: output data
always @(posedge clk or negedge rst)
begin
if (!rst)
delay_cnt <= 0 ;
else if (current_state == Start)
delay_cnt <= delay_cnt + 1‘b1 ;
else
delay_cnt <= 0 ;
end
always @(posedge clk or negedge rst)
begin
if (!rst)
q <= 0 ;
else if (current_state == Run)
q <= {q[6:0], d} ;
else
q <= 0 ;
end
endmodule

Verilog基础

原文:https://www.cnblogs.com/Les1smor/p/13153995.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!