首页 > 代码库 > 卷积器设计笔记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] + 16‘d32767;21 state <= ram_write;22 end23 default: state <= ram_idle;24 endcase 25 end
后来将赋值和运算分两个状态后,数据少了一个延时,但是还是将之前的一个数据计算进去了。又在夏宇闻书中看到用非阻塞赋值是先存到一个隐藏的寄存器里,待下一个时钟来到输出,既第一次计算还是上一次存储的数据,所以我将RAM和ROM的地址做了下缓存之后再给出,结果就正确了。
1 ram_write: begin 2 if (ad_clk_pos) 3 begin 4 RAM_ADDR_W <= count1; 5 ram_wr <= 1‘b1; 6 da_data_ <= 32‘d0; 7 count4 <= 16‘d0; 8 ROM_count <= 5‘d0; 9 ram_output_data <= 16‘d0;10 rom_output_data <= 16‘d0; 11 ram_data <= ad_data - 16‘d32767;12 state <= ram_count;13 end14 end15 ram_count: begin16 if (count1 == 16‘d31) begin 17 count2 <= count1;18 count3 <= count1;19 count1 <= 16‘d0;20 end21 else begin22 count2 <= count1;23 count3 <= count1; 24 count1 <= count1 + 16‘d1; 25 end26 // RAM_ADDR_R <= count2;27 // ROM_ADDR <= ROM_count; 28 state <= ram_WR_END;29 end30 ram_WR_END: begin31 ram_wr <= 1‘b0;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 <= 16‘d0;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 - 16‘d1;70 end71 ROM_count <= ROM_count + 5‘d1;72 state <= ram_read;73 end74 state_data_output: begin75 da_data <= da_data_[31:16] + 16‘d32767;76 state <= ram_write;77 end78 default: state <= ram_idle;79 endcase 80 end
此图是我改进之后的仿真信号图:
在这几天的调试过程中,遇到了很多小的问题,导致仿真出来的结果和自己预想的总是差了点,发现自己对verilog了解的太少了,还停留在C语言的调试状态下。
卷积器设计笔记2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。