我有一个简单的verilog程序,它增加一个32位计数器,使用$ sformat将数字转换为ASCII字符串,然后使用FTDI FT245RL一次将字符串推送到主机1字节。
不幸的是,Xilinx XST不断优化字符串寄存器向量。我试过各种初始化和访问例程,但没有成功。我似乎无法关闭优化,我在网上找到的所有示例与我的初始化例程差别很小。我做错了什么?
module counter(CK12, TXE_, WR, RD_, LED, USBD);
input CK12;
input TXE_;
output WR;
output RD_;
output [7:0] LED;
inout [7:0] USBD;
reg [31:0] count = 0;
reg [7:0] k;
reg wrf = 0;
reg rd = 1;
reg [7:0] lbyte = 8'b00000000;
reg td = 1;
parameter MEM_SIZE = 88;
parameter STR_SIZE = 11;
reg [MEM_SIZE - 1:0] str;
reg [7:0] strpos = 8'b00000000;
initial
begin
for (k = 0; k < MEM_SIZE; k = k + 1)
begin
str[k] = 0;
end
end
always @(posedge CK12)
begin
if (TXE_ == 0 && wrf == 1)
begin
count = count + 1;
wrf = 0;
end
else if (wrf == 0) // If we've already lowered the strobe, latch the data
begin
if(td)
begin
$sformat(str, "%0000000000d\n", count);
strpos = 0;
td = 0;
end
str = str << 8;
wrf = 1;
strpos = strpos + 1;
if(strpos == STR_SIZE)
td = 1;
end
end
assign RD_ = rd;
assign WR = wrf;
assign USBD = str[87:80];
assign LED = count[31:24];
endmodule
加载应用程序的设备 来自文件'3s100e.nph'的Rf_Device 环境/opt/Xilinx/10.1/ISE。 警告:Xst:1293 - FF / Latch str_0 块中的常量值为0 。这个FF / Latch将是 在优化期间修剪 过程
警告:Xst:1896 - 由于其他原因 FF / Latch修整,FF / Latch str_1 块中的常量值为0 。这个FF / Latch将是 在优化期间修剪 处理。
警告:Xst:1896 - 由于其他原因 FF / Latch修整,FF / Latch str_2 块中的常量值为0 。这个FF / Latch将是 在优化期间修剪 过程
答案 0 :(得分:6)
$ sformat任务不太可能是可综合的 - 考虑编译器需要生成哪些硬件来实现这个功能!这意味着您的'str'寄存器永远不会更新,因此编译器认为它可以优化它。考虑一个BCD计数器,可能还有一个查找表,用于将BCD代码转换为ASCII代码。
AFAIK'初始'块不可合成。要初始化触发器,请使用复位信号。记忆需要像你一样的'for'循环,但只有在重置后才会触发。