我们有以下代码行,我们知道它regF是16位长,regD长regE8位,长8位,长regC3位,假设无符号:
regF <= regF + ( ( regD << regC ) & { 16{ regE [ regC ]} }) ;
Run Code Online (Sandbox Code Playgroud)
我的问题是:移位是regD << regC假设结果是8位还是会因为&16位向量的按位而扩展到16位?
我有一个具有以下结构的代码
-- synthesis translate_off
... some sort of memory implementation/coding
-- synthesis translate_on
Run Code Online (Sandbox Code Playgroud)
如果删除这段代码会影响我FPGA implementation代码的最终输出,请告诉我.
谢谢,最好的问候,法拉斯
我是VHDL/FPGA编程的初学者.我想比较两个32位std_logic_vector的.我目前正在使用:
if ( RX_FRAME(to_integer(s_data_counter)).Data /= REF_FRAME(to_integer(s_data_counter)).Data ) then
s_bad_frame <= '1';
state <= DONE;
end if;
Run Code Online (Sandbox Code Playgroud)
这里RX_FRAME和REF_FRAME是2个的阵列std_logic_vector(31 downto 0)
我想知道综合工具如何转化/=为硬件.是否可以使用它?或者我应该做一个XOR有关的向量并检查结果向量对零?如果我执行XOR并检查零,是否会增加所需的硬件数量?我使用的是Vivado Design Suite 2015.3.
我试图了解这段代码在合成时会产生多少翻转?
我有2个带有非阻塞和阻塞分配代码的测试用例.
测试1.
wire aclk;
wire [1:0] a;
reg [1:0] c;
reg [1:0] b;
always @(posedge aclk)
begin
b <= a + 1;
c = b;
end
Run Code Online (Sandbox Code Playgroud)
测试2.
wire aclk;
wire [1:0] a;
reg [1:0] c;
reg [1:0] b;
always @(posedge aclk)
begin
b = a + 1;
c <= b;
end
Run Code Online (Sandbox Code Playgroud)
测试1有4个FF,测试2有2个FF.
我无法理解它是如何改变我只是切换代码.
谢谢你让我知道.
我无法理解Stuart Sutherland(和他的同事)所著SystemVerilog For Design书中的示例 10-3 。
见第 232 行:
这是代码片段。我的问题将随之而来。
bit [0:NumRx-1] RoundRobin;
always_ff @(posedge clk, posedge reset) begin: FSM
bit breakVar;
if (reset) begin: reset_logic
Rxready <= '1;
Txvalid <= '0;
Txsel_out <= '0;
SquatState <= wait_rx_valid;
forward <= 0;
RoundRobin = 1;
end: reset_logic
else begin: FSM_sequencer
unique case (SquatState)
wait_rx_valid: begin: rx_valid_state
Rxready <= '1;
breakVar = 1;
for (int j=0; j<NumRx; j+=1) begin: loop1
for (int i=0; i<NumRx; i+=1) begin: loop2 …Run Code Online (Sandbox Code Playgroud) 我在组合分配方面遇到了麻烦.我不明白为什么我不能使用总是组合结构设置我的输出变量.当我使用assign时,我没有得到赋值错误.
我认为分配和总是@(*)都意味着阻止(组合分配)
module control_unit(input wire [31:0] instruction
,output wire RegDst
,output wire ALUSrc
,output wire RegWrite
,output wire MemRead
,output wire MemWrite
,output wire MemToReg
,output wire Branch
);
wire [5:0] opcode;
assign opcode = instruction[31:26];
always@(*) begin
case(opcode)
6'b000000: begin // r-type
RegDst = 1'b1;
ALUSrc = 1'b0;
RegWrite = 1'b1;
MemRead = 1'b0;
MemWrite = 1'b0;
MemToReg = 1'b0;
Branch = 1'b0;
end
.
.
.
default: begin
RegDst = 1'b0;
ALUSrc = 1'b0;
RegWrite = 1'b0;
MemRead …Run Code Online (Sandbox Code Playgroud) 在混合VDHL和Verilog期间,我遇到了区分大小写的问题.
参数"APB_ADDR"以大写形式写入,导线"apb_addr"以小写形式写入.由于Verilog区分大小写,因此两个表达式之间可能不同.
module verilog_module #(
...
parameter APB_ADDR = 32,
...
) (
...
input wire [APB_ADDR-1:0] apb_addr,
input wire apb_sel,
input wire apb_enable,
input wire apb_write
....
);
Run Code Online (Sandbox Code Playgroud)
现在我想在VDHL中实例化模块:
inst0: entity work.verilog_module
GENERIC MAP (
APB_ADDR => APB_ADDR_WIDTH
)
PORT MAP(
...
apb_addr => apb_addr,
...
);
Run Code Online (Sandbox Code Playgroud)
合成失败.通用的"apb_addr"不知道.VHDL没有区分大小写.
如何访问通用APB_ADDR?我不想改变用Verilog编写的IP核.
我有一个双文件VHDL项目,我有初学者的困难.
它需要系统时钟并使用30位时钟分频器(我只使用少量非连续位)驱动原始串行端口模块(仅输出TX)模块定期吐出8位字符.
似乎在合成过程中,优化器正在删除许多基本信号,这是我没想到的.
顶级文件"Glue.vhd"......
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use ieee.std_logic_unsigned.all;
entity Glue is
port(
clk : in std_logic;
tx : out std_logic;
LED : out std_logic_vector(1 downto 0)
);
end entity Glue;
architecture behavioural of Glue is
signal divider : unsigned(29 downto 0);
begin
LED(1) <= '0';
ser_tx : entity SerialTX
port map (
baud_clk => divider(12),
byte_to_transmit => std_ulogic_vector(divider(29 downto 22)),
poke => divider(20),
busy => LED(0),
serial_out => tx
);
clocker : process(clk)
begin
IF(rising_edge(clk)) then …Run Code Online (Sandbox Code Playgroud) 我对我的代码进行了行为模拟,它运行得很好.结果如预测.当我合成我的代码并将其上传到spartan 3e FPGA并尝试使用chipcope进行分析时,结果甚至不如我预期的那样接近.我做错了什么? http://pastebin.com/XWMekL7r
我有一段verilog代码,我正在尝试合成.那里有一条线,
MUX2B_XB gas34 ( notPropSig, OECin, generate, notCoutSig );
Run Code Online (Sandbox Code Playgroud)
实例化一个模块.其中,模块实现了一个简单的布尔逻辑.但是,合成器给出了一个错误:
"generate"附近的语法错误.
在实例化时,我无法理解在此上下文中使用'generate'语句,以及如何在不影响预期功能的情况下解决错误.
我正在尝试在 Verilog 中执行从一些灰色代码值到一些二进制值的连续转换。也就是说,我试图在一条总线上获取一个灰色代码值,并不断将其转换为另一条总线上的二进制值。我正在尝试在 Verilog 中执行此操作(由于其他原因无法使用 SystemVerilog)。
我想做这样的事情:
wire [DATA_SIZE - 1:0] binary_snap;
always @(greycode_snap) begin
case (greycode_snap)
8'b00000000 : binary_snap = 0;
8'b00000001 : binary_snap = 1;
8'b00000011 : binary_snap = 2;
8'b00000111 : binary_snap = 3;
8'b00001111 : binary_snap = 4;
8'b00011111 : binary_snap = 5;
8'b00111111 : binary_snap = 6;
8'b01111111 : binary_snap = 7;
8'b11111111 : binary_snap = 8;
8'b11111110 : binary_snap = 9;
8'b11111100 : binary_snap = 10;
8'b11111000 : binary_snap = 11;
8'b11110000 : binary_snap …Run Code Online (Sandbox Code Playgroud)