我是一个试图学习Verilog的FPGA菜鸟.如何将值分配给始终块中的reg,作为初始值或作为常量.我试图在下面的代码中做这样的事情.我收到一个错误,因为8位常量不算作输入.我也不想触发时钟总是关闭.我只想为特定值分配一个寄存器.因为我希望它是可合成的,所以我不能使用初始块.非常感谢.
module top
(
input wire clk,
output wire [7:0] led
);
reg [7:0] data_reg ;
always @*
begin
data_reg = 8'b10101011;
end
assign led = data_reg;
endmodule
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Pong P. Chu的书来学习Verilog.我有一个关于如何评估和实现always块的问题.作者代码中的一种风格令我感到困惑.
在这个例子中,他用一个带有两个输出寄存器'y1'和'y2'的FSM编码.我困惑的部分是在NEXT STATE LOGIC和OUTPUT LOGIC总是阻塞,在begin语句之后,always@*y1和y0被设置为0.我似乎无论状态如何,y1和y0将在每个时钟切换为0循环和信号变化.根据书中的状态图,在状态0或1时,reg y1应该等于1.
那么y1在每个时钟周期切换到0然后回到它在当前状态下的值吗?我认为情况并非如此,我只是对如何评估块感到困惑.有人可以解释代码的这一部分正在做什么.我迷路了.谢谢
module fsm_eg_2_seg
(
input wire clk, reset, a, b,
output reg y0, y1
);
//STATE DECLARATION
localparam [1:0] s0 =2'b00,
s1=2'b01,
s2=2'b10;
// SIGNAL DECLARATION
reg [1:0] state_reg, state_next ;
//STATE REGISTER
always @(posedge clk, posedge reset)
if (reset)
state_reg <= s0;
else
state_reg <= state_next;
//NEXT STATE LOGIC AND OUTPUT LOGIC
always @*
begin
state_next = state_reg; // default next state: the same
y1 = 1'b0; // default …Run Code Online (Sandbox Code Playgroud) 当您在始终块敏感性列表中使用通配符@*时,我对于被视为输入的内容感到有点困惑.例如,在下面的示例中,哪些信号被解释为导致重新评估always块的输入?根据我的理解clk和reset不包含在内,因为它们不会出现在always块中任何过程语句的右侧. 包括a和b,因为它们都出现在always块中的过程语句的右侧.但我真的很困惑的是en和mux.因为它们被用作if和case语句中的测试条件,它们是否被视为输入?每次en和mux改变值时是否重新评估always块?我几乎是一个菜鸟,在我的3本Verilog书中,我找不到令人满意的解释.我总是发现这里的解释真的很有帮助.谢谢
module example
(
input wire clk, reset, en, a, b,
input wire [1:0] mux,
output reg x,y, z
);
always @*
begin
x = a & b;
if (en)
y= a | b;
case(mux)
2'b00: z = 0;
2'b01: z = 1;
2'b10: z = 1;
2'b11: z = 0;
endcase
end
endmodule
Run Code Online (Sandbox Code Playgroud) 我有一个问题,关于我正在研究的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?通过为输出分配一个未初始化的寄存器,是否会强制它假设为零?或者是其他事情发生在我不明白的地方?以下是我的代码.我已经评论了*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 …Run Code Online (Sandbox Code Playgroud) 我是FPGA和HDL的新手,但我正在努力学习并且无法弄清楚这一点.如何通过几个级别的组合逻辑来计算或估计传播延迟.我是否可以凭经验确定这一点,或者我可以在设计时解决这个问题.在这种情况下,我正在使用FPGA来实现奇偶校验设置和检查电路.该电路看起来像xor门的树形网络,如示例图片,除了我想xor 16寄存器,因此将有更多级别或xor操作.我希望能够通过每个"级别"xor逻辑计算传播延迟,这样我就可以确定整个奇偶校验和设置操作将花费多少时钟周期或多少纳秒.希望我有意义.


非常感谢您的帮助.