修改后的Baugh-Woley算法乘法的Verilog代码不能正确乘法
以下verilog源代码和/或TestBench在正式验证工具(Yosys-Smtbmc) 请继续投诉`````''我需要它们与不支持bind命令的yosys-smtbmc一起使用. 我现在正在调试生成的编码,因为乘法(使用修改的baugh-wooley算法)尚不正常. 当主张O_VALID时,乘法代码应给出O_P = I_A * I_B = 3 * 2 = 6,但波形清楚地显示了代码给出O_P = 0x20 = 32 test_multiply.v // Testbench module test_multiply; parameter A_WIDTH=4, B_WIDTH=4; reg i_clk; reg i_reset; reg i_ce; reg signed[(A_WIDTH-1):0] i_a; reg signed[(B_WIDTH-1):0] i_b; wire signed[(A_WIDTH+B_WIDTH-1
2 2024-01-23
编程技术问答社区
在轮流调度中通过位的扭动找到下一个
考虑以下问题.您有一个单弦,代表单速编码中当前的计划从属.例如," 00000100"(最左边的位为#7,最右#0)表示从设备#2安排. 现在,我想在循环调度方案中选择下一个计划的奴隶,并有一个扭曲.我有一个"请求掩码",说哪些奴隶实际上想安排.下一个从属将仅从想要的人那里挑选. 一些示例(假设通过旋转左旋转进行旋转计划). 示例1: 当前:" 00000100" 面具:" 01100000" 下一个时间表:" 00100000" - 在普通圆形旋转,#3中,然后#4应该在#2之后,但他们不要求,所以#5被选中. 示例2: 电流:" 01000000" 蒙版:" 00001010" 下一步:" 00000010" - 因为调度是通过左骑自行车完成的,而#1是该顺序中的第一个请求从. 现在,我知道这可以轻松地在循环中编码.但是实际上,我想通过有点扭转的操作来获得我的结果,而无需循环.动机:我想在vhdl/verilog中的硬件(在FPGA中)实现
8 2024-01-23
编程技术问答社区
浮点除法器硬件实现细节
我正在尝试在硬件中实现32位浮点硬件分隔线,我想知道我是否可以对不同算法之间的某些权衡得到任何建议? 我的浮点单元目前可以支持乘法和加法/减法,但是我不会将其切换为融合的乘数add(FMA)浮点架构,因为这是一个嵌入式平台,我正在尝试最大程度地减少区域使用情况. 解决方案 曾经很久以前,我遇到了这种整洁且易于实施的浮点/固定点师算法,该算法在那个时期的军事FPU中使用: 输入必须无符号和移动,因此x 范围内 不要忘记存储偏移的差异sh = shx - shy和原始标志 fin 将x*f移回sh并恢复结果符号(sig=sigx*sigy) 可以像这样轻松计算x*f: z=1-y (x*f)=(x/y)=x*(1+z)*(1+z^2)*(1+z^4)*(1+z^8)*(1+z^16)...(1+z^2n) 其中 n = log2(num of fractional bits for fix
4 2024-01-22
编程技术问答社区
如何在一个时钟周期内获得32位输入的平方根?
我想在Verilog中设计一个可合成的模块,在计算给定输入的平方根32位的平方根时,该模块只需一个周期. 解决方案 [edit1]修复的代码 最近发现了结果,即使测试确定一切都很好,所以我更深入地挖掘了我的方程式中有一个愚蠢的错误,并且由于与我的PGM环境的名称冲突,测试得到了误报,所以我忽略了它前.现在在所有情况下都可以工作. 我能想到的最好的事情(近似或大型 lut )是二进制搜索而无需乘法,此处 c ++ 代码: //--------------------------------------------------------------------------- WORD u32_sqrt(DWORD xx) // 16 T { DWORD x,m,a0,a1,i; const DWORD lut[16]= { // m*m 0x40000000, 0x10
0 2024-01-22
编程技术问答社区
Verilog/Systemverilog/VHDL可以被认为是面向行为者的编程语言吗?
这些语言提供了本质上并发的模块,并且可以处理异步消息(通过端口).撇开他们无法在运行时产生模块实例的事实,它们是否有资格为基于演员的编程语言? 谢谢 编辑: 我真正寻找的是语言语义可以用来"建模"演员的方式,而不是模拟器如何处理代码(当然,它们都是由事件驱动的;以及进一步的下降;我们最终得到晶体管:-)). 因此,如果我创建了这样的IP4ROUTERS, module Ip4Router ( inout interface_t intrf1, // Port that can atomically send/rcv packets inout interface_t intrf2, ... ); always @(intrf1) begin // Activity on intrf1 if (intrf1.valid & intrf1.ipaddr != myaddr && ...) begin
6 2024-01-10
编程技术问答社区
在Verilog合成中,如何在for循环中用二进制比较整数值来生成延迟?
你好朋友,我仍然不知道如何生成verilog的延迟进行合成,并将其称为verilog中的任何行以进行综合...为了找到此信息,我写了一个代码,但如果您知道如何生成延迟,请帮助我并打电话到任何线路函数*等任何线路他们完成了我为延迟生成的计算 .. module state_delay; reg Clk=1'b0; reg [3:0]stmp=4'b0000; integer i,a; always begin #50 Clk=~Clk; end always @(posedge Clk) begin a=1'b1; delay(); a=1'b0; delay(); a=1'b1; end task delay(); begin for(i=0;i==(stmp==4'b1111);i=i+1) begin @(posedge Clk) begin
6 2023-12-20
编程技术问答社区
xilinx中的意外警告
在以下代码中,我正在存储按钮播放器1和播放器2的历史记录.该代码没有错误编译,但有警告.我无法解决这些警告.我在这里发布代码. module game(clk50,red,green,blue,hsync,vsync, button,led); input [8:0] button; input clk50; output red; output green; output blue,led; output hsync; output vsync; // divide input clock by two, and use a global // clock buffer for the derived clock reg clk25_int; always @(posedge clk50) begin clk25_int
0 2023-12-20
编程技术问答社区
在xilinx运行代码时的警告
在以下代码中:首先,我在给定地址上加载了ROM的数据和权重.在同一时钟中,我正在做数据和权重的乘法.最后,我将位数从16位扩大到23位.该代码没有错误编译,但有警告.我无法解决这些警告. module main_module(extended_out,mux_out,data,weight,clk,en,addr); input clk,en; input [2:0] addr; output [7:0] data,weight; output [15:0] mux_out; output [22:0] extended_out; ram_input a1 (clk, en, addr, data); ram_weight a2 (clk, en, addr, weight); top_module a3 (mux_out,data,weight); SignExtender a4 (clk,mux_out,extended_out); endmodule ########
0 2023-12-20
编程技术问答社区
如何在verilog中使用Counter for Synthesis生成延迟,并在Always块内调用?
我想使用计数器生成延迟,实际上,在这里,我使用计数器每次转移后都会生成延迟,以便在FPGA引脚上更好地理解,SPI(串行)LCD与之连接.因此,我创建了一个偏移寄存器1位,然后给出延迟然后下一个位(位 - 列表 - 列表..). 这是我的计数器代码: module spidelay( input wire clk, input wire enb, output reg sclkout ); reg [23:0] stmp; always @(posedge clk) begin if ( enb == 1 ) begin stmp = stmp+1; if( stmp[23] == 1 ) begin sclkout = 1'b1; stmp = 24'b0; end end else begin stmp = 24'b0;
2 2023-12-20
编程技术问答社区
在Verilog上实施互惠的方法
我想在Verilog上实现一个互惠块,以后将在FPGA上合成.输入应为签名的32位WordLength,其长度为16位.输出应具有相同的格式. 示例 输入:x --->输出---> 1/x 我已经使用内置的IP核心分隔线解决了问题.我想知道是否有一种优雅/抗议的方式可以通过刻度转移或2的补充来解决此问题. 我已经使用IP核心来实现手册中所述的逆,但由于某种原因,我并不真正了解结果是错误的,因此需要以1的速度向左移动. 1的回复给出0.5. 2的回复给出1. 以下是手册中的部分,我的TestBench代码 测试台 module reciprical_tb; // Inputs reg clk; reg [1:0] dividend; reg [31:0] divisor; // Outputs wire rfd; wire [1:0] quotient; wire [31:0] f
0 2023-12-20
编程技术问答社区
为什么我不能向inout类型输入值?
我从此curcuit 图片 这是错误映像映像在这里 此curcuit是带有3态输出的四倍总线transcievers Verilog代码 module Q52QuadrupleBus3Stlate(GAB,GBA,A,B); inout [3:0] A,B; input GAB,GBA; reg winA,winB; assign B = (GAB==1&&GBA==0) ? winA : 4'hz; assign A = (GAB==0&&GBA==1) ? winB : 4'hz; always @ (GAB or GBA) begin winA
10 2023-12-20
编程技术问答社区
带有生成语句的Verilog放置约束条件
我正在尝试生成一系列闩锁,这些闩锁使用生成语句彼此相邻.我一直在尝试使用xilinx约束" RLOC"来做到这一点,但是我还没有成功. 下面的代码无法成功实施,但应该说明我要获得的内容.以下代码的问题是,在约束调用中的" i"不会转换为字符串,这就是呼叫所在.有人有这样做的经验吗? 我正在使用Xilinx ISE 10.1.03的VirTex4进行合成和实现.我不确定我正在使用哪种版本的Verilog,但我认为这是Verilog2001.如果有人也能告诉我如何检查我正在使用的Verilog. ,我会很感激. genvar i; generate for (i = 0; i
10 2023-12-20
编程技术问答社区
信号被连接到以下多个驱动器
我试图运行以下内容,然后收到此错误: 这是Verilog代码: module needle( input referrence,input penalty,output index[7:0]); //inout input_itemsets; //input referrence; //input penalty; //output index; parameter max_cols=8; // wire index[7:0]; wire referrence; wire penalty; //wire input_itemsets; genvar i,idx; generate for( i = max_cols-4 ; i >= 0 ; i=i-1) for( idx = 0 ; idx
4 2023-12-20
编程技术问答社区
Verilog多个驱动程序
我正在尝试使用将连接到7段解码器的Verilog进行BCD计数器. 我合成它后,发生了这样的错误: Multi-source in Unit on signal >; this signal is connected to multiple drivers.> **等等..... ***是否有解决方案? > module BCDcountmod( input Clock, Clear, up, down, output [3:0] BCD1_1, BCD0_0 ); reg [3:0] BCD1, BCD0; //reg [3:0] BCD1_1, BCD0_0; always @(posedge Clock) begin if (Clear) begin BCD1
12 2023-12-20
编程技术问答社区
为什么我们在FGPA/VHDL/Vivado中使用REG?
我正在Verilog中使用Xilinx的Vivado进行编程. 我想知道为什么要使用reg 的某些输出 例如reg [3:0] encoder_output 我们之所以使用它,是因为我们的16到4个编码器有4个输出吗?我假设我们每当需要"存储东西" 时使用reg 是我的主意吗? 解决方案 尽管有所有的票价,但实际上并不是一个愚蠢的问题.一开始,设计师创建了网和注册.网络的目的是作为硬件元素之间的连接,并将其驱动到它们上.他们没有拥有这些价值观.网通常称为wire.寄存器是数据存储元素,并且 did 具有值;它们通常被称为reg.随着时间的流逝,很明显,这种分裂(类似于外观的"硬件")没有意义,并且至少提出了一个提议,以将网络/寄存器与该语言的区别删除.这从来没有发生过(除非您认为SystemVerilog为" Verilog",否则我没有). 因此,您的问题在30年前很有意义,您的答案将是"正确的". 但是,实际上,您使用哪种方法并不重要.真正的区别在于
0 2023-12-20
编程技术问答社区
为什么Verilog中的If语句会导致锁存?
我正在尝试在Verilog中对控制器/数据路径实现进行编码,我对导致不良闩锁的原因感到困惑.本质上,我有一台状态机在Negedge时钟上更新.该状态计算机根据机器所处的状态将5个控制信号(loadSquare,loaddelta,addelta等)发送到数据路径.数据路径和控制器的代码如下. . 数据路径 //Control lines reg addSquare, addDelta, decDelta; reg loadSquare, loadDelta; //Input lines reg [8:0] square, delta; //Output register reg [7:0] outReg; always @(posedge clk) begin if (loadSquare) square = 9'h1; //used on initialization if (loadDelta) delta = 9'h3; //
36 2023-12-20
编程技术问答社区
为什么在verilog中会发生以下重新声明错误?
我正在尝试实现一个简单的Verilog代码: module test1( input ACLK, input RST, output test_output1, output test_output2 ); //wire ACLK; //wire RST; reg test_output1; reg test_output2; assign test_output1 = ACLK; always @(posedge ACLK or negedge RST) begin if(!RST) begin //test_output1
24 2023-12-20
编程技术问答社区
Verilog, FPGA, 使用单元化的寄存器
我对我正在研究的AGC/SPI控制器的奇怪行为有一个疑问.它是在Verilog中完成的,针对Xilinx Spartan 3E FPGA.控制器是依赖外部输入启动的FSM. FSM的状态存储在 state_reg 中,该状态未明确初始化,因为我认为非初始化的寄存器将默认为零.当我实现控制器时,FSM将无法运行.监视SPI总线我没有观察到没有活动.为了监视FSM,我将 state_reg 路由到进入LED银行的输出总线.这就是行分配data_out = state_reg 正在做的事情.我发现,当我这样做时,FSM一个AGC/SPI控制器按照SPI总线上观察到的正确操作.似乎正在发生的事情是 state_reg 在初始化时处于不确定的状态,因此FSM永远不会处于任何状态,因此它不运行.但是,通过将 state_reg 分配给输出,将其初始化为 00000000 正如我所期望的那样.所以我的问题是,一个非初始化的寄存器应该假设值为0吗?通过将一个非初始化的寄存器分配给输出,这是否迫使它假定为
10 2023-12-20
编程技术问答社区
打印签名的整数值存储在类型reg的变量中
我如何打印存储在8位寄存器中的签名整数值为: reg [7:0] acc; 使用: $display("acc : %d", acc) 它打印未签名的值. $display函数的正确语法是什么? 解决方案 如果将reg声明为signed,$display将显示负标志: module tb; reg signed [7:0] acc; initial begin acc = 8'hf0; $display("acc : %d", acc); end endmodule 打印出来: acc : -16 其他解决方案 也遇到了这个问题,浏览了SystemVerilog 2012标准,但在有关格式指定的部分中没有提及签名.这是一个替代(基本上是等效的)解决方案,也有效: $display("acc : %d", $signed(acc)) " $签名"函数将输入值转换为具有相同位宽的签名类型.
2 2023-12-20
编程技术问答社区