我有2个始终的块和finish_bcd
有线信号,以便仅在转换完成时进行检测。
在转换之后,我想把它放在0,但它在另一个总是阻止......
wire finish_bcd;
bin2bcd BinTBcd (
.binary(data),
.thousands(w1),
.hundreds(w2),
.tens(w3),
.ones(w4),
.finish(finish_bcd) //################ line 53
);
always @(posedge finish or posedge finish_bcd) begin
if (finish_bcd == 1) begin
case(enable)
5'b00000: enable <= 5'b00001; //send the thousands
5'b00001: enable <= 5'b00010; //send the hundreds
5'b00010: enable <= 5'b00100; //send the tens
5'b00100: enable <= 5'b01000; //send the ones
5'b01000: enable <= 5'b10000; //send a ";"
5'b10000: enable <= 5'b00000; // Everything is sent, I would like to do 'finish_bcd = 0;' here, at the end of the process in this always block.
default: enable <= 5'b00000;
endcase
end
end
bin2bcd模块是:
module bin2bcd (
input [10:0] binary,
output reg [3:0] thousands,
output reg [3:0] hundreds,
output reg [3:0] tens,
output reg [3:0] ones,
output reg finish);
integer i;
always @(binary) begin
// set 100's, 10's, and 1's to zero
thousands = 4'b0;
hundreds = 4'b0;
tens = 4'b0;
ones = 4'b0;
for (i=10; i>=0; i=i-1) begin
// add 3 to columns >= 5
if (thousands >= 5)
thousands = thousands + 3;
if (hundreds >= 5)
hundreds = hundreds + 3;
if (tens >= 5)
tens = tens + 3;
if (ones >= 5)
ones = ones + 3;
// shift left one
thousands = thousands << 1;
thousands[0] = hundreds[3];
hundreds = hundreds << 1;
hundreds[0] = tens[3];
tens = tens << 1;
tens[0] = ones[3];
ones = ones << 1;
ones[0] = binary[i];
end
finish <= 1; //############ line to detect when the conversion is done
end
endmodule
另一个问题:为什么我不能只改变“reg finish_bcd;”在顶级模块?
我收到此错误line 53 Reference to scalar reg 'finish_bcd' is not a legal net lvalue
我将为Xilinx FPGA合成此代码。
编辑:
我有一个二进制字,我想通过串行通信发送它然后我将这个二进制(11位)转换为BCD以发送ASCII数字。
我希望每次“二进制”更改时发送。
finish_bcd
用于检测转换何时开始发送数据。
always @(posedge finish or posedge finish_bcd) begin
块用于更改状态(为了发送数千个,然后是数百个...等等。
然后,binary
更改,转换完成,finish_bcd = 1
,它开始发送数据(数千个等等),每个发送的结尾都会被finish
检测到
一切都在模拟中,但由于finish_bcd
没有变为0,所以当它发送所有数字时,它就会停止。我需要在结尾处重置finish_bcd
,以便检测新的binary
更改并开始发送新值。
谢谢。
答案 0 :(得分:2)
always @*
是组合的,这需要在零时间内进行模拟。对于状态机,您需要使用时钟并暗示触发器用于状态。
组合逻辑不能保持状态,因此状态机本身并不好。组合部分通常在Moore FSM中用于解码状态到输出(基于状态)。
bin2bcd模块是组合的,因为没有时钟或触发器用于使其花费超过1个时钟周期,这意味着它需要0个时钟周期。你已经使用了for循环,你可能指的是执行它需要多少循环,for循环指定10.但是这是组合所以你暗示并行硬件的负载,只是因为它是verilog中的循环并不意味着它重用比较器。如果你想最小化硬件并花费10个时钟周期来计算结果,你需要建立一个状态机来控制和排序它。
posedge finish or posedge finish_bcd
并不意味着有效的硬件结构。
部分地,您在敏感度列表中有两个posedges,一个没有被用作异步重置或设置。这意味着你已经创建了一个带有两个时钟输入的触发器。这种硬件结构根本就不存在。
除此之外使用数据信号(完成)作为时钟将导致综合时出现各种时序问题。将此设计视为更大系统的一部分,您必须平衡所有时钟树,如果你不保持数据和时钟分开,这几乎是不可能的。