静态网页怎么做网站wordpress 注册页面插件
静态网页怎么做网站,wordpress 注册页面插件,工作室做网站,土特产网站平台建设1. 数据类型
1.1 常量
整数#xff1a;整数可以用二进制b或B#xff0c;八进制o或O#xff0c;十进制d或D#xff0c;十六进制h或H表示#xff0c;例如#xff0c;8’b00001111表示8位位宽的二进制整数#xff0c;4’ha表示4位位宽的十六进制整数。 X和Z#xff1a;X…
1. 数据类型
1.1 常量
整数整数可以用二进制b或B八进制o或O十进制d或D十六进制h或H表示例如8’b00001111表示8位位宽的二进制整数4’ha表示4位位宽的十六进制整数。 X和ZX代表不定值z代表高阻值例如5’b00x11第三位不定值3’b00z表示最低位为高阻值。 下划线在位数过长时可以用来分割位数提高程序可读性如8’b0000_1111 1.2 参数
参数 parameterparameter可以用标识符定义常量运用时只使用标识符即可提高代码可读性及维护性如定义parameterwidth 8 ; 定义寄存器reg[width-1:0] a; 即定义了8位宽度的寄存器。 参数的传递在一个模块中如果有定义参数在其他模块调用此模块时可以传递参数并可以修改参数如下所示在module后用#表示。 1.3 传参示例
例如模块定义如下该ROM模块有两个输入参数其中addr变量为15位位宽data变量为8位位宽
module ROM
#( parameter depth15, parameter width 8
)
( input [depth-1:0] addr, input[width-1:0] data, output result
) ;
endmodule 调用该ROM模块时可以在调用时修改传参来修改参数。如下代码在调用ROM模块时将depth和width变量的位宽分布修改成了32位位宽和16位位宽。
module top() ; wire [31:0] addr ;
wire [15:0] data ;
wire result ; ROM
#( .depth(32), .width(16)
)
ROM1
( .addr(addr) , .data(data) , .result(result)
) ; endmodule Parameter可以用于模块间的参数传递而localparam仅用于本模块内使用不能用于参数传递。Localparam多用于状态机状态的定义。 1.4 变量
变量是指程序运行时可以改变其值的量下面主要介绍几个常用了变量类型。 1.4.1 Wire型
Wire 类型变量也叫网络类型变量用于结构实体之间的物理连接如门与门之间不能储存值用连续赋值语句assign赋值定义为wire[n-1:0] a ;其中n 代表位宽如定义wire a ; assign a b ;是将b的结点连接到连线a上。如下图所示两个实体之间的连线即是wire类型变量。 1.4.2 Reg型
Reg类型变量也称为寄存器变量可用来储存值必须在always语句里使用。其定义为reg [n-1:0] a ;表示n位位宽的寄存器如reg [7:0] a;表示定义8位位宽的寄存器a。
如下所示定义了寄存器q
module TOP
( input d, input clk, output reg q
) ; always (posedge clk)
begin q d ;
end
endmodule
生成的电路为时序逻辑下图为其结构为D触发器。 也可以生成组合逻辑如下面代码所示为一个数据选择器敏感信号没有时钟
module TOP
( input a, input b, input c, input d, input[1:0] sel, output reg Mux
) ; always (sel or a or b or c or d)
begin case(sel) 2b00 : Mux a ; 2b01 : Mux b ; 2b10 : Mux c ; 2b11 : Mux d ; endcase
end
endmodule
最终生成电路为组合逻辑。 1.4.3 Memory型
可以用memory类型来定义RAM、ROM等存储器其结构为reg [n-1:0]存储器名[m-1:0]意义为m个n位宽度的寄存器。例如reg [7:0] ram [255:0]表示定义了256个8位寄存器256也即是存储器的深度8为数据宽度。 2. 运算符
运算符可分为以下几类
1算术运算符-*/%
2赋值运算符
3关系运算符!
4逻辑运算符||
5条件运算符
6位运算符~|^^~
7移位运算符
8拼接运算符{ }
大部分运算符与C/C语言中定义的运算符用法基本上一致这里主要介绍几种与C/C语言中差异较大的运算符。 2.1 赋值运算符
“”为阻塞赋值””为非阻塞赋值。阻塞赋值为执行完一条赋值语句再执行下一条可理解为顺序执行而且赋值是立即执行非阻塞赋值可理解为并行执行不考虑顺序在always块语句执行完成后才进行赋值。
2.1.1 阻塞赋值运算符
下面先介绍阻塞赋值代码如下
module TOP
( input din, input clk, output reg a,b,c
) ; always (posedge clk)
begin a din; b a; c b;
end
endmodule 下面是上面模块对应的仿真代码用于给上面模块提供时钟、激励信号用于仿真模块功能的正确性
module SimFile (); reg din ;
reg clk ;
wire a,b,c ; initial
begin din 0 ; clk 0 ; forever begin #({$random}%100) // 随机等待一段时间0~99ns之间 din ~din ; end
end always #10 clk ~clk ; TOP TOP_i
( .clk(clk), .din(din), .a(a), .b(b), .c(c)
); clk时钟的周期是20ns从仿真结果可以看到在clk的上升沿时寄存器a的值等于输入din的值并立即赋给寄存器bb的值赋给c。 上面编写的阻塞赋值TOP模块在FPGA内部布局成的电路RTL如下图所示由RTL可以明显看出在每个时钟周期上沿到来时寄存器a、b、c的值都被统一赋值成了输入din的值。 2.1.2 非阻塞赋值运算符
将上面编写TOP模块的赋值方式改为非阻塞赋值方式代码如下
module TOP
( input din, input clk, output reg a,b,c
) ; always (posedge clk)
begin a din; b a; c b;
end
endmodule 仿真代码仍然使用2.1.1节的仿真代码提供时钟和激励信号仿真结果如下 在每个时钟clk上升沿时寄存器a的值没有立即赋值给bb为a原来的值同样c为b原来的值。上面编写的非阻塞赋值TOP模块在FPGA内部布局成的电路RTL如下图所示。 一般情况下在时序逻辑电路中使用非阻塞赋值可避免出现竞争冒险现象。在组合逻辑中使用阻塞赋值执行赋值语句后立即改变。在assign语句中必须用阻塞赋值。 2.2 位拼接运算符
“{ }”拼接运算符将多个信号按位拼接如{a[3:0], b[1:0]}将a的低4位b的低2位拼接成6位数据。
{n{a[3:0]}}表示将n个a[3:0]拼接{n{1’b0}}表示n位的0拼接。如{8{1’b0}}表示为8’b0000_0000。 2.3 运算符的优先级
各种运算符的优先级别如下图所示
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90351.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!