module《模块名》
参数定义
端口类型说明
数据类型定义
assign
always initial
任务和函数
endmodule
//8位加法计数器 module counter8(out,cout,data,load,cin ,clk)
output【7:0】out;
output cout;
input load,cin,clk; // load初始位,cin是进位 input【7:0】data;
reg 【7:0】out; // reg寄存器类型 always@(posedge clk) //总是检测, @有when 的意思。 begin
if(load)
out=data //置数 else
out= out+cin ;//计数或保持 end
assign cout =&out&cin //&out = out【7】&out【6】。。。。&out【1】所有位endmodule
bufif1 bufif0 notif1 notif0 三态门
nand xnor 同或门
module gateinst (a,b,c,d,y)
input a,b,c,d
output y
wire x
and andgate(x,a,b,c)
//加法器
module counter8(out,cout,data,load,cin,clk);
output【7:0】 out;
output cout;
input load, cin,clk;
input【7:0】data;
reg【7:0】 out;
always @(posedge上升沿 clk) negedge 下降沿
begin
if(load) out =data ;
else
out =out+cin;
end
assign &cin&out ; 连续赋值, 常用对wire变量赋值,随时变化随时赋值
end module
过程赋值 :
1。非阻塞赋值, 块结束时才赋值,
2。阻塞赋值, 该语句结束时赋值。
常量:
位宽‘ 进制 数字
8是二进制八位 例如 8‘o305 011000101
变量:网络型 wire 常用来表示assign语句赋值的组合逻辑信号,缺省自动定义为wire型
寄存器型 reg integer real time
reg a,b; reg 【7:0】 mymem【1023:0】 1k字节 8bits的存储器
== 相等和 === 全等的区别是什么?
A== 1’bx 不会为真 ,而=== 对于x不定态和高阻态z会判断为真
《=赋值 时序,非阻塞赋值。 =阻塞赋值,组合逻辑电路。
reg【3:0】a; &a 就是a 每一位互相与
MUX out =sel?in1:in0;
优先级
!~ 运算符
& , |
* / %
initial 主要面向功能模拟,通常不具有可综合性,
begin
初始化变量
初始化存储器
end
always@
begin
end
always 不能嵌套
一般assign是组合逻辑电路 ,直接赋值
过程赋值 需要reg F ;
parameter MODULUS = 8’h59 //改变模的大小
7。7。2
case = C语言中的switch casez 高阻位不考虑。 casex高阻位和不定值都不考虑。只关心其他位。 ? 也可以
case(敏感语句式)
4’d0:
4’d1:
4’b1zzx: b=2’b11
4’b001?: b=2’b01
endcase
条件语句:
条件不满足时,会保持原值。组合电路要列出所有分支。否则会产生隐含触发器。
repeat (size) 循环size次, begin if() a < 1 b>1 end end
7。9 task 和function语句
task 《任务》
endtask
function 《返回值位宽或类型》 《函数名》; 手写的时候别忘了;
endfunction
7。11 语句的顺序执行 和并行执行
7。12 Verilog HDL 模型级别
行为描述级: 系统级,算法, 寄存器级
门级
开关级
7。12。1 行为级描述
Q &A
Q:为什么综合后点了debug没有出现原理图呢?
A: 因为测试文件置为顶层。重新设置顶层
Q:可不可以就一部分simulation? 比如只simulate comp ?
A:右击相应测试文件,设为顶层文件
出现的错误:
1. 调用mux的模块名字错了。解决方法:Mux模块名字改成对应的。 成功仿真。
2.仿真MUX结果,没有输出。 因为寄存器没有设置位宽 只写了reg out ;解决方法:改成 reg【N-1:0】 out
3. 信号只有in,out。无法调试。因为之前将测试文件置为顶层。解决方法:重新设置顶层。出现了各个模块的信号。
4. 端口不对应 in0输入有问题。解决方法: 修改in0(in0)为in0(a) 括号里 a为线,in0为模块中的端口。
5. 波形出错, 没有加入MUX 解决方法: 加入MUX
心得:
1.控制器一般采用二段式或三段式。
2.Verilog 不能用reg 作为调用模块的输出, 得用wire。
3.Modelsim 第三个可以zoom fit 直接窗口一样大小。
4.{}用作位拼接,所以 verilog中用begin end 来替代{}
5.zoom in active curve 可以以光标为中心放大。
6. always@(*) //always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行。
7. 改掉一个错误之后可以直接再次编译,因为一个错误有连环错误。
8. 控制器clear变量, always 里就是reg型, always外是wire型.
出现错误:
1.调用按键处理的模块名字错了。解决方法:按键处理模块名字改成对应的。 成功仿真。
2.仿真结果,没有输出。 因为寄存器没有设置位宽 只写了reg out ;解决方法:改成 reg【N-1:0】 out
3. 信号只有in,out。无法调试。因为之前vivado将测试文件置为顶层。解决方法:重新设置顶层。出现了各个模块的信号。
4. 端口不对应 in0输入有问题。解决方法: 修改in0(in0)为in0(a) 括号里 a为线,in0为模块中的端口。
5. 波形出错, 没有加入MUX 解决方法: 加入MUX
6.下载后显示出错 解决方法: 52位没必要用变量传递,
7. 一开始的时候parameter sim是0,tb测试时才传入1
8. Q:为什么综合后点了debug没有出现原理图呢?
A: 因为把测试文件置为顶层。重新设置顶层
9. Q:可不可以就一部分simulation? 比如只simulate comp ?
A:右击相应测试文件,设为顶层文件
10. 还有一个错误,是输入变量不能直接定义为reg。