Verilog学习:
1.P31 例3.1
仿真一直在报错:
未解决。
本例的意思是在Deccode模块已定义变量:Width=1,Polarity=1。在top模块引用时,通过 #(4,0),实例D1实际引用的是:Width=4,Polarity=0的Deccode模块;通过 #(5),实例D2实际引用的是:Width=5,Polarity=1的Deccode模块;
2.P31 例3.2
本例的意思是不仅有例3.1的方法改变常量的值,还可以利用dafparam命令。
3.变量:
wire
reg
memory:通过扩展reg型数据的地址范围来生成。
4.运算符
单目运算符:clock=~clock,单目取反运算符,带一个操作数
双目运算符:c=a|b,双位按位或运算符,可以带两个操作数
三目运算符:r=s?t:u,三目条件运算符,带三个操作数
整数除法运算时,结果要省略小数部分,只取整数部分;进行取模运算时,结果值的符号位采用模运算式的第一个操作数的符号位。
5.运算符
逻辑运算符:与&& 、或|| 、非!
关系运算符:>、 <、 <=、 >=
等式运算符:等于==、不等于!=、等于===、不等于!==
说明:==两个操作数必须完全一致,===两个操作数可以都是不定值或高阻态,输出为1,而==则会输出x。
移位运算符:<<n 左移n位,>>n右移n位。
位拼接运算符:{信号1的某几位,信号2的某几位,...信号n的某几位}
{a,b[3],c[2],w,1'b1,1'b0,...}
{4{w}}等价于{w,w,w,w}
{b,{3{a,b}}}等价于{b,a ,b,a,b,a,b}
缩减运算符:
运算优先级:
6.赋值语句和块语句
非阻塞赋值方式:b<=a;
阻塞赋值方式:b=a;
举例说明:
always@(posedge clk)
begin
b<=a;
c<=b;
end
赋值是在“always”块结束后执行的,c应该为原来的b值。
always@(posedge clk)
begin
b=a;
c=b;
end
时钟上升沿到来时,b取a的值,c取b的值(即马上等于a的值)。
7.块语句
begin_end 顺序执行
fork_end 并行执行
8.条件语句if_else
条件语句必须在过程块中使用。所谓的过程块语句就是指由initial和always语句引导的执行语句的集合。
always @()
begin
if() out1=int1;
else out2=int2;
end
9.case语句
default
10.repeat语句
设计一个乘法器,8位二进制的乘法器。
乘法器
module mult_repeat(a,b,outcome);
parameter size=8;
input [size:1] a,b;
output [2*size:1] outcome;
reg [2*size:1] temp_a,outcome;
reg [size:1] temp_b;
always @(a or b)
begin
outcome = 0;
temp_a = a;
temp_b = b;
repeat (size) //repeat语句,size为循环次数
begin
if(temp_b[1]) //如果temp_b的最低位为1,就执行下面的加法
outcome = outcome + temp_a;
temp_a = temp_a << 1; //操作数a左移一位
temp_b = temp_b >> 1; //操作数b右移一位
end
end
endmodule
测试文件
`timescale 1ns / 1ps
module tb;
// Inputs
reg [8:1] a;
reg [8:1] b;
// Outputs
wire [16:1] outcome;
// Instantiate the Unit Under Test (UUT)
mult_repeat uut (
.a(a),
.b(b),
.outcome(outcome)
);
initial begin
// Initialize Inputs
a =8'b00000000;
b =8'b00000000;
// Wait 100 ns for global reset to finish
#10;
// Add stimulus here
a =8'b00000011;
b =8'b00000011;
end
endmodule