读懂一个Verilog工程代码主要通过以下方面:1、区分好结构,一个工程是由基本的顶层、模块、约束等部分组成的,通常模块都是在顶层中逐一实例化,所以,了解一个工程的结构就是从顶层逐一向下延伸,相当于植物的根系,最底层的模块往往是被“引用”最多的,也是最基础的构成。2、通过代码注释来辅助阅读,一段好的代码必须有70%~80%的注释,方便进行工作交接,以及多人讨论。重点通过代码结合注释,看懂工程师的意图,查找设计不严谨的地方。3、verilog代码实际上就是在画电路图,是一种硬件描述语言,在读代码的同时,头脑中要有电路的概念,知道电路的大概结构是什么样的,每个模块的扇入扇出等。当然,最基本的还是对语法和原理要有较好的基础,否则,很难看懂一些大规模的电路描述。
问题在这里:
output [3:0]sum; //statistics number
reg sum;
sum被定义为位宽为1的寄存器型,而又被定义位宽为4的输出,不是冲突了嘛!
改为
output [3:0]sum; //statistics number
reg [3:0] sum;
起码编译能通过了。
但是能否综合还难说。一看你的编写风格,就是个新手。这种写法不符合业界规范,综合后很费资源的。
module fenpin1khz(clk,clk1khz); //创建叫fenpin的程序块
input clk; //输入clk
output reg clk1khz; //定义寄存器类输出
integer i; //定义数据类型i
initial //赋予初始值,从begin到end
begin
i=0;
clk1khz<=0;
end
always @(posedge clk) //每检测到时钟上升沿就执行一次下面的程序
begin
i=i+1; //i累加
if(i==3000) //判断i够3000了没
begin //如果满足条件则,i=0,clk1khz反相输出(即由0变1或者由1变0)
i=0;
clk1khz<=~clk1khz;
end
end
endmodule
2
module div_rill(input[5:0] a,input[5:0] b,output reg [5:0] yshang,output reg [5:0] yyushu);//创建程序模块
reg[5:0] tempa; //下面5行都是定义数据类型
reg[5:0] tempb;
reg[11:0] temp_a;
reg[11:0] temp_b;
integer i;
always @(a or b) //如果a或者b的值改变,则执行以下程序、命令
begin
tempa <= a; //给tempa赋值
tempb <= b; //给tempa赋值
end
always @(tempa or tempb) //如果tempa或者tempb的值改变,则执行以下程序、命令
begin
temp_a = {6'b000000,tempa}; //赋值
temp_b = {tempb,6'b000000}; //赋值
for(i = 0;i < 6;i = i + 1) //循环执行下面程序6次
begin
temp_a = {temp_a[10:0],1'b0}; //赋值
if(temp_a[11:6] >= tempb) //比较temp_a[11:6] 与tempb大小,如果前者大则执行下面的命令,否则执行else后面的命令
temp_a = temp_a - temp_b + 1'b1; //计算
else
temp_a = temp_a; //赋值
end
yshang <= temp_a[5:0]; //赋值
yyushu <= temp_a[11:6]; //赋值
end
endmodule
以上就是关于怎样快速看懂一个较大的verilog模块代码全部的内容,包括:怎样快速看懂一个较大的verilog模块代码、帮我看个Verilog程序,modulesim仿真显示、Verilog HDL语言释义第二篇等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)