卷积器设计笔记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                             end
11                             else begin
12                                 count2 <= count2 - 1;
13                             end
14                             ROM_count <= ROM_count + 1;
15                             state <= ram_read;
16                         end
17                         else state <= state_data_output;
18                     end
19                 state_data_output: begin
20                         da_data <= da_data_[31:16] + 16‘d32767;
21                         state <= ram_write;
22                     end
23                 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 <= 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                             end
14                         end
15                 ram_count: begin
16                             if (count1 == 16‘d31)    begin
17                                 count2 <= count1;
18                                 count3 <= count1;
19                                 count1 <= 16‘d0;
20                             end
21                             else    begin
22                                 count2 <= count1;
23                                 count3 <= count1;
24                                 count1 <= count1 + 16‘d1;
25                             end
26 //                            RAM_ADDR_R <= count2;
27 //                            ROM_ADDR <= ROM_count;
28                             state <= ram_WR_END;
29                            end
30                 ram_WR_END:    begin
31                         ram_wr <= 1‘b0;
32                         state <= ram_wait;
33                     end
34                 ram_wait: begin
35                             RAM_ADDR_R <= count2;
36                             ROM_ADDR <= ROM_count;
37                             state <= ram_read;
38                     end
39                 ram_read: begin
40                         if (ROM_count <= count3)    begin
41                                 RAM_ADDR_R <= count2;
42                                 ROM_ADDR <= ROM_count;
43                                 state <= ram_dddd;
44                         end
45                         else state <= state_data_output;
46
47                     end
48                 ram_dddd: begin
49                         if (count4 == 2)    begin
50                             count4 <= 16‘d0;
51                             state <= ram_delay;
52                         end
53                         else    begin
54                             count4 <= count4 + 1;
55                             state <= ram_dddd;
56                         end
57                     end
58                 ram_delay:begin
59                         ram_output_data <= ram_output;
60                         rom_output_data <= rom_output;
61                         state <= ram_process;
62                     end
63                 ram_process:begin
64                         da_data_ <= ram_output_data * rom_output_data + da_data_;
65                         if (count2 == 0) begin
66
67                         end
68                         else begin
69                             count2 <= count2 - 16‘d1;
70                         end
71                         ROM_count <= ROM_count + 5‘d1;
72                         state <= ram_read;
73                     end
74                 state_data_output: begin
75                         da_data <= da_data_[31:16] + 16‘d32767;
76                         state <= ram_write;
77                     end
78                 default: state <= ram_idle;
79             endcase
80     end    

改进之后的状态机

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

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

时间: 2024-10-20 10:35:31

卷积器设计笔记2的相关文章

AMD加载器实现笔记(二)

AMD加载器实现笔记(一)中,我们实现了一个简易的模块加载器.但到目前为止这个加载器还并不能称为AMD加载器,原因很简单,我们还不支持AMD规范中的config配置.这篇文章中我们来添加对config的中baseUrl和packages的支持.API设计如下: 1 require.config({ 2 baseUrl: "./", 3 packages: [{ 4 name: "more", 5 location: "./more" 6 }, {

cocos2d-x与着色器设计--入门篇(游云凌天原创)

http://blog.csdn.net/danjinxiangsi/article/details/43949955 着色器(Shader)应用与计算机图形学领域,指一组提供计算机图形资源在渲染时执行的指令. 随着手机应用以及移动端游戏这几年的发展,着色器设计凭借着自身的灵活性以及适应性,越来越多的被移动端开发者所接受. 本人在App Store上发布了一个原创免费开源无广告的关于着色器的教育型软件,以研究着色器在移动端的设计为目的. 可惜由于时间匆忙,并没有做中文的本地化.所以将写几篇博客,

毕业设计——基于STM32的音乐播放器设计(一)

基于STM32的音乐播放器设计, 源代码下载地址:http://download.csdn.net/detail/cxp2205455256/8334021      SD卡文件下载地址:http://download.csdn.net/detail/cxp2205455256/8334089 电路图下载地址:文件太大了,上传不了....... 以下是截图: 1.硬件电路 2.软件主界面 3.音乐播放器界面 4.音乐定时播放界面 5.音乐列表界面 6.日历功能界面 9.温度功能界面 10.计算器

深入浅出面向对象分析与设计笔记

1.在搜索匹配时注意大小写问题. 2.别为了解决旧问题而产生新问题. 3.使用enum的好处:使用enum的方法或类会受到它的保护,不会有未定义的enum的值.因此不会有打错字或拼错字,对任何具有标准范围或合法值的东西都能避免取得坏数据. 4.任何时候看到重复程序代码,就找个地方进行封装. 5.委托: 6.Java匿名内部类是一种特殊的继承方式,既可以扩展类,也可以实现接口,但是不能两者兼备,而且若实现接口也只能实现一个接口.由于其没有名字,因此不会有命名构造器,但可以实例初始化.如果定义一个匿

CNN卷积神经网络学习笔记2:网络结构

在上篇笔记<CNN卷积神经网络学习笔记1:背景介绍>中已经介绍过CNN的结构,这篇笔记中,通过一个简单的CNN的例子,梳理一下CNN的网络结构的细节. 以下是一个6层的CNN网络,这个简单的CNN网络是DeepLearning Toolbox里面CNN的一个例子,后面要通过DeepLearning Toolbox中CNN的代码来进一步理解CNN的整个过程.我们输入的是1张大小为28*28的图片. 需要注意的有: 1,这里输入的是一张图片,如果我们输入了50张图片,那么下图中的每一个方框(代表一

spring事务管理器设计思想(一)

首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 1.堆栈中存储值类型 2.堆栈实际上是向下填充,即由高内存地址指向低内存地址填充 3.堆栈的工作方式是先分配内存的变量后释放(先进后出原则) 4.堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突 5.堆栈的性能非常高,但是对于所有的变量来说还不灵活,而且变量的生命周期必须嵌套. 6.通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内

CNN卷积神经网络学习笔记3:权值更新公式推导

在上篇<CNN卷积神经网络学习笔记2:网络结构>中,已经介绍了CNN的网络结构的详细构成,我们已经可以初始化一个自己的CNN网络了,接下来就是要用训练得到一个确定的CNN的模型,也就是确定CNN的参数. CNN本质上就是人工神经网络的一种,只是在前几层的处理上有所不同,我们可以把卷积核看成是人工神经网络里的权值W,而采样层实质上也是一种卷积运算.所以可以基于人工神经网络的权值更新的方法来推导CNN里的权值更新公式.人工神经网络里是用反向传播算法将误差层层回传,利用梯度下降法更新每一层的权值,C

AOP框架Dora.Interception 3.0 [3]: 拦截器设计

对于所有的AOP框架来说,多个拦截器最终会应用到某个方法上.这些拦截器按照指定的顺序构成一个管道,管道的另一端就是针对目标方法的调用.从设计角度来将,拦截器和中间件本质是一样的,那么我们可以按照类似的模式来设计拦截器. 一.InvocationContext 我们为整个拦截器管道定义了一个统一的执行上下文,并将其命名为InvocationContext.如下面的代码片段所示,我们可以利用InvocationContext对象得到方法调用上下文的相关信息,其中包括两个方法(定义在接口和实现类型),

Android 高级UI设计笔记12:ImageSwitcher图片切换器

1. ImageSwitcher ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果...,颇有感觉啊.做相册一绝 2. 重要方法 setImageURI(Uri uri):设置图片地址 setImageResource(int resid):设置图片资源库 setImageDrawable(Drawable drawable):绘制图片 3. 设置动画效果 imageSwitcher.setInAnimation(AnimationUtils.loadAni