fix: 修复向量定义错误

This commit is contained in:
Liphen 2023-11-03 15:29:44 +08:00
parent 0b4977aaec
commit 5b775df08a
1 changed files with 129 additions and 122 deletions

View File

@ -126,7 +126,7 @@ endmodule
例子如:
```verilog
assign a = (b === 8'b00100101) ? 0 : 1;
assign a = (b == 8'b00100101) ? 0 : 1;
```
其中 `8'b00100101`就是整数常量;当没有指定位宽时,综合器会自己自动判断位宽;当没有指定进制时,默认为十进制。
@ -184,13 +184,13 @@ endmodule
wire 类型的向量:
```verilog
wire [0: 7] a; // 通过这种写法可以定义一个8位宽的信号
wire [0: 7] b;
wire [0: 15] c;
wire [0: 3] d;
wire [7: 0] a; // 通过这种写法可以定义一个8位宽的信号
wire [7: 0] b;
wire [15: 0] c;
wire [3: 0] d;
wire f;
assign c = {a, b}; // 使用大括号可以将两种信号进行拼接此时a为c的高8位b位c的低8位
assign d = a[0: 3]; // 使用冒号可以对信号进行切片此时d为a的低4位
assign d = a[3: 0]; // 使用冒号可以对信号进行切片此时d为a的低4位
assign f = a[2]; // 此时f为a的第三位
```
@ -198,7 +198,7 @@ assign f = a[2]; // 此时f为a的第三位
reg 类型的向量:
```verilog
reg [0: 7] cnt;
reg [7: 0] cnt;
// 在clock和rst发生变化时对cnt进行赋值
always @(posedge clock or posedge rst) begin
if (rst) begin
@ -240,15 +240,16 @@ data_4d[0][0][0][0][15: 0] = 15'd3 ; // 将数组data_4d中标号为[0][0][0][0]
参数可以使得我们的模块更具有拓展性,下面是一个简单的例子:
```verilog
module Mux4to1 #(
parameter WIDTH = 8 // 定义了参数WIDTH表示数据的宽度
module Mux4 #(
parameter DATA_WIDTH = 8,
parameter SEL_WIDTH = $clog2(4) // $clog2(x)返回大于等于log2(x)的最小整数
) (
input wire [WIDTH - 1: 0] A,
input wire [WIDTH - 1: 0] B,
input wire [WIDTH - 1: 0] C,
input wire [WIDTH - 1: 0] D,
input wire [1: 0] Sel,
output reg [WIDTH - 1: 0] Y
input wire [DATA_WIDTH - 1: 0] A,
input wire [DATA_WIDTH - 1: 0] B,
input wire [DATA_WIDTH - 1: 0] C,
input wire [DATA_WIDTH - 1: 0] D,
input wire [SEL_WIDTH - 1: 0] Sel,
output reg [DATA_WIDTH - 1: 0] Y
);
always @ ( * )
case (Sel)
@ -278,6 +279,7 @@ Verilog提供了一系列运算符用于在硬件描述中执行各种算术
- `%`:取模(取余)运算符。
注:`*`, `/`, `%`一般不用在电路设计中,因为他们会被综合器综合成一个时序很差的电路,大大影响硬件性能。
2. 位操作运算符:
- `&`:按位与运算符。
@ -286,11 +288,13 @@ Verilog提供了一系列运算符用于在硬件描述中执行各种算术
- `~`:按位取反运算符。
- `<<`:左移运算符。
- `>>`:右移运算符。
3. 逻辑运算符:
- `&&`:逻辑与运算符。
- `||`:逻辑或运算符。
- `!`:逻辑非运算符。
4. 比较运算符:
- `==`:等于运算符。
@ -299,10 +303,12 @@ Verilog提供了一系列运算符用于在硬件描述中执行各种算术
- `<`:小于运算符。
- `>=`:大于等于运算符。
- `<=`:小于等于运算符。
5. 赋值运算符:
- `=`:非阻塞赋值运算符。
- `<=`:阻塞赋值运算符。
6. 条件运算符:
- `? :`:条件运算符 (ternary operator),也称为三元运算符。例如:`a ? b : c` 表示如果 `a` 为真,则结果为 `b`,否则结果为 `c`
@ -310,10 +316,10 @@ Verilog提供了一系列运算符用于在硬件描述中执行各种算术
此外Verilog 还提供了其他运算符,如拼接运算符 `{}`, 重复运算符 `{}`, 范围运算符 `[]` 等,用于位操作和信号处理。
```verilog
wire [0: 7] a;
wire [0: 31] b;
wire [0: 3] c;
wire [0: 7] d;
wire [7: 0] a;
wire [31: 0] b;
wire [3: 0] c;
wire [7: 0] d;
// 重复运算的例子
assign b = {4{a}}; // 等价于b = {a, a, a, a}b由a重复4次组成
// 拼接运算的例子
@ -519,7 +525,7 @@ beginend就类似于C语言中的大括号用于表示一个语句块。
```verilog
module Mux4(
input [0: 1] s,
input [1: 0] s,
input in0,
input in1,
input in2,
@ -548,7 +554,7 @@ endmodule
```verilog
module Mux4(
input [0: 1] s,
input [1: 0] s,
input in0,
input in1,
input in2,
@ -695,9 +701,9 @@ Verilog的行为建模可以分为两种类型组合逻辑行为建模和时
```verilog
module Mux2to1(
input wire sel,
input wire a,
input wire b,
input wire sel,
output wire y
);
@ -719,6 +725,7 @@ Verilog的行为建模可以分为两种类型组合逻辑行为建模和时
endmodule
```
2. 时序逻辑行为建模:
时序逻辑行为建模用于描述电路中的时序逻辑部分,其中输出不仅依赖于当前的输入,还依赖于过去的输入或电路内部的状态。在时序逻辑行为建模中,可以使用 `always`块和时序控制语句(如 `if`语句、`case`语句等)。
@ -802,7 +809,7 @@ module testbench();
parameter MAIN_FRE = 100; // unit MHz
reg sys_clk = 0;
reg sys_rst = 1;
reg [0:3] test_data = 0; // 我们有4个输入因此设置4位宽的test_data
reg [3: 0] test_data = 0; // 我们有4个输入因此设置4位宽的test_data
always begin
#(500 / MAIN_FRE) sys_clk = ~sys_clk;