FPGA学习day2 代码报错总结以及Vivado使用中遇到的问题

按照上一篇介绍的fpga设计流程:FPGA开发流程以及Vivado的使用(一)-CSDN博客,今天使用Vivado对38译码器进行了编写,遇到了一些问题,在这里记录一下。

首先,上篇博客中提到了仿真时长的问题,发现可以通过改变Vivado默认的仿真时长解决,点击左侧栏中的Simulation->Settings,选择合适的仿真时间,比如2000ns,此时在运行仿真,可以看到右侧出现的波形中仿真时间变成了2000ns,但是我的代码中遍历全部情况只需要1400ns,因此可以添加$stop,运行仿真后会自动在1400ns停止。但如果仿真时长仍设定为1000ns,仿真过程就不会执行$stop想进行的操作。

下面总结一下今天遇到的两个报错。设计文件形成组合电路后没有问题,在运行仿真文件时首先出现名为[XSIM 43-3322]Static elaboration of top level Verilog design unit(s) in library work failed.的报错。不太理解这里面提到的静态精化是什么意思,但就是说我们顶层Verilog设计单元在库工作中加载失败了。那么应该说明我在引用实例的时候出现了错误,经过检查发现,我在仿真文件中将设计文件中定义的名称敲错了,所以出现了这个问题。

改正后,上述错误消失,又出现了第二个错误:[VRFC 10-3236] concurrent assignment to a non-net 'out1' is not permitted,这是说我使用的out1变量的类型存在问题,在上图中可以看到out1时reg类型变量。因此把它改为wire,这个报错也解决了,仿真运行正确。

为了更加深刻的理解reg和wire类型的区别,从写程序的角度来讲,使用触发模块(always@)进行赋值时必须使用reg类型的变量,这也是在设计文件decode3_8.v中声明out为reg类型的原因(如果不特殊说明,默认所有变量的类型都是wire,就像输入的a,b,c都是wire类型)。

02B 基于Vivado的FPGA开发流程实践_哔哩哔哩_bilibili

wire类型可以理解为电线,直接进行传输,在小梅哥的第二个讲解视频中提到了仿真就相当于设计好的模块当作一个黑箱,对输入进行赋值(也就是38译码器的a,b,c端口),检测译码器的输出,将期望结果与实际结果过进行比对来查看设计是否正确。这里的检测输出可以理解为:在译码器的输出端口out外连接一个示波器来读取波形,因此在仿真文件中定义的这个output的类型就对应着示波器与译码器输出端口的连线,因此应该使用wire类型。

在解决完这些错误后,遇到了一个小插曲,就是无论我怎么点击Simulation,仿真波形都不更新。然后我才发现原来使用左键和右键点击Simulation出现的是不同的操作😂,当然只有选择Run Simulation的操作才能看到新的波形啦。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BPSK 调制是一种基本的数字调制方式,可以用于数字通信系统。下面给出一个简单的 BPSK 调制的 FPGA 代码设计及 Vivado 仿真代码。 设计思路: 1. 生成随机比特序列。 2. 将输入比特序列转化为BPSK调制信号。 3. 输出BPSK调制信号。 代码实现: ``` module bpsk( input clk, input reset, input [7:0] in_data, output reg out_signal ); // 随机比特序列 reg [7:0] data [0:127]; integer i, j; // 正弦波形数据 reg [31:0] sin_data [0:1023]; integer k; reg [9:0] addr; // 初始化数据 initial begin // 初始化随机比特序列 for (i = 0; i < 128; i = i + 1) begin for (j = 0; j < 8; j = j + 1) begin data[i][j] = $random; end end // 初始化正弦波形数据 for (k = 0; k < 1024; k = k + 1) begin sin_data[k] = $sin(2 * $pi * k / 1024) * 2047.5 + 2047.5; end end // BPSK调制 always @(posedge clk) begin if (reset) begin out_signal <= 1'b0; addr <= 10'd0; end else begin if (addr == 10'd1023) begin addr <= 10'd0; end else begin addr <= addr + 10'd1; end out_signal <= data[addr[9:2]][addr[1:0]] ? sin_data[addr][31] : ~sin_data[addr][31]; end end endmodule ``` Vivado 仿真代码: ``` `timescale 1ns / 1ns module bpsk_tb(); reg clk; reg reset; reg [7:0] in_data; wire out_signal; bpsk uut( .clk(clk), .reset(reset), .in_data(in_data), .out_signal(out_signal) ); initial begin clk = 1'b0; forever #5 clk = ~clk; end initial begin reset = 1'b1; in_data = 8'b0; #10 reset = 1'b0; #100000 $finish; end endmodule ``` 在 Vivado 创建工程,将 bpsk 模块和 bpsk_tb 模块添加到工程。运行仿真即可得到仿真波形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值