Verilog、FPGA、统一寄存器的使用

2023-12-11

我有一个问题,关于我正在开发的 AGC/SPI 控制器在我看来奇怪的行为。它是用 Verilog 完成的,针对的是 Xilinx Spartan 3e FPGA。该控制器是一个依赖外部输入来启动的 FSM。 FSM的状态存储在状态寄存器它没有显式初始化,因为我认为未初始化的寄存器将默认为零。当我实现控制器时,FSM 不会运行。监视 SPI 总线时我没有观察到任何活动。为了监控 FSM,我路由了状态寄存器到连接 LED 组的输出总线。这就是这条线分配 data_out = state_reg是在做。但我发现,当我这样做时,FSM 的 AGC/SPI 控制器可以正常运行,正如在 SPI 总线上观察到的那样。似乎正在发生的事情是这样的状态寄存器初始化时处于未确定状态,因此 FSM 永远不会处于任何状态,因此它不会运行。但通过分配状态寄存器到它初始化为的输出00000000正如我从一开始就预期的那样。所以我的问题是,未初始化的寄存器是否应该假定值为 0?通过将未初始化的寄存器分配给输出,是否会强制其假定为零?还是这里发生了其他我不明白的事情?下面是我的代码。我已经评论了分配 *state_reg** 的相关部分输出线[7:0] data_out。我知道这是一个很长的问题,但我真的很想了解我应该期待什么类型的行为。谢谢。

  module agc_control
        (
            input wire [7:0] agc_data,
            input wire clk,
            input wire agc_start,
            input wire AMP_DO,
            output reg MOSI,
            output reg SCK,
            output reg CS_AMP,
            output wire inhibit_ADC,
            output wire [7:0] data_out  
         );

        //signals
        reg [4:0] state_reg,
        reg [2:

0] ampclkreg;
    reg ampclk;
    reg [7:0] agc_data_reg;
    reg agc_running;
    reg [7:0] data_out_reg;
    wire agc_done;




    //ampclk generation
    always @(posedge clk)
        begin
            ampclkreg = ampclkreg + 1;
            if (ampclkreg == 3)
                begin
                    ampclkreg = 0;
                    ampclk = ~ampclk;
                end
        end

    always @(posedge clk)
        begin
            if(agc_start == 1)
                begin
                    agc_running = 1'b1;
                    agc_data_reg = agc_data;
                end
            if(agc_done == 1)
                begin
                    agc_running = 1'b0;
                end
        end



    //FSM
    always @(posedge ampclk)
        begin
            if (agc_running == 0)
                begin
                    SCK = 0;
                    state_reg = 0;
                    CS_AMP = 1;
                end
            if (agc_running == 1)
                begin
                    case (state_reg)
                        0:  begin
                                CS_AMP = 1;
                                SCK = 0;
                                state_reg = 1;
                            end
                        1:  begin
                                CS_AMP = 0;
                                MOSI = agc_data_reg[7];
                                state_reg = 2;
                            end
                        2:  begin
                                SCK = 1;
                                state_reg = 3;
                            end
                        3:  begin
                                SCK = 0;
                                MOSI = agc_data_reg[6];
                                state_reg = 4;
                            end
                        4:  begin
                                SCK = 1;
                                state_reg = 5;
                            end
                        5:  begin
                                SCK = 0;
                                MOSI = agc_data_reg[5];
                                state_reg = 6;
                            end
                        6:  begin
                                SCK = 1;
                                state_reg = 7;
                            end
                        7:  begin
                                SCK = 0;
                                MOSI    = agc_data_reg[4];
                                state_reg = 8;
                            end
                        8:  begin
                                SCK = 1;
                                state_reg = 9;
                            end
                        9:  begin
                                SCK = 0;
                                MOSI = agc_data_reg[3];
                                state_reg = 10;
                            end
                        10:begin
                                SCK = 1;
                                state_reg = 11;
                            end
                        11:begin
                                SCK = 0;
                                MOSI = agc_data_reg[2];
                                state_reg = 12;
                            end
                        12:begin
                                SCK = 1;
                                state_reg = 13;
                            end
                        13:begin
                                SCK = 0;
                                MOSI = agc_data_reg[1];
                                state_reg = 14;
                            end
                        14:begin
                                SCK = 1;
                                state_reg = 15;
                            end
                        15:begin
                                SCK = 0;
                                MOSI = agc_data_reg[0];
                                state_reg = 16;
                            end
                        16:begin
                                SCK = 1;
                                state_reg = 17;
                            end
                        17:begin
                                CS_AMP = 1;
                                state_reg = 18;
                            end
                        18:begin
                                SCK = 0;
                                state_reg = 19;
                            end
                        19:begin
                                state_reg = 19;
                            end
                    default: state_reg = 19;
                endcase
            end
        end

    //retrieve previous vlaues
    always @(posedge clk)
    begin
        case(state_reg)
            2: begin
                    if (ampclkreg == 2)             
                        data_out_reg[7] = AMP_DO;
                end
            4: begin
                    if (ampclkreg == 2)
                        data_out_reg[6] = AMP_DO;
                end
            6: begin 
                    if (ampclkreg == 2)
                        data_out_reg[5] = AMP_DO;
                end
            8:  begin
                    if (ampclkreg == 2)
                        data_out_reg[4] = AMP_DO;
                end
            10:begin
                    if (ampclkreg == 2)
                        data_out_reg[3] = AMP_DO;
                end
            12:begin
                    if (ampclkreg == 2)
                        data_out_reg[2] = AMP_DO;
                end
            14:begin
                    if (ampclkreg == 2)
                        data_out_reg[1] = AMP_DO;
                end
            16:begin
                    if (ampclkreg == 2)
                        data_out_reg[0] = AMP_DO;
                end

        endcase
    end


    //output wire [7:0] data_out--to top module to drive 7 LEDs and display state_reg
    assign data_out =  state_reg;

    assign agc_done = (state_reg == 19);
    assign inhibit_ADC = (agc_running == 1);


    endmodule

我在 FPGA 方面回答(我对 Xilinx FPGA 拥有最多的经验);我不同意蒂姆的回答。

当FPGA被编程和初始化时,many内部资源被初始化为已知状态。这包括所有触发器和块公羊。通过在整个设计中添加毯子重置逻辑,您may如果您可以依靠初始化为已知状态的内部元素,那么它会比需要的复杂得多。高扇出复位网络会使路由器的设计实现变得更加困难,并且将设计映射到切片也会因您选择的复位(尤其是异步复位)而变得复杂。

我的建议:

  • 使用寄存器的初始化值。仔细检查 Xilinx XST 文档,了解您所使用的版本是否支持语法。与广泛持有的看法相反,在大多数情况下都会遵守初始化值。这样做的好处是芯片的初始状态将与模拟的初始状态相匹配。
  • 仅重置必要的控制信号并保留数据路径寄存器,以实现更有效的映射(例如,将管道映射到移位寄存器)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verilog、FPGA、统一寄存器的使用 的相关文章

  • 始终块中的 Veriloggenerate/genvar

    我试图让一个模块通过 ISE 12 4 中的语法检查 但它给了我一个我不明白的错误 首先是代码片段 parameter ROWBITS 4 reg ROWBITS 1 0 temp genvar c generate always pose
  • 向左旋转 verilog 大小写

    我的任务是用verilog编写一个16位ALU 当我做需要旋转操作数和进行2的补码加法和减法的部分时 我发现了困难 我知道如何用纸和铅笔解决这个问题 但我无法弄清楚如何在 Verilog 中做到这一点 例如 A表示为a15 a14 a13
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • 内联asm未经优化无法编译

    我需要在 32 位 Linux 进程中使用 futex 系统调用 但无法使用syscall函数 标头不可用 这仍然可以通过使用内联汇编来完成 如下所示 include
  • 如何从程序访问控制寄存器cr0、cr2、cr3?出现分段错误

    我编写了一个程序 尝试读取和写入控制寄存器 程序编译得很好 但是当内联汇编即将执行时 它会产生分段错误 Code void instructions int val int i int value for i 0 i lt val i as
  • 在 Verilog 中判断总线是否包含单个 x 的最佳方法是什么?

    我有一个监控总线的测试台 总线内的一些信号 位 可以是 1 bx 由于多种原因 我需要知道总线内是否有任何信号是 1 bx 如果总线包含任何 x 测试 不用于综合 仅用于模拟目的 的最佳方法是什么 我曾希望我可以使用减少或然后使用 但这似乎
  • 在 Verilog 设计中产生时钟故障

    我正在使用 Verilog 设计芯片 我有一个 3 位计数器 我希望当计数器处于第 8 次循环时 应该有一个时钟故障 之后就可以正常工作了 在 Verilog 设计中产生时钟故障的可能方法是什么 在时钟信号上注入毛刺的一种方法是使用forc
  • 为什么 Evan 的调试器说我要转向 eax 而不是 rax?

    我正在将一些值移至 rax 但调试器显示它正在移至 eax 这是怎么回事 是用调试器 nasm 还是我的知识 无论如何 代码当然可以完美运行 我使用的调试器是 Evan s Debugger 简而言之 您和调试器都是正确的 当您将某物移动到
  • 具有 +1 逻辑的 4 位计数器 D 触发器

    我正在尝试通过 Verilog 实现带有 1 逻辑的 D 触发器计数器 但是我收到了很多有关网络多个常量驱动程序的错误代码 有人可以帮我吗 这是到目前为止的代码 module LAB clk clear Enable Q input clk
  • MIPS 中的影子寄存器是什么以及它们如何使用?

    当我了解 MIPS 架构时 我遇到了影子寄存器 据说它们是通用寄存器的副本 我无法理解以下内容 何时使用影子寄存器 MIPS 影子寄存器用于减少处理中断时的寄存器加载 存储开销 分配了影子寄存器组的中断不需要保存任何现有上下文来提供空闲寄存
  • VIM 高亮匹配开始/结束

    我正在尝试找到一个插件 它将突出显示与 Verilog 匹配的开始 结束语句 VIM 可以使用花括号 方括号 但不能使用它的开始 结束 我希望 VIM 突出显示正确的开始到正确的结束 在我看来 最好的选择是使用 matchit 该脚本是 v
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何在 icarus verilog 中包含文件?

    我知道基本的 include filename v 命令 但是 我试图包含另一个文件夹中的模块 现在 该模块还包括同一文件夹中存在的其他模块 但是 当我尝试在最顶层运行该模块时 出现错误 C Users Dell Desktop MIPS
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更
  • Verilog 数组语法

    我是 Verilog 新手 并且遇到了很多麻烦 例如 我想要一个包含八个单元的数组 每个单元都是 8 位宽 以下不起作用 reg 7 0 transitionTable 0 7 assign transitionTable 0 10 仅仅做
  • 仿真输出全为零

    我的设计模块和测试平台代码已编译 但是 当我模拟时 我没有得到正确的输出 谁能告诉我我的代码哪里出了问题 这是测试平台的代码 module testbench reg 511 0 FROM LS reg CLK reg 63 0 TO IF
  • 从 64 位 nasm 代码接收 32 位寄存器

    我正在学习 64 位 nasm 我通过执行以下操作来汇编 nasm 文件 该文件仅包含 64 位寄存器 nasm f elf64 HelloWorld nasm o HelloWorld o 并链接它执行以下操作 ld HelloWorld

随机推荐

  • 具有自动内存清理功能的图像下载器

    我有一个项目列表 简单的列表框 其中包含主从基础上的图像 如果用户单击列表项目 则会打开详细信息页面 我遇到了非常著名的图像内存泄漏问题 描述here here here and here 一种可能的方法是遍历所有图像当导航自并清洁它们 I
  • 是否可以在 WindowButtonMotionFcn 中使用多个回调?

    我创建了一个类 为构造中的图形添加功能 这个类创建一个监听器WindowMouseMotion事件 但是 为了触发此事件 我必须为该图添加一个虚拟回调函数WindowButtonMotionFcn财产 我首先检查该属性是否已填充 如果不是
  • Java 泛型和泛型类型

    我有一个 ExtA 类 其中包含一个过滤函数来过滤 ArrayList public ExtA
  • leaflet 插件和 leafletProxy 以 polylineDecorator 为例

    另请参考一个问题leaflet 插件和 leafletProxy 我想用折线装饰器插件在 R 的传单中 下列的有关如何使用 R 中的传单插件的说明 如果我将该方法与leaflet 请参阅第一个示例 它按我想要的方式工作 但如果我尝试使用相同
  • Excel 互操作:_Worksheet 还是 Worksheet?

    我目前正在撰写有关动态类型的文章 并给出了 Excel 互操作的示例 我以前几乎没有做过任何 Office 互操作 这表明了这一点 这MSDN Office 互操作教程对于 C 4 使用 Worksheet界面 但还有一个Worksheet
  • 在 Python Social Auth 中获取 Facebook 用户喜欢

    我正在使用 Django 启动一个项目 并尝试允许用户使用 Facebook 登录 出于网站目的 我想将用户喜欢存储在我的数据库中 我以 Python Social Auth 我用于该项目的库 上的示例应用程序为例 并且编写了一个用于在数据
  • 在 IIS 服务器上发布 C# 控制台应用程序

    是否可以在 IIS 服务器上部署控制台 C 应用程序 我有一个 exe 文件在一台机器上运行 该文件从命名管道获取数据 我的 C 应用程序从管道获取此数据并将其发送到使用 TCP 套接字运行的 Web 应用程序 我想知道是否可以部署我的 C
  • JavaScript 分离轴定理

    我正在尝试使用 JavaScript 中的分离轴定理来检测两个正方形碰撞 一个旋转 一个不旋转 尽管我很努力 但我无法弄清楚这在 JavaScript 中会是什么样子 也找不到任何 JavaScript 示例 请帮忙 用简单的数字或 Jav
  • 在 Google Colab 文本单元中插入图像

    我想将图像插入到 google colab 中的文本单元格中 该图像已上传到 google 云端硬盘中 为此 我使用 Markdown 语法 名称 获取可共享链接 但这不起作用 我的链接如下所示 https drive google com
  • 为什么 CSS :active on link 不会突出显示当前页面链接?

    我有下面的代码用于列表到母版页 div ul li a href default aspx Home a li li a href page1 aspx Page1 a li ul div with css header a hover c
  • 同时访问<地址>,但修改需要独占访问

    我想指定一个属性 它是一个用于在函数中进行操作的数组myFunc 但我收到此错误 这是我的代码草图 self data MyObject func myFunc x inout Int y inout Int manipulation co
  • 从Flask路线启动scrapy

    我想构建一个爬虫 它获取要抓取的网页的 URL 并将结果返回到网页 现在我从终端启动 scrapy 并将响应存储在文件中 当某些输入发布到 Flask 时 如何启动爬虫 处理并返回响应 您需要在 Flask 应用程序中创建一个 Crawle
  • C# 中如何获取目录中的文件列表

    所以 我正在用 C 开发 mp3 播放器 但我遇到了一个问题 我想从列表中的目录中获取所有文件 因此您可以选择 您要播放的歌曲 这是获取文件的代码 string music Directory GetFiles dir mp3 然后就可以玩
  • 关联对象什么时候被释放?

    我通过对象 A 的关联引用来附加对象 B 对象 B 通过 KVO 观察对象 A 的一些属性 问题是对象 B 似乎已被释放after对象 A 这意味着将自身作为对象 A 的 KVO 观察者删除为时已晚 我知道这一点是因为我收到 NSKVODe
  • 输出给定字符串中第一个重复字符的代码?

    我试图找到字符串中的第一个重复字符并使用 python 输出该字符 检查我的代码时 我可以看到我没有索引代码的最后一个字符 我究竟做错了什么 letters acbdc for a in range 0 len letters 1 prin
  • NHibernate 过滤器集合

    使用 NHibernate 我想过滤类中的集合以仅包含可能对象的子集 下面我提供了一个示例表数据来帮助解释 我找不到使用 NHibernate 来做到这一点的方法 表 数据对象 数据对象 ID PK 名称 当前版本 11 data txt
  • 如何在 Objective-C 中使用 Swift String 枚举?

    我有这个枚举String值 它将用于告诉记录到服务器的 API 方法消息具有哪种类型的服务器 我使用的是 Swift 1 2 因此枚举可以映射到 Objective C objc enum LogSeverity String case D
  • 与 Math.Round() 不一致

    我有两个函数旨在包含 180 180 和 之间的角度 其目的是给定从 inf 到 inf 的任何角度 它将在指定的间隔内保留等效角度 例如1550 的角度是 110 public double WrapBetween180 double a
  • php异步cURL请求

    我正在使用 PHP 开发一个网站并使用 cURL 发送请求 我有一个网站 它会进行一些计算 我需要从中得到响应 我正在通过 cURL 发送请求 目前我正在做的是发送请求 等待 10 秒 然后再次发送 最多 3 次 如果没有收到 良好 响应
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有