首页 > 代码库 > 卷积器设计笔记2

卷积器设计笔记2

经过几天的调试终于有结果了,但是程序还有待优化。调试发现还是基础比较薄弱没有好好的看书,感觉还是要把夏宇闻的书好好看下。在夏宇闻书中写到:“若在同一个时钟的正跳沿下对寄存器组既进行输入又进行输出,很有可能由于门的延迟使输入条件还未确定时,就输出了下一个状态,这种情况会导致逻辑的紊乱。而利用上一个时钟为下一个时钟创造触发条件的方式是安全可靠的。在实际电路的实现中,采取了许多有效的措施来确保成立:1.全局时钟网络布线时尽量使各分支的时钟一致。2.采用平衡树结构,在每一级加入缓冲器,使达到每个触发器时钟端的时钟同步。”

我的程序中的ram_read的状态中,既对ram_output_data和rom_output_data赋值,又对其进行运算,导致数据有个延时。

 1                 ram_read: begin     2                         if (ROM_count <= count3)    begin         3                             RAM_ADDR_R <= count2; 4                             ROM_ADDR <= ROM_count; 5                             ram_output_data <= ram_output; 6                             rom_output_data <= rom_output; 7                             da_data_ <= ram_output_data * rom_output_data + da_data_; 8                             if (count2 == 0) begin 9                                 10                             end11                             else begin12                                 count2 <= count2 - 1;13                             end14                             ROM_count <= ROM_count + 1;15                             state <= ram_read;16                         end17                         else state <= state_data_output;18                     end19                 state_data_output: begin20                         da_data <= da_data_[31:16] + 16d32767;21                         state <= ram_write;22                     end23                 default: state <= ram_idle;24             endcase        25     end    
之前的ram_read的状态

后来将赋值和运算分两个状态后,数据少了一个延时,但是还是将之前的一个数据计算进去了。又在夏宇闻书中看到用非阻塞赋值是先存到一个隐藏的寄存器里,待下一个时钟来到输出,既第一次计算还是上一次存储的数据,所以我将RAM和ROM的地址做了下缓存之后再给出,结果就正确了。

 1                 ram_write: begin 2                         if (ad_clk_pos) 3                            begin 4                                 RAM_ADDR_W <= count1; 5                                 ram_wr <= 1b1;     6                                 da_data_ <= 32d0;     7                                 count4 <= 16d0; 8                                 ROM_count <= 5d0; 9                                 ram_output_data <= 16d0;10                                 rom_output_data <= 16d0;                            11                                 ram_data <= ad_data - 16d32767;12                                 state <= ram_count;13                             end14                         end15                 ram_count: begin16                             if (count1 == 16d31)    begin                                    17                                 count2 <= count1;18                                 count3 <= count1;19                                 count1 <= 16d0;20                             end21                             else    begin22                                 count2 <= count1;23                                 count3 <= count1;                                    24                                 count1 <= count1 + 16d1;                                                                        25                             end26 //                            RAM_ADDR_R <= count2;27 //                            ROM_ADDR <= ROM_count;                                                28                             state <= ram_WR_END;29                            end30                 ram_WR_END:    begin31                         ram_wr <= 1b0;32                         state <= ram_wait;33                     end34                 ram_wait: begin35                             RAM_ADDR_R <= count2;36                             ROM_ADDR <= ROM_count;37                             state <= ram_read;38                     end39                 ram_read: begin    40                         if (ROM_count <= count3)    begin    41                                 RAM_ADDR_R <= count2;42                                 ROM_ADDR <= ROM_count;43                                 state <= ram_dddd;44                         end45                         else state <= state_data_output;46                         47                     end48                 ram_dddd: begin49                         if (count4 == 2)    begin50                             count4 <= 16d0;51                             state <= ram_delay;52                         end53                         else    begin54                             count4 <= count4 + 1;55                             state <= ram_dddd;56                         end    57                     end58                 ram_delay:begin59                         ram_output_data <= ram_output;60                         rom_output_data <= rom_output;61                         state <= ram_process;62                     end63                 ram_process:begin64                         da_data_ <= ram_output_data * rom_output_data + da_data_;65                         if (count2 == 0) begin66                             67                         end68                         else begin69                             count2 <= count2 - 16d1;70                         end71                         ROM_count <= ROM_count + 5d1;72                         state <= ram_read;73                     end74                 state_data_output: begin75                         da_data <= da_data_[31:16] + 16d32767;76                         state <= ram_write;77                     end78                 default: state <= ram_idle;79             endcase        80     end    
改进之后的状态机

此图是我改进之后的仿真信号图:

在这几天的调试过程中,遇到了很多小的问题,导致仿真出来的结果和自己预想的总是差了点,发现自己对verilog了解的太少了,还停留在C语言的调试状态下。

卷积器设计笔记2