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